|
Wir programmieren die Ansteuerung eines Servomotors mit
AVISE4.3
|
AVISE4.3 hat schon einen Pulsweitenmodulator PWM1 vorgesehen, wobei je nach Eingabewerten der TIMER1 als 8-bit-Timer oder 10-bit -Timer verwendet wird. Der zweite Pulsweitenmodulator PWM2 verwendet den TIMER2 (8-bit-Timer ). Für die Robotik braucht man aber mindestens zwei symmetrische PWMs, weil mindestens zwei identische Motoren, links und rechts, angetrieben werden sollen. Deshalb empfiehlt es sich mit AVISE zwei weitere PWMs zu definieren. PWMA ersetzt dann PWM1, PWMB nutzt ebenfalls den TIMER1. Das geschieht folgendermaßen:
Ansteuerung der Servomotore mit Pulsweitenmodulation:
(Alle Zahlen und Adressen hexadezimal! Die Port-Bezeichnungen beziehen sich auf den ATMEGA32; für den ATMEGA168 / ATMEGA8 muss D4 durch B2, D5 durch B1 ersetzt werden.)
Ein Wort PWMA für den TIMER1A soll definiert werden, das folgendermaßen angewendet wird:
hiphas vtnr PWMA
Die Vorteilernummer vtnr soll die Grundfrequenz des PWM festlegen. Bei vtnr = 3 (Vorteiler also 64) z.B. ergibt sich eine Grundfrequenz von ( 4 MHz / 1023 ) / 64 = 61,1 Hz. Der Pulsweitenmodulator soll als 10-bit-Modulator betrieben werden, d.h. in zeitbestimmende Register soll als höchster Wert 3FF geschrieben werden können. Der Parameter hiphas soll den Anteil der Hi-Phase innerhalb einer Periode bestimmen. Der prozentuale Anteil der Hi-Phase soll also hiphas/1023 sein.
Laut Datenblatt der ATMEGA8 / 168 / 32 wird zur Programmierung des PWM die vtnr in das Register 4E (Adresse 4E) geschrieben, dann in das Output-Compare-Register (ein Doppelregister) OCR1AL (4A) und OCR1AH (4B) hiphas (L für Lo-Byte, H für Hi-Byte). Dies muss aber byteweise geschehen, so dass hiphas zuvor in Hi-Byte und Lo-Byte aufgespalten werden muss.
Zuvor wird die Betriebsart definiert, indem im Register TCCR1A (Adresse 4F) die Bits 7, 1 und 0 gesetzt werden. Wegen 83(16) = 1000 0011(2) geschieht das, unabhängig von den momentanen Werten, indem der Inhalt von 4F mit 83 oderiert wird. Die einzelnen Bits haben folgende Funktion:
Bit 7 gesetzt: Setze das Ausgangssignal OC1A/OC1B auf 0, wenn der Zähler
den Wert des Output-Compare-Registers erreicht.
Bits 1,0 gesetzt: legt Betriebsart und Wellenform fest: Betriebsart
3: PWM, Phase Correct, 10 bit Auflösung.
Ganz entsprechend für TIMER1B.
$ : PWMA 5 31 BSET 4E WB 4F RB 83 OR 4F WB DUP 4A WB 8 >> 4B WB RET
$ : PWMB 4 31 BSET 4E WB 4F RB 23 OR 4F WB DUP 48 WB 8 >> 49 WB RET
Mit 31 RB 20 OR 31 WB wird allein Port D5 auf Ausgang geschaltet (mit 31 RD 10 OR 31 WB Port D4). Das geht eben auch mit 5 31 BSET bzw. 4 31 BSET oder auch mit D5 OL (D4 OL). (Datenrichtungsregister DDRD mit Adresse $ 31).
Entgegen der Wortbeschreibung für WR kann in ein Doppelregister wie 4a/4b doch ein 2-Byte-Wort in einem Schritt mit WR geschrieben werden. Dann geht auch:
$ : PWMA 5 31 BSET 4E WB 4F RB 83 OR 4F WB 4A WR RET
$ : PWMB 4 31 BSET 4E WB 4F RB 23 OR 4F WB 48 WR RET
Bei unveränderter Grundfrequenz braucht bei Änderungen des Tastverhältnisses nur der Wert im Output-Compare-Register überschrieben werden. Das könnte z.B. geschehen mit dem Wort
: NHIA DUP 4A WB 8 >> 4B WB RET
bzw.
: NHIB DUP 48 WB 8 >> 49 WB RET
Offenbar geht aber auch
: NHIA 4A WR RET
Bei der Grundfrequenz 61,1 Hz beträgt die Periodendauer ca. 16,4 ms. Servomotoren stehen still bei einer Hi-Phase von 1,5 ms. Das wird in etwa erreicht, wenn die Hi-Phase den Bruchteil 1,5/16,4 = 0,09146 (Tastverhältnis) von 1023 umfasst, also 93 oder 94 bzw. hexadezimal 5D oder 5E. Die Grundfrequenz 489 Hz mit einer Periodendauer von 2,04 ms erlaubt möglicherweise eine etwas genauere Einstellung des Stillstands. Dann muss vtnr = 2 gewählt werden. Die Hi-Phase sollte dann den Bruchteil 1,5/2,04 = 0,734 von 1023 umfassen, also hexadezimal ca. 2F0.
Schäden werden bei sachgemäßem Umgang nicht erwartet.
Dennoch wird keinerlei Haftung übernommen, z.B. bzgl. Gefährdung
der Prozessoren, der PCs und vor allem der mit dem System experimentierenden
Personen.
Ein Haftungsausschluss von Herrn Schemmert wird hier einkopiert:
|
(zuletzt aktualisiert 2013)