Servo-Ansteuerung durch Conrad C-Control V1.1 mittels PWM oder Timer-Compare-Interrupt
--------------------------------------------------------------------------------------

M.Piering, 01/2022...02/2022

Disclaimer:
Die Erarbeitung der vorliegenden Arbeitsergebnisse erfolgte nach bestem Wissen und Gewissen.
Trotzdem knnen eventuelle Schden durch den Nutzer dieser Informationen und Software nicht ausgeschlossen werden.
Keine bernahme der Verantwortung fr Schden jeglicher Art durch den Author.

Die Informationen und die Dateien knnen frei fr die Gemeinschaft genutzt und -gemeinsam und vollstndig- weitergegeben werden.
Keine, wie auch immer geartete, kommerzielle Nutzung als auch Nutzung in sicherheitsrelevanten bzw. medizinischen Anwendungen erlaubt.

Dank an B. Kainka ("C-Control Hardware-Erweiterungen") und Mario Boller-Olfert fr entsprechende Vorlagen.

Anwendung:
PWM-Signale fr Servos mit einer Pulsdauer von (1...2)ms [(0.7...2.3)ms fr einen mglichen erweiterten Bereich, vgl. B.Kanika "C-Conrol Hardware-Erweiterungen"]
lassen sich bei der C-Control V1.1 ber Assembler-Routinen erzeugen. Der Aufruf dieser Routinen zur Steuerung der Servos erfolgt bisher aufwendig im CCBASIC-
Hauptprogramm. Das mag fr eine diskrete Ansteuerung von herkmmlichen Servos ausreichen. Bei einer Nutzung von modifizierten, freilaufenden Servos,
z.B. als Antrieb fr einen kleinen Roboter, wird diese Art der Ansteuerung schnell mhevoll und im CCBASIC-Hauptprogramm unbersichtlich.

Besser wre es doch, wenn die Servos ber automatisch generierte PWM-Signale angesprochen werden knnten. Die Erzeugung der fr die Servos notwendigen PWM-
Signale soll die CControl-Hardware bernehmen. Das CCBASIC-Hauptprogramm soll sich nur noch um die Nutzung der Servos, also das Generieren von bestimmten
Bewegungsablufen, kmmern knnen.

Im Weiteren wird beschrieben, wie Servos ber die bestehenden PWM-Ausgnge PLMA/PLMB bzw. an frei definierbaren Digital-Ports angesprochen werden knnen.
Die notwendigen PWM-Signale werden dabei entweder ber die PWM (D/A)-Ausgnge der C-Control bzw. ber TCMP1- oder TCMP2-Interrupts generiert.

Die vorgestellten drei Mglichkeiten der Generierung von PWM-Signalen fr Servos bergen verschiedene Vor- und Nachteile.

Die relativ einfache, bersichtliche Ansteuerung von zwei Servos ber die PWM-Ausgnge PLMA/PLMB der CC1 ist nur im PWM-Slow-Modus (nicht zu verwechseln mit
dem Slow-Modus der CC1) mglich, was eine kurze Maschinenroutine zur entsprechenden Konfiguration der PLMA/PLMB-Ausgnge erfordert, da dieser SLow-Modus der
PWM vom OS der C-Control 1 nicht untersttzt wird. Klare Nachteile sind die Kontrolle von maximal zwei Servos (je ein servo an PLMA und PLMB) und die relativ
grobe Schrittweite der justierbaren Pulsbreite in Vielfachen von 32 Mikrosekunden, was der notwendigen Einstellung des PWM-Slow Modus geschuldet ist.
Auch trifft die Wiederholfrequenz der PWM im SLow-Modus mit ca. 122Hz nicht den bei Servos typischen Wert von 50Hz, was aber unkritisch ist.
Bei Servos an den Anschlssen PLMA/PLMB der C-Control 1 lassen sich relativ einfach grob-gestufte Positionen oder Bewegungsablufe, mit freilaufenden Servos
annehmbare Vorwrts- bzw- Rckwrtsbewegungen unterschiedlicher Geschwindigkeiten, erreichen. Ein eventuell notwendiger Feinabgleich von unterschiedlichen Laufeigenschaften beider Servos lsst sich allerdings schwerlich realisieren.

