Hallo
Vielleicht etwas offtopic weil nur 8 Servos an einem 8MHz-Mega8:
Code:
ISR(TIMER2_COMP_vect)
{
static uint16_t count=0;
static uint16_t count2=1000;
static uint8_t impuls=0, servo=0;
static uint8_t impuls2=0, servo2=0;
if(!impuls)
{
if(servo == 0) { impuls=vla; servo0_on; }
if(servo == 1) { impuls=vli; servo0_off; servo1_on; }
if(servo == 2) { impuls=hla; servo1_off; servo2_on; }
if(servo == 3) { impuls=hli; servo2_off; servo3_on; }
if(servo == 4) servo3_off;
if(servo < 5) servo++;
} else impuls--;
if(!impuls2)
{
if(servo2 == 4) { impuls2=hra; servo4_on; }
if(servo2 == 5) { impuls2=hri; servo4_off; servo5_on; }
if(servo2 == 6) { impuls2=vra; servo5_off; servo6_on; }
if(servo2 == 7) { impuls2=vri; servo6_off; servo7_on; }
if(servo2 == 8) servo7_off;
if(servo2 < 9) servo2++;
} else impuls2--;
if(count < 2000) count++; else { count=impuls=servo=0; if(p) p--; }
if(count2 < 2000) count2++; else { count2=impuls2=0; servo2=4; }
}
vla bis hri sind die Servopositionen vornelinksaußen bis hintenrechtsinnen. Die defines dazu:
Code:
#define servo0_on PORTC |= (1<<PC1)
#define servo0_off PORTC &= ~(1<<PC1)
#define servo1_on PORTC |= (1<<PC0)
#define servo1_off PORTC &= ~(1<<PC0)
#define servo2_on PORTD |= (1<<PD4)
#define servo2_off PORTD &= ~(1<<PD4)
#define servo3_on PORTD |= (1<<PD5)
#define servo3_off PORTD &= ~(1<<PD5)
#define servo4_on PORTB |= (1<<PB1)
#define servo4_off PORTB &= ~(1<<PB1)
#define servo5_on PORTB |= (1<<PB2)
#define servo5_off PORTB &= ~(1<<PB2)
#define servo6_on PORTB |= (1<<PB4)
#define servo6_off PORTB &= ~(1<<PB4)
#define servo7_on PORTB |= (1<<PB5)
#define servo7_off PORTB &= ~(1<<PB5)
Die ISR wird mit 100kHz aufgerufen ( TIMSK |= (1<<OCIE2); TCCR2 = (1<<WGM21) | (1<<CS20); OCR2 = 80 und die Servos werden nacheinander angesteuert. Bei maximal 2 ms pro Servo mal 8 Servos hat die ISR bei 20 ms Wiederholung noch ca. 4 ms Leerlaufzeit. Ein schnellerer Kontroller (16MHz) mit 200kHz-ISR-Frequenz sollte so genau 20 Servos schaffen. Der Hacken: Ich bin nicht sicher, ob die ISR nicht zu lange ist, ich habe die Ausführungszeit noch nicht berechnet. Bei meinem asuro sieht das dann so aus:
Bild hier
http://www.youtube.com/watch?v=uyojMyb8V0s
Gruß
mic
Lesezeichen