18f serisi Servo Kontrol Problemi

Başlatan aladdn07, 17 Eylül 2016, 21:04:04

aladdn07

18f26k22 var elimde timer1 kulanarak 20 adet servo kontrol etmek istiyorum 10usn geçikmeli timer la servo dönmüyor 20usnlik timerla servo dönüyor ancak anlamadıgım şu diyelim 1.5msn 1 beklicek sonra 18.5 sayiye sıfırda beklicek dimi 90 derece olması için hesap basit 1500/20=75 defa tekrar edecek ancak

ama degerler çok farkılı çıkıyor 75 degerini döngüye girdim kitleniyor kalıyor ancak 27 girdimi 90 derece konumuna geliror 54 girdmi -90 10 girdimide +90 gidiyor

daha önce 20 adet servo kontrol edeniniz varmı?

Cemre.

Kod paylaşırsanız daha hızlı çözüme ulaşırsınız. Muhtemelen kesme rutininde çok fazla işlem yapmaya çalışıyorsunuz.

omereliusuk


aladdn07

#include <18F26k22.h> 
#fuses HSM,NOWDT,PUT,NOLVP,NOPLLEN 
#use delay (clock=10M)   
/*
for(i=0;i<50;i++)
{
    output_LOW(PIN_A0); 
    DELAY_MS(17);
    DELAY_uS(500);
  output_HIGH(PIN_A0);
  DELAY_MS(2);
  DELAY_uS(500);
}


for(i=0;i<50;i++)
{
    output_LOW(PIN_A0); 
    DELAY_MS(18);
    DELAY_uS(500);
  output_HIGH(PIN_A0);
  DELAY_uS(1500);
}


for(i=0;i<50;i++)
{
    output_LOW(PIN_A0); 
    DELAY_MS(19);
  DELAY_uS(400);
  output_HIGH(PIN_A0);
  DELAY_uS(600);
   
}
*/
int i=4;
LONG aci[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int32 zaman=1;
//====================================== 
#int_timer1 
void timer1_isr(){ 

if(zaman<aci[0])///20 motor için 20 tane olucak 
  output_HIGH(PIN_A0);
  else
  output_LOW(PIN_A0);    

zaman++;
if(zaman>2000)
{
zaman=0;
}
set_timer1(65511);//10 misro saniyelik gecikme
} 
void main(void) 
{ 
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); 
set_timer1(65511);
 
enable_interrupts(int_timer1); 
enable_interrupts(global); 
setup_adc(ADC_OFF);
SETUP_ADC_PORTS(NO_ANALOGS);
set_tris_A(0x00);

while(1) 
  { 


 
aci[0]=600;// 60*10=600us
delay_ms(1000);

aci[0]=150;//150*10=1500us
delay_ms(1000);  

aci[0]=240;//240*10=2400us 
delay_ms(1000);
  

  }

}
10usn çalışmıyor 20 dedeçalışmıyor 50 ve yuzde 100 çalışıyor ama hesaplarım yanlış çıkıyor hesaplar dogru çıkmıyor yukarıdaki basit kodu
100 usn saniyede çalışıyor 4 veya 5 motoru kontrol ediyom ama yetersiz benim istediğim arduinodaki gibi servo.atach yazıp deger göndericem ama inceledim arduinoda sadece timer1 kulanılıyor kodlar çok karışık oldugundan anlamadım :D