Cairol
10.11.2007, 02:34
Ich habe 2 Servos in Gebrauch:
Nr. 1 ist für das schwenken einer Mini-Kamera zuständig und funktioniert perfekt.
Nr 2 ist der selbe Typ und soll die Lenkung für das Fahrzeug sein. Und hier harkts.
Der Lenk-Servo fährt nur hin und wieder in die programmierte Position.
Meistens rast er nur zur Soll-Position, schießt dann zurück über die Mittelstellung hinaus und "wiggelt" dann ein paar mal um die Mittelstellung herum bis er sie dann beibehält.
Oder er zuckt nur etwas um die Mittelstellung herum wenn man ihn nach rehchts oder links beordert.
Die Positionsbefehle gebe ich per RS232 an einen Mega8.
Das Programm ist so aufgebaut, das jeder vom PC gegebene Befehl vom Controller an den PC zurückgeschickt wird wenn der uC ihn verstanden hat.
Die Befehle werden in 99% der Fälle prompt bestätigt - ich bin also sicher das es nicht an der RS232-Kommunikation liegt.
Folgenden Code verwende ich:
$regfile = "m8def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 19200
Enable Interrupts
Config Pinc.1 = Output 'für Servo-Lenkung
Config Pind.2 = Output 'für Kamera-Servo-Steuerung
'Für ANTRIEB (Buchse A)
Config Pind.4 = Output 'Antrieb Kanal 1
Config Pind.5 = Output 'Antrieb Kanal 2
Config Pinb.1 = Output 'Antrieb PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Tccr1b = Tccr1b Or &H02 'Prescaler = 8
Config SERVOS = 2 , Servo1 = Portd.2 , Servo2 = Portc.1 , Reload = 10
Dim SteerAngle as Integer 'Lenkwinel
Dim SteerPosL as Integer
Dim SteerPosM as Integer
Dim SteerPosR as Integer
Antrieb1 Alias Portd.4 'für Antrieb (PWM)
Antrieb2 Alias Portd.5
AntriebPWM Alias Pwm1a
SteerPosL = 97 'Servo-Lenkungs-Winkel-Vorgaben
SteerPosM = 110
SteerPosR = 123
Servo(2) = SteerPosM
'=============================
'Hauptschleife
'=============================
Do
Do
InByte = inkey()
If InByte <> 0 then
InString = InString + chr(InByte)
End if
Loop until InByte = 0
If InString <> "" Then
Select Case InString
Case "RT" 'REQUEST_TELEMETRIE
call Compose_Telemetrie()
print "ST" 'SET_TELEMETIRE
print TelemetrieString
Case "MOVE_STOP"
print InString
AntriebPWM = Aus 'Antrieb AUS
Servo(2) = SteerPosM
Case "MOVE_FWD"
print InString
Antrieb1 = 1 'Antrieb VOR
Antrieb2 = 0
Servo(2) = SteerPosM
AntriebPWM = MotorSpeed 'Antrieb aktivieren
Case "MOVE_FWD_R"
print InString
Antrieb1 = 1 'Antrieb VOR
Antrieb2 = 0
Servo(2) = SteerPosR
AntriebPWM = MotorSpeed 'Antrieb aktivieren
Case "MOVE_FWD_L"
print InString
Antrieb1 = 1 'Antrieb VOR
Antrieb2 = 0
Servo(2) = SteerPosL
AntriebPWM = MotorSpeed 'Antrieb aktivieren
Case Else
AntriebPWM = Aus
print "uC hat ungueltigen Befehl"
End Select
End if
InString = ""
Waitms 100 'wieso geht RS232-Kommunikation nur damit?
Loop
Bei dem Servo hat auch ein "Reload"-Wert von 7 keine Besserung gebracht.
Die Versorgungsspannung kommt überigens von einem 5V Spannungsregler der auch den rest vom Board versorgt. Die empfohlenen Werte für die Puffer-Elkos ect. habe ich auch eingehalten.
Hat jemand eine Idee wo das Problem liegen könnte?
Nr. 1 ist für das schwenken einer Mini-Kamera zuständig und funktioniert perfekt.
Nr 2 ist der selbe Typ und soll die Lenkung für das Fahrzeug sein. Und hier harkts.
Der Lenk-Servo fährt nur hin und wieder in die programmierte Position.
Meistens rast er nur zur Soll-Position, schießt dann zurück über die Mittelstellung hinaus und "wiggelt" dann ein paar mal um die Mittelstellung herum bis er sie dann beibehält.
Oder er zuckt nur etwas um die Mittelstellung herum wenn man ihn nach rehchts oder links beordert.
Die Positionsbefehle gebe ich per RS232 an einen Mega8.
Das Programm ist so aufgebaut, das jeder vom PC gegebene Befehl vom Controller an den PC zurückgeschickt wird wenn der uC ihn verstanden hat.
Die Befehle werden in 99% der Fälle prompt bestätigt - ich bin also sicher das es nicht an der RS232-Kommunikation liegt.
Folgenden Code verwende ich:
$regfile = "m8def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 19200
Enable Interrupts
Config Pinc.1 = Output 'für Servo-Lenkung
Config Pind.2 = Output 'für Kamera-Servo-Steuerung
'Für ANTRIEB (Buchse A)
Config Pind.4 = Output 'Antrieb Kanal 1
Config Pind.5 = Output 'Antrieb Kanal 2
Config Pinb.1 = Output 'Antrieb PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Tccr1b = Tccr1b Or &H02 'Prescaler = 8
Config SERVOS = 2 , Servo1 = Portd.2 , Servo2 = Portc.1 , Reload = 10
Dim SteerAngle as Integer 'Lenkwinel
Dim SteerPosL as Integer
Dim SteerPosM as Integer
Dim SteerPosR as Integer
Antrieb1 Alias Portd.4 'für Antrieb (PWM)
Antrieb2 Alias Portd.5
AntriebPWM Alias Pwm1a
SteerPosL = 97 'Servo-Lenkungs-Winkel-Vorgaben
SteerPosM = 110
SteerPosR = 123
Servo(2) = SteerPosM
'=============================
'Hauptschleife
'=============================
Do
Do
InByte = inkey()
If InByte <> 0 then
InString = InString + chr(InByte)
End if
Loop until InByte = 0
If InString <> "" Then
Select Case InString
Case "RT" 'REQUEST_TELEMETRIE
call Compose_Telemetrie()
print "ST" 'SET_TELEMETIRE
print TelemetrieString
Case "MOVE_STOP"
print InString
AntriebPWM = Aus 'Antrieb AUS
Servo(2) = SteerPosM
Case "MOVE_FWD"
print InString
Antrieb1 = 1 'Antrieb VOR
Antrieb2 = 0
Servo(2) = SteerPosM
AntriebPWM = MotorSpeed 'Antrieb aktivieren
Case "MOVE_FWD_R"
print InString
Antrieb1 = 1 'Antrieb VOR
Antrieb2 = 0
Servo(2) = SteerPosR
AntriebPWM = MotorSpeed 'Antrieb aktivieren
Case "MOVE_FWD_L"
print InString
Antrieb1 = 1 'Antrieb VOR
Antrieb2 = 0
Servo(2) = SteerPosL
AntriebPWM = MotorSpeed 'Antrieb aktivieren
Case Else
AntriebPWM = Aus
print "uC hat ungueltigen Befehl"
End Select
End if
InString = ""
Waitms 100 'wieso geht RS232-Kommunikation nur damit?
Loop
Bei dem Servo hat auch ein "Reload"-Wert von 7 keine Besserung gebracht.
Die Versorgungsspannung kommt überigens von einem 5V Spannungsregler der auch den rest vom Board versorgt. Die empfohlenen Werte für die Puffer-Elkos ect. habe ich auch eingehalten.
Hat jemand eine Idee wo das Problem liegen könnte?