Wesentlich weichere Bewegungsablufe bzw. fein-gerasterte Positionen lassen sich bei Servos erzielen, die, an digitalen Ausgangsports der CC1 angeschlossen,
ber PWM-Signale kontrolliert werden, welche durch interruptgesteuerte Maschinenprogramme erzeugt werden.
Weitere Vorteile sind:
- Pulsbreite justierbar in Vielfachen von 2 Mikrosekunden,
- die Wiederholfrequenz der erzeugten PWM wird auf 25Hz (TCMP2, alle 20ms) bzw. 50Hz (TCMP1, alle 10ms) pro Servostrang reduziert; die Lsung mittels TCMP1-
  Interrupt trifft fr beide Servo-Strnge den typ. Wert von 50Hz Wiederholfrequenz der Servo-PWM.
- je nach Auslegung der Maschinen-Programme und Belegung der Digital-Ports lassen sich mehr Servos gleichzeitig ansprechen --> die vorliegenden Routinen
  ermglichen die separate Ansprache von zwei Servos (=zwei Strnge); die Anzahl der Servos pro Strang kann vervielfacht werden, so dass z.B eine Anwendung
  "Laufkfer" unter Einsatz von 2x3 Servos mglich wre; das erfordert allerdings eine Modifikation der vorliegenden Assembler- und CCBASSIC-Programme,
- auch frei laufende Servos lassen sich komfortabel als Fahrmotoren eines Roboters ansteuern; eine Feinabstimmung der Drehzahl beider Servos sollte machbar sein.

Nachteile dieser Lsung sind der erhhte Programmieraufwand an entsprechenden Assembler-Routinen sowie, durch die Nutzung von Interrupts,
ein gewisser Eingriff in das Betriebssystem der C-Control 1.

Hardware:
- Conrad C-Control V1.1 Main-Unit (getestet auf Starterboard); sollte auch mit M-Unit funktionieren; bei der Station wird es aufgrund der Kapazitten an 
  den Digitalports Probleme geben,
- nicht-modifiziertes Modellbau-Servo, z. B. Modelcraft ES-05 JR fr Ansteuerung ber einen Bereich von typ. 110 (versuchsweise 180)
- Joy-it Com-Motor Mini Continuous Servo, Pollin Bestell-Nummer 820570
- separates 6V/1A Schaltnetzteil zur Versorgung der Servos

Dateien:
- "lies_mich.txt", diese Datei

fr Servo-Ansteuerung via PLMA/PLMB
-----------------------------------
- "PWMSlow.ASM", Assembler-Programm zum Konfigurieren der PWM-Ausgnge PLMA und PLMB auf "Slow" (fosc/32768),
- "PWMSlow.lst", Listing des Assemblerprogramms; der im Listing kommentierte Maschinencode wird ber den CCBASIC auf den Stack ab Adresse $91 geladen und
  mittels SYS-Befehl ausgefhrt,
- "TestPWM_Rev0_3.bas", CCBASIC-Programm (Demo) zur Ansteuerung zweier nicht-modifizierter Servos ber die PWM (D/A)-Ausgnge PLMA und PLMB; abwechselnde Hin/Her-
  Bewegung der beiden Servos ber den typischen Bewegungsbereich von ca. 110
- "PWMFahrt_Rev0_1.bas", CCBASIC-Programm (Demo) zur Simulation einer Roboterfahrt bei Nutzung freilaufender (modifizierter) Servos ber die PWM-Ausgnge PLMA
  und PLMB

