-
-
Erfahrener Benutzer
Robotik Einstein
Mein Vorschlag wäre den Timer 1 mit einem Taktteiler von 8 bei einem 8MHz Quarz zu verwenden.
Das gibt dann eine Auflösung von 1µs pro Zählerstand - TCNT1.
Mit dem OCR1A ( 1...2ms ) kann man dann die Pulsweite einstellen mit dem OCR1B die Zykluszeit ( 20ms / 2(Kanäle) = 10ms ).
Das Ein- und Ausschalten der entsprechenden Ports wird in den OCR Interrupts erledigt. Im OCR1B Interrupt wird das TCNT Register auf 0 gesetzt um einen neuen Zyklus zu starten.
Das zu bearbeitende Servo wird in der OCR1B Routine hochgezählt und der entsprechende Ausgang eingeschaltet. Gleichzeitig wird die Impulsdauer aus dem Speicher für den zu bearbeitenden Kanal in das OCR1A geschrieben.
Die OCR1A Routine schaltet dann den entsprechenden Ausgang einfach wieder ab.
Das Ganze Spielchen kann dann durch ein paar Zeilen Code in den beiden Interruptroutinen am Laufen gehalten werden.
Eine Erweiterung auf mehr Kanäle ist durch Anpassung der Zykluszeit OCR1B und den Überlauf des Kanalzählers leicht zu erreichen.
Wenn man nicht über eine Zykuszeit von 20ms kommen will sind 8..9 Kanäle möglich. OCR1B muss immer größer sein als OCR1A !!!
Da der Zähler ja mit µs Impulsen läuft ist auch die Berechnung der Impulslängen kein Hexenwerk, ein Zählerstand von 1500 entspricht somit 1,5ms = Servomitte. Man hat also zwischen dem minimalwert 1000 und dem maximalwert von 2000 - 1000 Stufen. So genau geht kein Servo.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen