esc (electronic speed controller) pic ile çalıştırmak istiyorum yardım.

Başlatan ecunnu, 19 Ekim 2011, 20:11:15

ecunnu

merhaba arkadaşlar elimde hobbyking marka 30A lik bir esc ve 28 amperlik bir fırçasız doğru akım motoru var ben bu motoru pic ile kontrol etmek istiyorum fakat aklıma takılan bir soru var
esc ye yollayacağım pwm sinyalinin frekansı ne olmalı bu konuda bir bilgisi olan varsa yardımlarını rica ediyorumm....

MILKBOY

bahsettiğin olayı birkaç ay önce gerçekleştirdim. kullanacağın  frekans servo motorunki ile aynı. dolayısı ile proton basic gibi bir dil kullanıyorsan direk olarak servo komutunu kullanabilirsin .

Servo PortB.0 , 1500 gibi bir değer yazdığında tam proteus denemelerime göre tam %50 çalışıyor  1500 yerine 1000 yazarsan %0. 2000 yazarsan %100

ecunnu

verdiğin bilgiler için teşekkür ederim şu anda esc yi sürmüş durumdayım pwm frekansı için 50hz kullandım %5 pwm sinyalinden sonra bitane beep sesi geliyor ve motor harekete geçiyor escye %14 pwm uyguladığımda fırçasız motor tam hızına ulaşmış oluyor bu arada ben ccs c dilini kullanıyorum pic olarakta 16f877 kullandım
ben 50hz de sürdüm fakat escnin özelliklerinde pwm frekansı 8k olarak gözüküyor acaba benim için 8k lık bir pwm sinyali kullanmak faydalı olurmu??aşağıdaki linkte kullandığım esc var
http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=15205

MILKBOY

Buna benzer bir esc yi PWM ile çalıştırmak için
500 us - 1     2000us - 0 verdiğimde hız = 0

2500 us -  1  2000us - 0 verdiğimde hız max

olmuştu. ama pic16f877 nin sadece2 adet dahili PWM' i olması gerek. CCS de mutlaka servo kütüphanesi vardır onu kullanırsan rahat edersin ..

eğer servo kütüphanesini bulamazsan aşağıdakine benzer bir kod ile çok kanallı pwm elde edebilirsin.

void RGB_ON(unsigned char tR,unsigned char tG, unsigned char tB){
unsigned char a;
unsigned int i;

for(a=0;a<25;a++){
for(i=1;i<=255;i++){  // 255 adımda 3 ayri PWM isaret uret
   if(i<=tR)RLED=1;
   if(i>tR)RLED=0;

   if(i<=tG)GLED=1;
   if(i>tG)GLED=0;
   
   if(i<=tB)BLED=1;
   if(i>tB)BLED=0;

   DelayUs(10);
}}}


ecunnu

ben aşadaki kodla 4 tane escyi sürdüm proteustan ölçtüğüm kadarı ile 55hz civalarında bir pwm sinyali veriyor c0 ve c1 pinine bağladığım butonlar sayesinde pwm sinyalini artırıp azalta biliyorum ve ayrıca yüzde kaç pwm sinyali olduğunu lcd de yazdırıyorum pwm üretmek içinde timer0 birimini kullandım bu algoritma geliştirilerek istediğin kadar servo bile sürebilirsin.

"500 us - 1     2000us - 0 verdiğimde hız = 0

2500 us -  1  2000us - 0 verdiğimde hız max "

demişsin ama bole yaparsan değişik frekanslarda pwm yollamış olurum escye tabiki nasıl bir sonuç verecek bilemem  bide senin dediğin gibi denerim bakalım ne olacak sağolasın ilgilendiğin için...

#include <16f877A.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use fast_io(b)
#define use_portb_lcd TRUE
#include <lcd.c>

int i=2,pwm=0,duty_0=0,duty_1=0,duty_2=0,duty_3=0;


#int_timer0
void kesme()
{
   set_timer0(230);
   if (pwm==0)
   {
      output_high(pin_a0);
      output_high(pin_a1);
      output_high(pin_a2);
      output_high(pin_a3);
   }
   if (pwm>=duty_0)output_low(pin_a0);
   if (pwm>=duty_1)output_low(pin_a1);
   if (pwm>=duty_2)output_low(pin_a2);
   if (pwm>=duty_3)output_low(pin_a3);
   
   
   
   pwm++;
   if(pwm>=100) pwm=0;
 
   
   
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
   
   set_tris_b(0x00);
   lcd_init();
   
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
   set_timer0(230);
   enable_interrupts(int_timer0);
   enable_interrupts(global);
   output_a(0b00000);
   while(1)
   {
     
     
      if (input(pin_c0))
     {
      i++;
      printf(lcd_putc,"\f     i=%d",i );
      delay_ms(200);
      while(input(pin_c0))
         {
         output_high(pin_a5);
         }
      output_low(pin_a5);
      if (i>100) i=100;
     }
      if (input(pin_c1))
     {
      i--;
      printf(lcd_putc,"\f     i=%d",i );
      delay_ms(100);
      while(input(pin_c1))
         {
         output_high(pin_a5);
         }
      output_low(pin_a5);
      if (i<2) i=2;
     }
     duty_0=i;
     duty_1=i;
     duty_2=i;
     duty_3=i;
     
   
   
     
   }


}

cakiroglu54

Merhaba,

Şu linkteki yazı işine yarayabilir, zamanında blogumda paylaşmıştım...

http://www.hakancakiroglu.com/wordpress/?p=24

İyi Çalışmalar...