Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

rc servo motor sorunu

Başlatan toprak0258, 28 Aralık 2012, 15:31:05

toprak0258

merhabalar....
biliyorum bugunlerde cok soru soruyorum....ama bazı konularda takılıyorum gunlerce ugrasıyorum cozemıyorum bazen bır arkadasın soyledıgıyle 5 dakıkada cozuyorum...ben sımdı ccs c dılınde servo konrolu yapmaya calısıyorum....yaptıgım program soyledır....
#include <16f628A.h>     
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT

#use delay (clock=4000000)
const int8 servo_derece_1[]={8,9,10,11,12,13,14,15,16,17,18};
const int8 servo_derece_2[]={14,15,16,17,18,8,9,10,11,12,13};
const int8 servo_derece_3[]={18,17,16,15,14,13,12,11,10,9,8};

int i=0,pwm=0,duty_0=0,duty_1=0,duty_2=0;
int16 zaman=0;

#int_timer0 
void kesme ()
{
   set_timer0(113); 
   if (pwm==0)       
   {
      output_high(pin_b0);
      output_high(pin_b1);
      output_high(pin_b2);
   }

   if (pwm>=duty_0) output_low(pin_b0);
   if (pwm>=duty_1) output_low(pin_b1);
   if (pwm>=duty_2) output_low(pin_b2);

   zaman++;

 
   if (zaman>3400)
   {
      zaman=0;
      i++;     
      if(i==11)
         i=0;   
   }

   pwm++;       
   if (pwm>=34)
      pwm=0;   
}

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
   set_timer0(113);

   enable_interrupts(int_timer0);
   enable_interrupts(global);     

   output_b(0x00); 

   while(1) 
   {
      duty_0=servo_derece_1;
      duty_1=servo_derece_2;
      duty_2=servo_derece_3;
   }
}
...........sanırım ya pwm degerlerının hesablarında sorun yasıyorum yada zaman degerlerını hesaplamada sorun yasıyorum ...bu konuda acıklayıcı tarzda bılgı alabılecegımı dusunuyorum...
selamlar......


   
Bilgi paylaşıldıkca değer kazanır.

ertsen

Program Serdar ÇİÇEĞİN kitabından. ilk servo denememi bu hafta yaptım. Başlangıçta bende zorluk çektim. Ben kod hakkında bişey söyleyemem ancak Servolar 50 Hz de çalışıyor yani 20 ms periyotla sinyal göndermen gerekiyor. sinyalin pozitif kenarı 1 ms ise tam sol 2 ms ise tam sağ yapıyor. Galiba bu forumdada linki olan bir programla Timer süresini ayarladım ve 50 hz'i bulunca program çalıştı. Programın adı: PIC timer calculator.

toprak0258

merhabalar.....
Dediğin örneği inceledim orada hem 877 kullanmıs hemde orada 20mhz kulanmıs ama bendekı osc ler 4mhz dır ..ayrıca orada servolar benım ıstedığım gıbı degıl ben daha farkılıhareket etmek ıstıyorum..önceden bu konuları pbp ıle yaptım sorun cıkarmadan calıstırabıldım ama sımdı ccs c de sorun yasıyorum....
selamlar...
Bilgi paylaşıldıkca değer kazanır.

ertsen

Dediğim programı inceledinmi? Programında alt alta
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);

kullanmışsın.

Bence; 4 Mhz için,

   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);
   set_timer0(45536);

olarak ayarlarsan 50Hz yi bulursun.
[IMG]http://img515.imageshack.us/img515/9963/timer.jpg[/img]




aykerme

main içerisinde duty değişkenleri int tipte olmasına rağmen adres değeri atamışsınız. bu şekilde kullanım yanlış olacaktır. sanırım dizinin elemanlarından birini atamaya çalışıyorsunuz.  Sanırım set_pwm1_duty gibi fonksiyonlar vardı. onları kulanmak işinizi oldukça kolaylaştırabilir.

yldzelektronik

set_tris_b ile portu çıkış olarak yönlendirmeyi deneyin sorununuzun tam olarak ne olduğundan bahsetse idiniz daha iyi olurdu selametle...
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.