-
-
Erfahrener Benutzer
Robotik Visionär
20msec sind zwar 50Hz, aber es war ja wohl schon spät.
@Vitis Wenn man keine Ahnung von der Regelung hat und man rasch ein Ergebnis braucht gleich mit Ringpuffer, lineare regression und Regelkreise zu beginnen halte ich für etwas gewagt, auch wenn es für professionelle Anwendung der richtige Weg sein mag.
Hubert
-
Erfahrener Benutzer
Robotik Einstein
Ich würd die Servoroutine mit Comparematch A und Comparematch B machen.
Comparematchinterrupt A schaltet nach 20 ms (10ms) einen Ausgang auf high = Pause zwischen 2 Impulsen. Im Comparematch A werden dann auch gleich die neuen Werte für die Pulsbreite (1...2ms) an das Comparematch B Register übergeben.
Die Werte für die Pulsbreite (Comparematch B) werden zum Inhalt des Comparematch A Registers dazuaddiert.
Comparematchinterrupt B schaltet 1....2ms später den Ausgang wieder auf low, setzt den Timer (TCNT 1) auf 0 und startet eine neue Werte Ermittlung (nur Flag setzen Werteermittlung erfolgt im Hauptprogramm).
Das Hauptprogramm hat somit 20ms (10ms) Zeit um die Werte für einen neuen Zyklus zu Berechnen das sind 80.000 Takte (~Befehle) bei 4MHz. Und da lässt sich schon was draus machen.
Der Vorteil der Methode ist, das allein durch Verändern des Comparematch A Wertes die Zykluszeit beliebig verändert werden kann.
Wenn Du einen 8MHz Quarz einsetzt und den Prescaler des Timers 1 auf /8 setzt kannst Du die Comparematchwerte direkt in µS in die entsprechenden Register eingeben - ist doch praktisch - oder?
Nur zur Info - ein Modellbauservo braucht positive Impulse von 1ms....2ms für minimal bis maximal Ausschlag. Die Pausezeit zwischen 2 Impulsen beträgt üblicherweise 20ms - aber das wusstest Du vermutlich schon.
Der A/D Wandler braucht auch ein wenig Zeit um eine Wandlung durchzuführen. Zweckmäßigerweise würde ich deshalb eine neue Wandlung im Comparematch A Interrupt starten.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen