Pic c İleri geri motor hız kontrolü

zfer

Üye
Katılım
23 Kas 2008
Mesajlar
63
Puanları
1
Yaş
39
Merhaba arkadaşlar,

Bir motoru h köprü devresi ile hız kontrolü yapmak istiyorum. kodeunu yazdım. devreyi oluşturdum. ama bir türlü çalıştıramıyorum. bir yerde hatam var ama nerede bilmiyorum.
kod pic c de yazdım.
portb.0 a basıldığında ileri
portb.1 a basıldığında geri dönecek
ikisinin de hızı tek bir pot yardımı ile ayarlanabilecek.

Kod:
#include <16f876a.h>#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 
#use delay (clock=4000000)


#use fast_io(a) //Port yönlendirme komutları B portu için geçerli
#use fast_io(c)
#use fast_io(c)
#define out PIN_C2
unsigned int32  an2;




void main() 
{ 
   setup_timer_2(T2_DIV_BY_16, 124, 1);  // 500 Hz  
   setup_CCP1(CCP_PWM);           
   setup_CCP2(CCP_PWM);    
   
   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog 
while (true)
{
   if (input (pin_b0)==1)
   {
   set_adc_channel(0); 
   delay_us(20);
   an2=read_adc();
   set_pwm1_duty(an2);
   set_pwm2_duty(0);
   }
   else if (input (pin_b1)==1)
   {
    set_adc_channel(0); 
   delay_us(20);
   an2=read_adc();
   set_pwm1_duty(0);
   set_pwm2_duty(an2);
   }
   else
   {
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   }
}
}
 
CCS C ye giriş çıkışlarıyla ben atacağım demişsiniz.
Ayrıca abc yapmayı unutmuşsunuz sanırım.

#use fast_io(a) //Port yönlendirme komutları B portu için geçerli#use fast_io(c)#use fast_io(c)
Bu kodu kullandıktan sonra set_tris_b(0X03);
gibi giriş çıkışları atamanız lazımdı. (portA portb ve portc için) Belki sorun ordadır , kolay gelsin. Lütfen geri bildirim yapınız.
 
jgl8w.jpg


similasyonu bu

Kod:
#include <16f876a.h>#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)


#use fast_io(a)
#use fast_io(b)
#use fast_io(c)


void main()
{
   unsigned int32  an2;
 
   setup_timer_2(T2_DIV_BY_16, 124, 1);  // 500 Hz
   setup_CCP1(CCP_PWM);         
   setup_CCP2(CCP_PWM);  
 
   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog
   set_tris_b(0xff);
   set_tris_c(0x00);
   set_tris_a(0xff);
   output_low(PIN_c0);
 
while (true)
{
   if (input (pin_b0)==1)
   {
   set_adc_channel(0);
   delay_us(20);
   an2=read_adc();
   set_pwm1_duty(an2);
   set_pwm2_duty(0);
   output_low(PIN_c0);
   }
   else if (input (pin_b1)==1)
   {
    set_adc_channel(0);
   delay_us(20);
   an2=read_adc();
   set_pwm1_duty(0);
   set_pwm2_duty(an2);
   output_low(PIN_c0);
   }
    else
   {
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   setup_adc( ADC_OFF );
   output_high(PIN_c0);
   }
 
 
}
}

Kodu denedim ama osilaskop sinyalinde küçük küçük sinyaller çıkartıyor. her iki pwm çıkışı da. bir diğeri butona bir defa basılabiliyor. yani iki butondan herhangi birine basılmamışsa en son komutta takılı kalıyor.
 
Motoru direk picle sürmüyorusun di mi sadece simulasyon için bu?
 
tabiki hayır :) h köprü mosfet devresi var onun önünde. similasyonda takılıyordu ben de çıkarttım.
 
İstedigin kodu MicroC ile yazabilirim bu arada simulasyonunda h köprüsü ve pot yok. Pot pwm darbe genişligini ayarlar butonlarda yönü ayarlar. Ama dedigim gibi Micro C ile yazabilirim.
 
Sonradan üzerine ilaveler yapmam gerekiyor. o yüzden bildiğim kod sistemi olursa daha iyi olur. teşekkürler yinede.
 
Ben her projede bir tane led kullanıoyrum. Çok işimi görüyor. Size de tavsiye ederim. Bir kere ledi baslangıcta yakarım , bu demek oluyor proje çalişioyor.
Sonra ledi projemde istediğim satırlarda yakarım , bu da demek oluyor ki sistem o satıra gidiyor.

İf li cümlelerin arasına delay_ms(200); gibi bir komut koyar mısınız.
20us yede bir PWM duty cycle la yeni bir değer atamanızdan dolayı PWM sürekli yeniden başlatılıyor ve bir dalga göremiyor olabilirsiniz.

kolay gelsin..
 

Yeni mesajlar

Forum istatistikleri

Konular
128,172
Mesajlar
915,632
Kullanıcılar
449,936
Son üye
AsilOzgenc

Yeni konular

Geri
Üst