Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: burakelectronics - 20 Haziran 2020, 15:25:07

Başlık: PIC ile Servo motor
Gönderen: burakelectronics - 20 Haziran 2020, 15:25:07
Merhabalar. Şu uygulama ile ilgili yardım isteyecektim. CCS C ile Pic16f877a ile proteusta 4lü servo motor simülasyonu yapıyorum. Yapmak istediğim program; 1.motor 1 snde bir, 2.motor 2snde bir, 3.motor 3snde bir, 4.motor 4snde bir dönecek ve motorlar -90dan +90a 10ar derecelik adımlar ile gidip gelecek. timer1 kullanıyorum. çalışma frekansı 20mhz. Motorların kontrol pulseları 1m-2.8m olarak ayarlı. Sorun şu gecikmeleri kesme süresine göre yani 100us x 10000 = 1s oluyor ama 1.motor yaklasık 2.5 snde bir dönüyor 1snde bir dönmesi gerekirken.


(https://i.ibb.co/jf2fxQq/devreservo.png) (https://ibb.co/jf2fxQq)

#include <servo3.h>

#use fast_io(b)   // b portu kullanılıyor

#define servo_1 pin_b0
#define servo_2 pin_b1
#define servo_3 pin_b2
#define servo_4 pin_b3

unsigned int16 derece_sayac[4]={0};
unsigned int8  dereceler[4]={0};
unsigned int8  yon[4]={0};
unsigned int8  i=0;

unsigned int16 servo_periyot[4]={0};
unsigned int16 servo_sure[4]={10000, 20000, 30000, 40000};  // 100us x 10000=1s x20000=2s x30000=3s x40000=4s

#int_TIMER1
void  TIMER1_isr(void)
{
   set_timer1(65036);   // overflow 100us

   for(i=0;i<4;i++)
   {
      servo_periyot[i]++;
      derece_sayac[i]++;
   }
   
   for(i=0;i<4;i++)
   {
      if(servo_periyot[i]==servo_sure[i])
      {
         servo_periyot[i]=0;
         
         if(dereceler[i]!=18 && yon[i]==0)
            dereceler[i]++;
         else if (dereceler[i]==18 && yon[i]==0)
            yon[i]=1;
           
         if(dereceler[i]!=0 && yon[i]==1)
               dereceler[i]--;
         else if(dereceler[i]==0 && yon[i]==1)
            yon[i]=0;
   
      }
   }
   
   //1ms = 10 x 100us
   for(i=0;i<4;i++)
   {
      if(derece_sayac[i]<dereceler[i]+10)
      {
         if(i==0)
            output_high(servo_1);
         if(i==1)
            output_high(servo_2);
         if(i==2)
            output_high(servo_3);
         if(i==3)
            output_high(servo_4);
      }
      else
      {
         if(i==0)
            output_low(servo_1);
         if(i==1)
            output_low(servo_2);
         if(i==2)
            output_low(servo_3);
         if(i==3)
            output_low(servo_4);
       
       if(derece_sayac[i]==200)
            derece_sayac[i]=0;
      }
   }
}



void main()
{
   
   set_tris_b(0x00); // b portu çıkış olarak ayarlanıyor
   output_b(0x00);   // b portu çıkışları sıfırlanıyor
 
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);      //100 us overflow

   set_timer1(65036);   // overflow 100us

   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      //TODO: User Code
   }

}
Başlık: Ynt: PIC ile Servo motor
Gönderen: RaMu - 20 Haziran 2020, 23:38:21
Alıntı yapılan: burakelectronics - 20 Haziran 2020, 15:25:07... çalışma frekansı 20mhz.
...
ama 1.motor yaklasık 2.5 snde bir dönüyor 1snde bir dönmesi gerekirken.
Simulasyonda simulasyon durdurulmuşken picin üzerine çift tıkladığında
cpu clock frequency
yazan hanedeki frekans ne?
Başlık: Ynt: PIC ile Servo motor
Gönderen: burakelectronics - 21 Haziran 2020, 00:32:09
o da 20mhz kristal de 20mhz