- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 4 von 4

Thema: [gelöst] 2 Servos mit Bascom ansteuern - Servo 2 ruckelt!

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.07.2007
    Alter
    40
    Beiträge
    214

    [gelöst] 2 Servos mit Bascom ansteuern - Servo 2 ruckelt!

    Anzeige

    E-Bike
    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:

    Code:
    $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?

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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
    Code:
    $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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.07.2007
    Alter
    40
    Beiträge
    214
    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)

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.07.2007
    Alter
    40
    Beiträge
    214
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress