Dc motoru Pot ile sürme

Başlatan hpburak, 08 Ağustos 2014, 16:19:39

hpburak

Dc motoru Pot ile sürmek için ugraşıyorum ama çözemediğim birçok yer mevcut.Kod yazarken sıkıntı çekiyorum.Yardımcı olabilecek var mı :/

hpburak

#1
yazdığım kodda bu, bu işde yeniyim. Ete Abi yardımlarını bekliyorum :/

#include <16f819.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=1000000)
#use fast_io(a)
#use fast_io(b)

unsigned long int pot_digital;

void main ( )
{
   set_tris_a(0xFF);  // A portu komple giriş
   set_tris_b(0x00);  // B portu komple çıkış

   output_a(0x00);    // A portu çıkışını sıfırla

   setup_adc(adc_clock_INTERNAL);   // ADC clock frekansı=fadc
   setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog
   
   setup_ccp1(CCP_PWM);  // CCP1 birimi PWM çıkışı için ayarlandı
   setup_timer_2(T2_DIV_BY_16,1020,1); // Timer2 ayarları yapılıyor
 
while(1)
{
   set_adc_channel(2);   // RA2--AN2 ucundaki sinyal A/D işlemine tabi tutulacak
   pot_digital=read_adc();
   delay_us(300);
   
   set_pwm1_duty(pot_digital); // PWM1 çıkışı görev saykılı belirleniyor
   delay_us(500);
}
}

hpburak

Isıs de misss gibi çalışıyor.Ama devre kartımda çalışmıyor. Anladığım kadarıyla Pwm üretiminde sıkıntım var. B portunda Adc yapıyorum oluyor ve digital bilgiyi elde ediyorum amaa pwm digital bilgiyi kabul etmiyor, anladığım kadarıyla. 00....01 görüyorum ama pwm bu istemiyor, desimal istiyor. Bunu nasıl yapabilirim :( Yardııııım

ete

#3
Maalesef C dilinde yardımcı olamıyorum. Yapılacak iş son derece basit aslında.
HPWM modülünü 10Khz için ayarlayacaksın. 10Mhz kristal frekansında 10Khz lik sinyalin maksimum Duty değeri 625 olacaktır.
O halde pot dan okunan 0-1023 arası değer sana 0-625 arası ir değer vermelidir.
Bunun için 625/1024= 0,610  sana sabit çarpan değerini verecektir.
ADC den okuduğun değeri 0,610 ile çarparsan sana duty değerini verecek olup bunu duty değeri olarak kullanıp PWM sinyalini ayarlayacaksın. Hepsi bu.
Bu arada 10Khz ik HPM sinyali için bölme oranı 1/16 olacak ve PR2=155 değerini alacaktır.

Ete

hpburak

#include <16f819.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=10000000)
#use fast_io(a)
#use fast_io(b)

unsigned long int pot_digital;
float pot;


void main ( )
{
   set_tris_a(0xFF);  // A portu komple giriş
   set_tris_b(0x00);  // B portu komple çıkış

   output_a(0x00);    // A portu çıkışını sıfırla

   setup_adc(adc_clock_INTERNAL);   // ADC clock frekansı=fadc
   setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog
   
   setup_ccp1(CCP_PWM);  // CCP1 birimi PWM çıkışı için ayarlandı
   setup_timer_2(T2_DIV_BY_16,155,1); // Timer2 ayarları yapılıyor

while(1)
{
   set_adc_channel(2);   // RA2--AN2 ucundaki sinyal A/D işlemine tabi tutulacak
   pot=read_adc();
   pot_digital=pot*0.610;
   delay_us(30);
   set_pwm1_duty(pot_digital); // PWM1 çıkışı görev saykılı belirleniyor
   delay_us(50);


}
}
   

Şekline getirdim, maalesef yine çalışmadı..Ete abi çok sağolasın, sen C 'de yardım olamasanda biri çıkar yardım eder inşallah.
Adc 'yi çok net birşekilde yaptıgım halde Pwm'i neden o portta göremiyorum hala anlamış değilim..
   

hpburak

Yazılımda bir hatamın olduğunu düşünüyorum, mümkün olduğunca araştırcam ve öğrencem

hpburak

Ete Abi ve diğerleri merhaba,
Dc motoru pot ile sürmeyi ccs de yazmak yerine picbasic'de yazmaya karar verdim. İnternette hazır kod buldum. Sizin onayınızdan geçtikten sonra testini yapmayı düşünüyorum.  16f819 sıkıntı bir entegre oldugunu ögrendim ve bunun için 12f683 'de yapmaya karar verdim. 12f683 ile mosfet sürcem. Isıs ve kodları göndercem. Zahmet olmazsa hatalarımın nerde olduğunu birlikte çözebilir miyiz?




kodu:

@ device pic12f683, fcmen_off, ieso_off, intrc_osc, wdt_off
@ device pic12f683, pwrt_on, mclr_off, protect_off

GPIO = %00000000 ' All outputs low
CMCON0 = 7 ' Comparators off
TRISIO = %00000001 ' Set GP0 in and Rest Out 0=Output
ANSEL = %00000001 'Set PORTGPIO.0 analog rest digital
'WPU=%00110000 ' Pull-ups on for GPIO.4 & 5 inputs
'OPTION_REG.7=0 ' Enable internal pull-ups

' Define ADCIN parameters
Define   ADC_BITS   10   ' Set number of bits in result
Define   ADC_CLOCK   3   ' Set clock source (3=rc)
Define   ADC_SAMPLEUS   50   ' Set sampling time in uS
Define CCP1_REG GPIO 'PWM Output on gpio
Define CCP1_BIT 2 'Bit 2

adval   Var   Word ' Create adval to store result
Pause 100

loop:
ADCIN 0, adval    ' Read channel AN0 to adval

HPWM 1,adval,500 ' PWM between 0-1024 , 500Hz on GP2

Pause 100

Goto loop    ' Do it forever

End


kod ile şimdilik pot ile pwm ayarlanacak.
Teşekkürler, Saygılar

ete

Hpwm komutundaki duty cycle değeri 0-255 arasında değer alan bir parametredir. Senin programda 0-1023 arası değer alıyor bu yanlış. Doğrusu içinya adc değerini 4 e bölmen yada Adc okumayı10 bit yerine 8 bit yapmalısın.
Başka bir hata görmedim. Şemada fren fonksiyonuda mevcut ama programda ona ait bir komut yok.

Ete

ete

10 Bit adc ve 10 bit Duty çözünürlüğü ile bu işin yapılması en güzelidir.
Aşağıdaki program elindeki şemaya uygun olup bu işi yapmaktadır.

Ete

@ DEVICE Pic12F683                                                     
@ DEVICE Pic12F683, WDT_ON             
@ DEVICE Pic12F683, PWRT_ON             
@ DEVICE Pic12F683, PROTECT_OFF         
@ DEVICE Pic12F683, MCLR_OFF           
@ DEVICE Pic12F683, INTRC_OSC_NOCLKOUT

DEFINE OSC 4
OSCCON=%01100001
CMCON0 = 7
DEFINE ADC_BITS 10   
DEFINE ADC_CLOCK 1   
DEFINE ADC_SAMPLEUS 30

OPTION_REG=%00000001  'BÖLÜCÜ 1/4 AYARLANDI
GPIO=0
TRISIO=%00000001
ANSEL = %01110001
WPU=0
ADCON0=%10000000

HAM VAR WORD
DUTY VAR WORD
X    var word

PR2=249 'max Duty=1000 olacak %50 için 500 oluyor.
T2CON=%00000101  'bu işlmecide PWM Timer2 ile çalışıyor.
CCP1CON.1=0
CCP1CON.2=1
CCP1CON.3=1
PAUSE 300

BASLA:
       ADCIN 0,HAM
       DUTY= (ham+1)*/250
       PAUSE 100
       IF X=DUTY THEN BASLA
       X=DUTY
       CCP1CON.4=X.0
       CCP1CON.5=X.1
       CCPR1L=x>>2
       
       goto basla


hpburak

Ete Abi çok sağolasın. Sizin gibi insanlara ihtiyaçımız var. Çıkar ilişkisi gözetmeksizin yardım ediyorsunuz. Fren butonu da eklemem lazım.  İkinci şemada gösterdiğim üzere butona bastığımızda üsteki mosfet (2.mosfet yani) yük üzerinden endüklenen enerjiyi attırmayı planlıyorum. Bu sayede fren görevi yaptırcam :) Butona bastığımızda mosfet üzerinden enerjiyi yemesi lazım. Ama kaç saniye mosfet anahtarlama yaparak üzerindeki enerjiyi atar bilemiyorum. Şöyle yapsam yeterli olur mu acaba? 5 saniyede üzerindeki enerjiyi yiyeceği düşünürsek, butona bir kere bastığımızda 5 saniye boyunca mosfeti tetiklersek fren yapmış olabilir miyiz. Birde 12f683 entegresinde port a , port b olayını anlayamıyorum. Butonu şemadaki gibi eklersem GP1 ucu port a mı oluyor. Yani basit bir led yakma işlemi gibi mi yapmalıyım. Kodumuz nasıl olabilmelidir? Bu entegre için kafam karıştı.
Herşey için teşekkürler :)

