Deine geforderten Eckdaten sind mit einem ATMEGA8 noch machbar.
Die Servos werden dabei sequenziell angesteuert.
Der Timer 1 Steuert dann über die Interrupts Comp1a und Comp1b die zugehörigen Ausgänge.
Comp1a bearbeitet dabei die ersten 3 Ausgänge Comp1b die zweiten 3Kanäle.
Das geht so:
Zu COMP1A wird mit dem Wert für Servo 1 dazugerechnet und in COMP1A abgelegt.
Der Ausgang 1 wird aktiviert.
Tritt dieser Interrupt dann auf wird Ausgang1 Abgeschaltet und Ausgang2 aktiviert, sowie der COMP1A der Wert für Servo 2 zuaddiert. Dadurch bekommt man dann einen Impuls mit der gewünschten Länge auf Ausgang 1 zustande.
Kommt dann dieser Interrupt wird Ausgang2 abgeschaltet und Ausgang3 aktiviert, wieder die Impulsdauer für Ausgang3 zum Comparematch zuaddieren.
Wenn man mag kann man jetzt noch die Restzeit auf 6ms mit allen Ausgängen abgeschaltet abwarten, bis ein neuer Zyklus beginnt.
Der Comparematch 1B mach im Prinzip genau das gleiche mit den Ausgängen 4 bis 6.
Die gewünschten Servoimpulslängen kann man in einem Array ablegen, die Interruptroutinen bedienen sich dann aus diesem Array.
Bei Beschreiben des Arrays sollte man kurz die Interrupts blockieren ( mit "CLI" ) , damit nicht gerade während eines Schreibvorganges ein Comparematch Interrupt auftritt.
Überläufe sind auch kein Problem, wenn man unsigned int als Zahlenformat verwendet, da ja auch der TCNT1 bei einem Überlauf wieder mit 0 beginnt.
Die Lösung arbeitet im Prinzip in den Comparematch Interrupts des Timers 1.
Ich arbeite da gerne mit einem 8MHz Quarz und einem Timer Prescaler von 8, weil dann die Impulszeit direkt in Mikrosekunden in die Comparematches eingetragen werden kann.
Im Hauptprogramm kann man dann in " aller Ruhe " die benötigten Impulszeiten berechnen.
Zeitmässig sollte das auch kein Problem machen, da immerhin 4000 Taktzyklen vergehen ( bei 2 * 1ms Impulszeit ) bis erneut ein Interrupt auftritt. Fließkommaberechnungen oder höhere mathematische Funktionen würd ich aber lassen.
Lesezeichen