11 Temmuz 2020, 22:17:11

Haberler:

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


PIC ile Servo motor

Başlatan burakelectronics, 20 Haziran 2020, 18:25:07

burakelectronics

20 Haziran 2020, 18:25:07 Son düzenlenme: 20 Haziran 2020, 18:28:04 burakelectronics
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.




#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]={10000200003000040000};  // 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]!=&& yon[i]==1)
               
dereceler[i]--;
         else if(
dereceler[i]==&& 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
   
}

}

RaMu

Alıntı yapılan: burakelectronics - 20 Haziran 2020, 18: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?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

burakelectronics