ete

Fren işlemi için 5sn çok bile. Yaklaşık 2 sn hadi bilemedin 3 sn de bu iş tamamlanır. Ama butona basıldığı zaman önce HPWM sinyali kapatılmalı ve ardından ikinci mosfet tetiklenmelidir.
Benim verdiğim programda şunları yapman gerekiyor.
TRISIO=%00000011  'GPIO.1 e buton bağlanacağı için onu da giriş yaptık.
WPU=%00000010  'buton pinindeki pullup direncini aktif yaptık
BAsla satırından itibaren olan değişiklikler aşağıdaki gibi olacak,
BASLA:
       ADCIN 0,HAM
       DUTY= (ham+1)*/250
       PAUSE 100
       IF X=DUTY THEN BASLA
       X=DUTY
       CCP1CON.4=X.0
       CCP1CON.5=X.1
       CCPR1L=x>>2
       IF GPIO.1=0 THEN
          X=0
          CCP1CON.4=X.0
          CCP1CON.5=X.1
          CCPR1L=x>>2
          CCP1CON=0  'hpwm KAPATILDI
          GPIO.5=1  'FREN PİNİ AKTİF EDİLDİ
          PAUSE 3000
          WHILE GPIO.1=0:WEND
       ENDIF
       GOTO BASLA


Ete


hpburak

#11
DEFINE OSC 4
OSCCON=%01100001
CMCON0 = 7
DEFINE ADC_BITS 10   
DEFINE ADC_CLOCK 1   
DEFINE ADC_SAMPLEUS 30

OPTION_REG=%00000001  'BÖLÜCÜ 1/4 AYARLANDI
GPIO=0
TRISIO=%00000011  'GPIO.1 e buton bağlanacağı için onu da giriş yaptık.
ANSEL = %01110001
WPU=%00000010  'buton pinindeki pullup direncini aktif yaptık
ADCON0=%10000000

HAM VAR WORD
DUTY VAR WORD
X    var word

PR2=249 'max Duty=1000 olacak %50 için 500 oluyor.
T2CON=%00000101  'bu işlmecide PWM Timer2 ile çalışıyor.
CCP1CON.1=0
CCP1CON.2=1
CCP1CON.3=1
PAUSE 300

BASLA:
       ADCIN 0,HAM
       DUTY= (ham+1)*/250
       PAUSE 100
       IF X=DUTY THEN BASLA
       X=DUTY
       CCP1CON.4=X.0
       CCP1CON.5=X.1
       CCPR1L=x>>2
       IF GPIO.1=0 THEN
          X=0
          CCP1CON.4=X.0
          CCP1CON.5=X.1
          CCPR1L=x>>2
          CCP1CON=0  'hpwm KAPATILDI
          GPIO.5=1  'FREN PİNİ AKTİF EDİLDİ
          PAUSE 3000
          WHILE GPIO.1=0:WEND
       ENDIF
GOTO BASLA




şekline dönüştürdüm çalıştı :)

hpburak

yasadışı işlem kodu diyor :(

hpburak

tamamdr. Kodlardaki hataları buldum sıkıntı yok :)

hpburak

Benim aklımda bir soru işareti daha oluştu. Ben devremde mosfet'i motora seri bir şekilde bağladım. Ama tetiklemeyi motorun uyartımına vermeyi düşünüyordum. Şimdi seri bağlayınca uyartımımı pic'in beslemesinden verip, hep uyartım halinde mi bıraksam ne olur? Uyartımım hep olsa motora sıkıntı yaratır mı? Yoksa onada ayrı bir kod yazıp pic'ten beslesem mi?

Powered by EzPortal