Mal langsam: PWM macht man ja gerne mit Hardware - es wird ein Timersignal auf einen Controllerpin gesteuert. Wenn man mit "wenigen HW-PWM-Pins viele Servos ansteuern" möchte, dann hat man mehrere Software-Servo-Ansteuerungen. Fazit: ich habe das gleich "ohne PWM" gemacht und steuere dabei 10 (zehn) Servos an, mit gleicher Genauigkeit könnte ich bequem auch 18 oder 20 Servos ansteuern.
Stichwort (Stichwörter): TIMER1_COMPA_vect und TIMER1_COMPB_vect.
Erklärung:
Die ISR TIMER1_COMPA_vect läuft mit 1/10 der Servoperiode und immer mit gleichbleibendem OCR1A-Wert, also gleicher Länge; bei Dir wären das dann nur 1/8. Diese ISR startet die Zeit für die TIMER1_COMPB_vect-ISR und knippst einen Servo an. Der zuständige Servopointer wird mit einem rundlaufenden Zeiger bestimmt, die Länge der COMPB_vect-ISR, sprich OCR1B, wird ebenfalls mit diesem rundlaufenden Zeiger bestimmt, dieser Wert variiert je nach Servo und Deinen Wünschen. Sobald die entsprechende Zeit, sprich OCR1B, abgelaufen ist, wird durch die COMPB_vect-ISR der entsprechende Pinn abgeschaltet. Danach kommt natürlich wieder der Timer1 zu seinem Interrupt und die Geschichte beginnt mit dem nächsten Zeiger genauso. Das Ganze funktioniert sauber und quarzgenau (wenn man die Servo-ISRs nicht mit etlichen anderen Interrupts ausbremst). Einschränkung: OCR1A muss IMMER größer als OCR1B bleiben - plus der Zeiten für die Overhead-Aktionen der ISR.
Ist Dir das klar? Ausführungen dazu gibts noch im oben erwähnten Link - und auch auf Nachfrage.
Nachtrag: meinen Code gibts dazu hier (klick).
Lesezeichen