Servoansteuerung mit Software PWM und ATmega8(EDIT: neu 644)
Hallo,
Ich hab mir ein Programmm geschrieben welches mir in 20ms abstand ein 1.5ms langes Highsignal ausgiebt. Damit möchte ich meine Servos in die mittelstellung bringen. Das funktioniert auch... irgendwie.
Leider zucken meine Servos unregelmässig und mein Signal verändert sich manchmal von schönen graden Flanken zu schwankenden herabfallenden :-k
Ich glaube am Aufbau liegt es nicht also wollt ich mal sehen ob vieleicht ihr verbesserungsvorschläge zum Code, oder gar eine erklärung habt.
Was vermutlich nicht ideal ist, ist meine Frequenz(des Interupts)
da ich eine Kommazahl in die Konstante Timer schreibe.
Hier ist mein Code:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000
#define timer (256-F_CPU/64/2000)
int ms;
ISR(TIMER0_OVF_vect) //Timer Interrupt Vector
{
TCNT0 = timer; //Interupt auf 2000Hz einstellen (Alle 0.5ms ein Interupt)
ms++;
}
int main(void)
{
//Ports Init
DDRC |= (1<<PORTC3);
//Timer Init
TIMSK |= (1<<TOIE0); //Timerinterrupt freigeben
TCCR0 |= (1<<CS00) | (1<<CS01) | (!(1<<CS02)); //Timer Prescaler = 64
sei(); //Interrupts global aktivieren
//main Schleife
for (;;)
{
if(ms >=40) //Wenn ms grösser gleich 40 (40*0.5=20ms) -->40 ausgelöste Interupts
{
PORTC |= (1<<PORTC3); //Port auf HIGH.
}
{
if(ms >= 43) //Wenn ms grösser gleich 43 (43-40=3*0.5=1.5ms)
{
PORTC &= ~(1<<PORTC3); ms = 0; //Port auf LOW und ms löschen
}
}
}
}
Achja, ich habe den ATmega8 über die Fusebits intern auf 8Mhz gestellt.
und zwar auf 8 Mhz, 6CK, 64ms.
6CK = 6 Cyklen??, 64ms?? kann mir jemand erklären was das bedeutet?