Hallo Freunde.
Ja - ich mal wieder ^^.
Ich sitze noch immer an dem Problem, dass ich mehrere Servos gleichzeitig ansteuern will. Es handelt sich dabei um 2 Servos, die per Tastendruck nichts anderes machen sollen, als von einem Anschlag zum anderen Anschlag zu fahren, beim 2ten Tastendruck dann wieder zurück.
Dazu habe ich ein Testprogramm mit einer weiteren Stellung zum Funktionstest der PWM-Ausgabe erstellt.
Im Single-Modus funktioniert es wunderbar - fährt bei Tastendruck die 3 konfigurierten Stellungen an (Linker Anschlag, Mitte, rechter Anschlag).
Sobald ich aber ein 2tes Servo dazu konfiguriere, spinnt das erste rum:
Die "Grundstellung" hält es wunderbar. Lasse ich das Servo jedoch auf die anderen beiden Stellungen fahren, fährt es in etwa in dessen Richtung, zuckt dann aber sehr wild herum und bleibt in der Position auch nicht stehen. Erst wenn ich per Tastendruck wieder den Hilfsmerker (Merker M1) auf Null gesetzt habe, steht das Servo wieder brav und still in Grundstellung - ohne zu Mucken und Zucken.
Hier dazu der Programmablauf:
Code:
$regfile = "m8def.dat"
$crystal = 8000000
'Konfiguriere I/O-Ports
Config Portb.0 = Output
Config Portb.1 = Output
Config Pind.0 = Input
Config Pind.1 = Input
'Konfiguriere Variablen
Dim A As Long
Dim B As Long
Dim M1 As Byte
Dim M2 As Byte
Dim Pos As Long
Dim Var As Long
M1 = 0
Pos = 1250 'Servo 1 in Startposition bringen - rechter Anschlag als Grundstellung
Var = 1250 ' Servo 2 in Startposion bringen - rechter Anschlag als Grundstellung
' *** Hauptprogramm ***
Do
For A = 1 To 100
Pulseout Portb.0 , A , Pos 'Pulsausgabe durch Variable "A" an PB.0, Signallänge ermittelt aus Wert "Pos"
Next
For B = 1 To 100
Pulseout Portb.1 , B , Var 'Pulsausgabe durch Variable "B" an PB.1, Signallänge ermittelt durch Wert "Var"
Debounce Pind.0 , 0 , Sub_taster1 , Sub 'Entprellter Tastereingang PD.0, dadurch Nebenlaufendes Programm (außerhalb der Do-Loop)
Loop
' *** Unterprgramme(e) ***
Sub_taster1:
If Pind.0 = 0 Then 'Wenn Taster gedrückt, dann
Incr M1 'Erhöhe Merker M1 um 1
End If
If M1 = 1 Then 'Wenn M1 den Wert 1 erreicht hat
Pos = 1250 'Fahre Servo auf Anfangsposition -
End If
If M1 = 2 Then ' Wenn M1 auf Wert 2, dann...
Pos = 2900 '... Fahre Servo in Mittelstellung
End If
If M1 = 3 Then ' Wenn M1 den Wert 3 erreicht aht, dann...
Pos = 4550 ' Fahre Servo auf linken Anschlag
M1 = 0 'setze den Merker auf Null - Servo bleibt in der Position, bis erneuter Tastendruck erfolgt
End If
Return
Dadurch, dass das Servo bereits beim Reinschreiben des 2ten "Pulseout"-Befehls herum spinnt, brauchte ich das Servo bislang noch nicht einmal aufrufen und zum Bewegen animieren.
Hat jemand eine Idee, wie ich das 2te Servo zum präzisen Arbeiten bekomme?
Der Befehl "Servo" in Bascom funktioniert zwar, ist mir jedoch nicht zuverlässig genug. Bei mehr als einem Servo und längerem Programmcode fährt sich der Controller gerne mal fest und schickt das Servo an den Endanschlag - bleibt dann dort aber auch stur stehen, bis ich den Controller neu starte.
Als 2ten Punkt:
Ist es möglich, gleichzeitig ein Servo anzusteuern und auf einem anderen Port ein PWM-Signal einzulesen?
In einem ersten Versuch funktionierte das Laufen des Servos (Single-Modus, also nur eines) tadellos und auch der PWM-Input wurde richtig ausgewertet, jedoch "flackerte" der LED-Ausgang im Low sehr stark, auf High gesetzt blieb er weitestgehend flackerfrei eingeschaltet.
Wer Ideen hat - bitte melden.
LG - Maik
Lesezeichen