fr Servo-Ansteuerung via TCMP2-Interrupt
-----------------------------------------
- "SERVINT5.ASM", Assembler-Programm zur getrennten, abwechselnden PWM-Ansteuerung von zwei Servos (Anschluss: Siehe Beschaltung) alle 20ms ber den TCMP2-Interrupt
- "SERVINT5.s19", assemblierte Routine im S19-Format zum einbinden in CCBASIC-Programm,
- "SERVLAD2.ASM", Assembler-Programm zum Einbinden der PWM-Routine in TCMP-Interrupt,
- "SERVLAD2.lst", Listing des Assemblerprogramms; der im Listing kommentierte Maschinencode wird ber den CCBASIC auf den Stack ab Adresse $91 geladen und
  mittels SYS-Befehl ausgefhrt,
- "Servotest_0_2_3.BAS", CCBASIC-Programm (Demo) zur Ansteuerung zweier nicht-modifizierter Servos ber TCMP2-Interrupt; abwechselnde Hin/Her-Bewegung der beiden
  Servos ber den typischen Bewegungsbereich von ca. 110
- "TCMP2Fahrt_0_2.BAS", CCBASIC-Programm (Demo) zur Simulation einer Roboterfahrt bei Nutzung freilaufender (modifizierter) Servos ber TCMP2-Interrupt

fr Servo-Ansteuerung via TCMP1-Interrupt
-----------------------------------------
- "SERVINT8.ASM", Assembler-Programm zur getrennten, abwechselnden PWM-Ansteuerung von zwei Servos (Anschluss: Siehe Beschaltung) alle 10ms ber den TCMP1-Interrupt
- "SERVINT8.s19", assemblierte Routine im S19-Format zum einbinden in CCBASIC-Programm,
- "SERVLAD2.ASM", Assembler-Programm zum Einbinden der PWM-Routine in TCMP-Interrupt,
- "SERVLAD2.lst", Listing des Assemblerprogramms; der im Listing kommentierte Maschinencode wird ber den CCBASIC auf den Stack ab Adresse $91 geladen und
  mittels SYS-Befehl ausgefhrt,
- "SERVLAD4.ASM", Assembler-Programm zum Einstellen der Periodendauer des TCMP1-Aufrufs; bedient sich des OS der CC1, um den TCMP1-Interrupt alle 10ms aufrufen
  zu lassen,
- "SERVLAD4.lst", Listing des Assemblerprogramms; der im Listing kommentierte Maschinencode wird ber den CCBASIC auf den Stack ab Adresse $91 geladen und
  mittels SYS-Befehl ausgefhrt,
- "Servotest_0_4_2.BAS", CCBASIC-Programm (Demo) zur Ansteuerung zweier nicht-modifizierter Servos ber TCMP1-Interrupt; abwechselnde Hin/Her-Bewegung der beiden
  Servos ber den typischen Bewegungsbereich von ca. 110

Beschaltung:
fr Servo-Ansteuerung via PLMA/PLMB
-----------------------------------
- Servo-"VCC" (rotes Kabel) an 6V Versorgung eines separaten Schaltnetzteils mit ausreichender Leistung,
- Servo-"GND" (schwarzes Kabel) an Masse des Separaten Schaltnetzteils und an Masse Versorgung der C-Control 1,
- Servo "PWM" (gelbes oder oranges Kabel) an PLMA (fr Servo0) bzw. an PLMB (fr Servo1) der C-Control 1 (Achtung! Conrad-Doku der CCBasic-Unit ist fehlerhaft.
  Richtig mu es heien: Steckbuchse2, Kontakt 17: D/A-Wandler 1 (PLMA), Steckbuchse 2, Kontakt 16: D/A-Wandler 2 (PLMB)).

fr Servo-Ansteuerung via TCMP1 bzw. TCMP2-Interrupt
----------------------------------------------------
- Servo-"VCC" (rotes Kabel) an 6V Versorgung eines separaten Schaltnetzteils mit ausreichender Leistung,
- Servo-"GND" (schwarzes Kabel) an Masse des Separaten Schaltnetzteils und an Masse Versorgung der C-Control 1,
- Servo "PWM" (gelbes oder oranges Kabel) an Digital-Port 1 (fr Servo0) bzw. an Digital-Port 2 (fr Servo1) der C-Control 1.

