PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo-routine mit wenig overhead ; 4µs Auflosung ; 12 Servos



RP6conrad
07.10.2008, 22:18
Meine heutige ansteuring von servos mit die 10 kHz timer von RP6 controlboard hat als nachteil die grobe Auflosung (Immer Schritten von 100µs, den gesamte Servoweg hat dan ca 12 pos) habe ich weiter gesucht und auch eine Losung gefunden :
Im controlboard ist der 16 bit Timer noch frei. Habe ich einfach eine ISR programmiert mit eine 250kHz counter (prescaler=64), also eine Auflosung von 4µs. In diesen ISR wird dan immer eine Ausgang von Servo hochgesetzt, und auch die Zeit von diesen Servo in OCR1A register geschrieben. Beim naechste Durchgang von ISR wird diese Ausgang dan wieder abgeschaltet, und der naechste Ausgang wird hoch gesetzt. Auch wieder eine neue Zeit in OCR1A register. So wirden alle Servo's die mann brauchst hinter ein ander angesteuert. Beim letzte Durchgang muss dan die Zeit in OCR1A so gesetzt werden, das die ganse Cyclus ca 20 mS dauert.
Forteil : fast keine Overhead von µ, ca 12 Servo's konnen problemlos gesteurt werden mit Auflosung von 4µs (250SchrittenØvon 1 nach 2 mS)




/*
Timer 1 is free for your application!
Prescaler = 64, CTC mode, 4µs resolution
*/
TCCR1A = (0<<WGM10)
|(0<<WGM11)
|(0<<COM1A1)
|(0<<COM1B1);

TCCR1B = (1<<WGM12)
|(0<<CS12)
|(1<<CS11)
|(1<<CS10);
OCR1A = 1000;

// Timer 2 - used for beeper:
TCCR2 = 0;
OCR2 = 0xFF;

// Enable timer interrupts:
TIMSK = (1 << OCIE0)|(1<<OCIE1A);
Timer 1 is used for servo-puls generation
*/
ISR(TIMER1_COMPA_vect)
{
if(servocount==0){PORTC|=IO_PC2;OCR1A=servo1;}
if(servocount==1){PORTC&= ~IO_PC2;PORTC|=IO_PC3;OCR1A=servo2;}
if(servocount==2){PORTC&= ~IO_PC3;PORTC|=IO_PC5;OCR1A=servo3;}
if(servocount==3){PORTC&= ~IO_PC5;PORTC|=IO_PC7;OCR1A=servo4;}
if(servocount==4){PORTC&= ~IO_PC7;OCR1A=250*14;}
servocount++;
if(servocount>4) servocount=0;
}
uint16_t servo1=350;
uint16_t servo2=350;
uint16_t servo3=350;
uint16_t servo4=350;
uint8_t servocount=0;
void servo (uint8_t nummer,uint16_t puls)
{
if (puls<200) puls=200; //beveiliging tegen extreme pulslengte!!
if (puls>550) puls=550; //beveiliging tegen extreme pulslengte!!
if(nummer==1) servo1=puls;
if(nummer==2) servo2=puls;
if(nummer==3) servo3=puls;
if(nummer==4) servo4=puls;
}