Modellbau Servo

Mit Servo meine ich Stellmotoren aus dem Modellbau bereich. Diese gibt es in verschiedenen Ausführungen, und je nach Größe und Qualität (Plastik- oder Metallzahnräder) liegen sie im Preis zwischen 4 Euro und 70 Euro (Conrad Stand 10/2007). Zum Testen habe ich einen Modellbauservo von der Firma Graupner C577 verwendet. So ein Servo hat einen Stellweg von ca. 180 Grad und man kann ihn in Robotern einsetzen, oder zum Drehen einer Web-CAM benutzen.

servoimpulsDer Servo C577 hat ein dreiadriges Anschlusskabel mit Stecker. Dabei ist braun die Masse (0V) in der Mitte rot die Betriebsspannung (4,8V bis 6V) und orange das Kabel für den Steuerimpuls.
Ein normaler Server (kein Digitaler) wird über einen TTL Impuls mit einer Länge von 1ms bis 2ms angesteuert. Dabei ist 1ms der linke Anschlag und 2ms der rechte Anschlag und theoretisch 1,5ms die Mittelstellung. Diese Werte schwanken aber etwas von Servo zu Servo.
Der Impuls muss sich ca. alle 20ms wiederholen. Bei einer Fernsteuerung im Modellbau werden dann mehrere Impulse für
verschiedene Servos nach einander übertragen. Bei einem Abstand von 20ms könnte man theoretisch 10 Impulse unterbringen. Da aber noch eine kleine Pause für die Synchronisation des Ganzen benötigt wird sind bei diesem Verfahren bis zu 9 Kanälen möglich.
Im Empfänger werden dann die Impulse von einem Demultiplexer wieder getrennt und an die einzelnen Servo’s weitergeleitet, so das der Servo selbst nur einen Impuls im Abstand von 20ms erwartet.

myavr_mit_modellbau_servoZuerst müssen wir den Servo mal anschliessen. Dazu habe ich das myAVR Board wie auf dem Bild Verdrahted. Die beiden Taster für Links und Rechts habe ich mit den Pin 0 und 1 von Port B verbunden. (blaues und schwarzes Patchkabel)
Die Betriebsspannung für den Servo hole ich mir direkt vom myAVR Board mit dem roten und schwarzen Patchkabel, und das gelbe Patchkabel verbindet die Signalleitung (Impulsleitung) mit dem Pin 0 von Port C. Für die Programmierung ist es nun am Einfachsten die fertigen Befehle (Unterprogramme) von BASCOM zu verwenden.

Servo Steuerung myAVR mit BASCOM Servo-Befehl

Download: myavr-servo-servo.zip

' Taktfrequenz des Quarzes einstellen (3,686411 MHz -> 1 Takt=0,00000027127s=0,27127us)
$crystal = 3686411
' Verwendete CPU festlegen (ATmega8)
$regfile = "m8def.dat"
' Pin 0 an Port C als Ausgang für Modellservo
Config Portc.0 = Output
' alle Pin's an Port B als Eingang festlegen
Config Portb = Input
' Interne Pullup Widerstände setzten für Taster
Portb = &H03
 
Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
Enable Interrupts
 
Dim Winkel As Byte
' Etwa auf Mittelstellung setzen
Winkel = 70
Servo(1) = Winkel
 
' Hauptprogrammschleife
Do
 If Pinb.1 = 0 Then
  ' ist Schalter an Pin 2 Port D gedrückt
  If Winkel > 30 Then Decr Winkel
 Elseif Pinb.0 = 0 Then
 ' ist Schalter an Pin 3 Port D gedrückt
  If Winkel < 110 Then Incr Winkel
 End If
 Servo(1) = Winkel
 Waitms 10
Loop
 
End

Servo Steuerung myAVR mit BASCOM über Timer

Download: myavr-servo-timer.zip

' Taktfrequenz des Quarzes einstellen (3,686411 MHz -> 1 Takt=0,00000027127s=0,27127ys)
$crystal = 3686411
' Verwendete CPU festlegen (ATmega8)
$regfile = "m8def.dat"
' alle Pin's an Port C als Ausgang festlegen
Config Portc = Output
' alle Pin's an Port B als Eingang festlegen
Config Portb = Input
' Interne Pullup Widerstände setzten für Taster Pin 0 & 1
Portb = &H03
 
' 65536-56320 = 9216*0.27127us = 2,5ms * 8(Vorteiler) = 20ms
Const Reload = 56320
' 1 Timertakt = 2,17us
Config Timer1 = Timer , Prescale = 8
Timer1 = Reload
On Timer1 Timer1_isr
Enable Timer1
Enable Interrupts
 
Dim Winkel As Word
Winkel = 700
 
' Hauptprogrammschleife
Do
 If Pinb.1 = 0 Then
 ' ist Schalter an Pin 2 Port D gedrückt
  If Winkel > 300 Then Winkel = Winkel - 1                  ' 0,65 ms
 Elseif Pinb.0 = 0 Then
 ' ist Schalter an Pin 3 Port D gedrückt
  If Winkel < 1100 Then Winkel = Winkel + 1                 ' 2,38 ms
 End If
 Waitms 2
Loop
 
End
 
Timer1_isr:
 If Pinc.0 = 1 Then
  ' Pause ca. 20 ms
  Portc.0 = 0
  Timer1 = Reload
 Else
  ' Impuls 0ms bis 2ms
  Portc.0 = 1
  Timer1 = 65536 - Winkel
 End If
Return