PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] 2 Servos mit Bascom ansteuern - Servo 2 ruckelt!



Cairol
10.11.2007, 01: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?

PicNick
10.11.2007, 10:07
mmmhhh.
Was auffällt:
Da das Servo-1 offenbar tadellos funzt, kann es nur an der Übergabe der Winkel liegen, rat' ich mal rum
Ich würde sicherheitshalber die Winkelvorgaben
1. auf "AS BYTE" definieren, das reicht ja
2. Oder überhaupt ändern auf "$CONST", du variierst sie ja eh nicht
also gar keine Variablen, sondern


$CONST SteerPosL = 97
$CONST SteerPosM = 110
$CONST SteerPosR = 123


Und INstring würd ich innerhalB des "IF InString <> "" " löschen, aber das macht sicher nix aus


EDIT: Das "Reload = 10" ist für eine 10 µS Basis, da würd' ich nicht dran drehen

Cairol
10.11.2007, 21:33
Die vorgeschlagenen Änderungen muss ich ausprobieren sobald ich etwas Zeit habe.
Der Lenk-Servo hängt übrigens an einem ADC-Pin vom Mega 8. Das macht ja hoffentlich nichts aus!?
Ich hatte nämlich nur noch diesen einen Pin frei.

Eigentlich wollte ich gar keinen 2. Servo einsetzen, aber ich musste die Lenkung nachträglich von einer Art "Magnetlenkung" auf "Servo-Lenkung" umbauen weil das alte System nichtmehr funktioniert hat.
(Hab ein RC-Modell umgebaut auf PC-Steuerung -> siehe https://www.roboternetz.de/phpBB2/viewtopic.php?t=32819)

Cairol
12.11.2007, 21:08
OK, ich glaube ich habs jetzt.

Mit den Konstanten ging es garnicht - da hat der Kamera-Servo voll abgedreht und wurde unkontrollierbar.
Jetzt sind die Integer in Bytes geändert, aber das war nicht das Problem. (spart aber zumindest etwas Platz auf dem uC)

Mit Reload=10 waren beide Servos zusammen nicht steuerbar und mit Reload=7 auch nicht.
Aber mit "8" funktionierte plötzlich alles zufriedenstellend.
Hab die Kiste gerade eine Stunde lang um die Ecken gejagt und alles durchgetestet.

Danke für die Tipps.