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
}
}
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?
o da 20mhz kristal de 20mhz