Hinweis: Zu Versuchszwecken wurde ein Servo, statt ber ein separates Schaltnetzteil, ber die durch das Starterboard bereitgestellte 6.5V Versorgungsspannung
(Anschlsse J33 bis J40 des Starterboards, siehe Seite 11 der Conrad-Dokumentation zum C-Control 1 Starterboard) gespeist. Der Betrieb eines zweiten Servos an
dieser Versorgung berfhrt allerdings den vorgeschaltenen Spannungsregler auf dem Starterboard und fhrt zu Fehlverhalten der Servos. Auerdem werden die Servos
auerhalb des spezifizierten Spannungsbereichs betrieben.

Funktionsweise:
fr Servo-Ansteuerung via PLMA/PLMB
-----------------------------------
- PWM-Wiederholfrequenz (bei PWM "SLow" Mode): 		~122Hz (T = 8.192ms) fr PLMA und PLMB
- kleinste Pulsbreite, Schrittweite:			32us
- Servo Max-Links-Position (1ms):			32 (32*32us = ~1ms)
- Servo Mitte-Position (1.5ms):				47 (47*32us = ~1.5ms)
- Servo Max-Rechts-Position (2ms):			62 (62*32us = ~2ms)
Bei einem angenommenen typ. Schwenkbereich des Servos von 110 und die 30Schritte lsst sich theoretisch die Servo-Position in 3.7 Schritten anfahren.

fr Servo-Ansteuerung via TCMP2
-----------------------------------
- PWM-Wiederholfrequenz: 				25Hz (T = 40ms) fr beide Servostrnge, da abwechselnd alle 20ms das jeweils andere Servo bedient wird
- kleinste Pulsbreite, Schrittweite:			4us (ber TCMP2-Interrupt-Routine)
- Servo Max-Links-Position (1ms):			0 (1ms + 0*4us = 1ms); 1ms Puls wird fest erzeugt
- Servo Mitte-Position (1.5ms):				125 (1ms + 125*4us = 1.5ms)
- Servo Max-Rechts-Position (2ms):			250 (1ms + 250*4us = 2ms)
Bei einem angenommenen typ. Schwenkbereich des Servos von 110 und die 250Schritte lsst sich theoretisch die Servo-Position in 0.44 Schritten anfahren.

fr Servo-Ansteuerung via TCMP1
-----------------------------------
- PWM-Wiederholfrequenz: 				50Hz (T = 20ms) fr beide Servostrnge, da abwechselnd alle 10ms das jeweils andere Servo bedient wird
- kleinste Pulsbreite, Schrittweite:			4us (ber TCMP2-Interrupt-Routine)
- Servo Max-Links-Position (1ms):			0 (1ms + 0*4us = 1ms); 1ms Puls wird fest erzeugt
- Servo Mitte-Position (1.5ms):				125 (1ms + 125*4us = 1.5ms)
- Servo Max-Rechts-Position (2ms):			250 (1ms + 250*4us = 2ms)
Bei einem angenommenen typ. Schwenkbereich des Servos von 110 und die 250Schritte lsst sich theoretisch die Servo-Position in 0.44 Schritten anfahren.

Weitere Ideen:
Der Antrieb kleiner Roboter mittels freilaufender, PWM-gesteuerter Servos sollte hiermit mglich sein. Auch der Bau eines "Ultraschall-Scanners" unter Nutzung
eines US-Moduls zur Entfernungsmessung und eines nicht-modifizierten Servos zu diskreten Positionierung wre nun mglich, um grob die Topologie der Umgebung eines
Roboters zu ermitteln.

Rckmeldung erwnscht unter mak.kleist@gmx.de.
