- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Mehrere Servos parallel steuern ATMega8

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Mehrere Servos parallel steuern ATMega8

    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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.04.2013
    Beiträge
    526
    Wenn zwei Servos exakt das gleiche und zur selben Zeit tun sollen, kann man sie einfach komplett parallel schalten, d.h. an einen Signalausgang.

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Hallo,also erst einmal fehlt bei der zweiten for-next Schleife das next. Und dann sieht es so aus als wenn in eine Richtung fahren soll so lange du den Taster drückst. Das Problem der festfahrens in deiner ISR könntest Du abstellen indem Du eine Abfrage einbaust die schaut was passieren soll wenn der Zähler auf >3 steht. Schau doch mal über z.B. ein Terminal nach was genau fü reinen Wert der Zähler im Fehlerfall hat. Viele Grüße Jörg

  4. #4
    Hallo und danke schon mal für die Antworten.

    Nein, die ISR fährt sich nicht "fest", denn ich kann trotzdem noch beide Servos verstellen bzw. der Controller reagiert auf Tastendruck. Nur scheinen sich die "PWM-Signale" zu überlagern, dass das Servo so stark um den gesetzten Zielpunkt so stark zittert.
    Das Festfahren geschieht immer nur, wenn ich 2 Servos mit dem Befehl "Servo" ansteuere und den Controller durch verschiedene Tastendruck-Verhalten unterschiedlich stark belaste. Dann kippt er irgendwann. Bin mir aber auch nicht sicher, ob es vielleicht an der Spannungsversorgung des Boards liegen kann. Beide Servos versorge ich nämlich durch das Eva-Board und wenn beide Servos laufen, zieht das schon ein wenig mehr Strom.

    Dass jetzt ein "Next" fehlt, ist nur ein Schönheitsfehler. War schon arg spät gestern. Das Original war für 2 Servos gedacht und ich hab es später wieder auf den Single-Modus reduziert. Damit ihr euch ein Bild machen könnt, hab ich den Rest noch mal hinzu geschrieben und das next vergessen.


    Hast du vielleicht noch eine Idee, wie ich mit einem Controller die Servos zum Laufen bringe, gleichzeitig aber noch die PWM-Eingänge abfrage?
    Geht das besser mit der Abfrage durch einen Timer/Counter oder mit der Pulsein-Routine? Wenn ich Pulsein nutze, flackert der gesetzte Ausgang ziemlich stark, obwohl er Low sein sollte. Scheint mit dem Pulseout des Servos zusammen zu hängen - warum auch immer.


    LG - Maik


    LG - Maik

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Hast Du schon überprüft ob der mega wirklich mit 8MHz läuft? (einfacher 1Hz LED-Blinker).

    Ich frage mich grade warum du die LED überhaupt mit einem PWM ansteuerst? Könnte man den Pin nicht als IO benutzen, wenn es die Anwendung zu lässt ... ansosnten könnte es am Takt des mega liegen -> prüfen mit Blinker.
    Ich bin der Meinung das kein flackern wahrnehmbar sein sollte.

    Ach so, wollte ich vorhin ja schon sagen: Die for-next Schleifen sind hier vermutlich so auch überflüssig. Wenn ich es richtig sehe gibst du doch den Servowert in der ISR an...wozu zählen die Schleifen da auch noch was mit - wenn ich so drüber nachdenke .... das wird das zittern verursachen, weil es auch einfach keinen Sinn macht die Ausgabepins von 0 - 100 hoch zu zählen, zumal der mega8 effektiv nur 23 Pins hat, und sicher nicht alle davon für dich in frage kommen
    Und bei mir sieht der Befehl für Portb.0 so aus : Pulseout Portb, 0, wert. Warum das bei dir anders ist kann ich nicht sagen, ob falsch ist natürlich auch nicht. Aber die Hilfe sagt was anderes als bei dir steht.

    Auch ist ein Long etwas sehr überdimensioniert, hier tut es ein Word. Denn du hast sicher niemals einen Wert über 65535.

    Ich kenne das Eva-Board nicht und weiß auch nicht wie die Spannung aussieht die Du da benutzt. Wenn es aber mit der Single-Version läuft, dann könntest du den Tipp von hbquax als erstes versuchen umzusetzen. Wenn das Problem dann weiterhin auftritt, hast Du wahrscheinlich einen Spannungseinbruch - vielleicht auch mit unbemerktem reset des µC- das kann auch das zittern auslösen.

    Und nun lass uns nochmal über etwas grundsätzliches kurz sprechen: Es macht keinen Sinn ein Programm zu posten, das aber nicht den Fehler produziert - denn einen Servo Befehl sehe ich hier nicht. Und auch einen Programmteil einfach wieder rein zu schreiben - womöglich ohne es erneut zu testen, macht wenig Sinn.

    Viele Grüße
    Jörg
    Geändert von HeXPloreR (02.10.2014 um 23:19 Uhr)

  6. #6
    HI.

    Jeden neuen Controller setupe ich extra mit AVRStudio, weil ich damit die Lock-Bits setzen kann. Und da setze ich den Controller immer auf 8Mhz +64ms.

    Hm - um ehrlich zu sein, kann ich dir die Frage nach der For-Next-Schreife nicht beantworten. Allerdings kann ich nur so den Pulseout-Befehl ausgeben, denn nur dort ist die Variable "A (bzw. B)" verankert, welche ja die Anzahl an Wiederholungen wiederspiegelt. Und hier hört dann auch leider mein "Fachchinesisch" dazu auf, denn viel mehr habe ich über den Pulseout-Befehl leider nicht finden können.

    Ui - ich werde deine Variante des "Pulseout" ausprobieren. Zum Aufschlüsseln: Pulseout ist ja klar, dahinter der entsprechende Ausgangsport, an 3ter Stelle nehme ich an, wird die fallende Flanke getriggert, zuletzt dann die Variable, welche in der ISR aufgerufen wird. Nicht, dass nämlich die 3te Variable "0" für die direkte Portnummer steht ^^.

    E-V-A: Eingabe - Verarbeitung - Ausgabe ^^. Ich nenne mein Evaluationsboard so. Habe das STK500 . Ist für mich einfacher, jedoch kannst du natürlich nicht wissen, was ich damit meine. Entschuldige.

    Na klar - ändere das "Long" auf "Word".

    Nein. Das Zittern spiegelt keinen "Reset" des µC wieder. Mit den Variablen habe ich das Servo in einem Aktionsradius von exakt 180° zu Laufen. Es fährt die entsprechenden Stellungen ja an, z.B. 90° (ca. Wert 2900, 1250 = linker Anschlag, 4550 = rechter Anschlag) ja an und hält diese auch, nur dass das ausgangssignal anscheinend (z.B. bei Wert 2900 = Mittelstellung) nicht bei exakt 1,50 Milisekunden liegt, sondern in einem Bereich zwischen 1,3ms und 1,7ms liegt - und genauso verhält sich das Servo dann auch. Würde der Controller durch den Spannungseinbruch zurück gesetzt, würde das Servo ja wieder in die Ausgangsposition fahren, und die liegt bei 1ms - also linker Anschlag (Startwert bei 1250). Das kanns dann augenscheinlich nicht sein.
    Möglich wäre nur, dass das Servo selbst bei Belastung die Spannungs mit Einbruch-Spitzen überlagert und der Controller so Fehlsignale einfach weitergibt.

    Ich werde mal folgendes tun:
    Ich besorge mir für die Zukunft ein 2tes Netzteil und erstelle mit eine Spannungs-Unterstützung. Auf der wird dann ein 5V Festspannungsregler untergebracht, der die Spannung für Nebenaggregate aufrecht hält. Sofern ich die Masse dieses Boards dann mit der zentralen Masse des STK500 verbinde, sollte der Controller beim Ausprobieren auch das Servo stellen können - hoffe ich zumindest.


    Jörg - du hast recht. Ich probiere es nun erst einmal mit deinem Vorschlag. Erreiche ich damit nichts, poste ich das gesamte Programm. Versprochen.
    Will ja, dass du zufrieden bist und mir so auch etwas mehr helfen kannst.


    LG - Möhrchen

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    ... 2 Servos, die per Tastendruck ... von einem Anschlag zum anderen Anschlag ... beim 2ten Tastendruck dann wieder zurück ...
    Die Aufgabe ist eher so als Standard zu sehen, nicht wirklich sehr anspruchsvoll, also gerade richtig für den Einstieg.

    ... habe ich wohl einen zu hohen Stromfluss für das kleine Board erzeug ... Controller ... oder er sogar ganz abgestürzt ist ...
    Ein typischer Anfängerfehler ist es Servos mit der gleichen Stromquelle (genauer: dem gleichen Spannungsregler) zu versorgen wie den Controller. So ungefähr alle ein bis zwei Monate gibts dazu hier im Forum ähnliche Störungsmeldungen. Du wirst weiter Störungen haben, möglicherweise mit den kleineren Servos genauso (ausser Du prüfst wirklich deren Stromhunger, die Hersteller machen dazu äusserst selten Angaben !!) wenn nicht noch schlimmer.

    .... Auf dem Board sitzt ja ein Festspannungsregler, und der darf nicht zu warm werden, um korrekt zu funktionieren ...
    Du hast also an Board eine Energieversorgung die höher ist als die fünf (oder wieviel Volt) die Dein Controllerboard braucht. Wie hoch ist denn Deine Bordspannung - ohne Spannungsregler ???

    Fazit:
    a) für die Servos nen separaten Spannungswandler oder direkt von der Bordbatterie/-akku.
    b) UN BE DINGT die GND-Leitungen der Controllerplatine und der Servo-Versorgung miteinander verbinden (klick hier).
    c) Wenn Störungen anhalten, für die Servos ne separaten Akku nehmen und b) beachten.
    Ciao sagt der JoeamBerg

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Ich denke auch die Aufgabenstellung ist genau das richtige für den Einstieg - wenn auch schon etwas schwieriger, Bascom kann das auf jeden Fall umsetzen.

    Überlege doch nochmal ob du wirklich zweimal PWM Ausgänge für zwei Servos benötigst die vermutlich das gleiche tun sollen.
    Und ob nicht auch ein Taster ausreicht um dieses öffnen und schliessen zu erreichen.
    Also ich möchte Dir nicht deine Aufgabe kaputt reden, aber einfacher wäre es ja schon.

    Für die Beleuchtung wäre möglicherweise eine Tastfunktion für dich interessant.

    Viele Grüße Jörg
    Geändert von HeXPloreR (06.10.2014 um 16:14 Uhr)

  9. #9
    Ein ganz liebes "HALLO" an euch beide.

    @ oberallgeier:
    Korrekt. Die Spannungsversorgung erfolgt über ein 12V Netzteil mit 500mA Ausgangsstrom. Eigentlich ausreichend. Dennoch habe ich die 19g-Servos nun gegen 12g-Servos getauscht und der Stromhunger ist genau in dem Rahmen, in dem ich ihn haben will.
    Die GND-Leitungen von EVA-Board und Servos würde ich eh miteinander verbinden. Die Rechtecksignale kann der Controller schließlich nur im geschlossenen Stromkreis erkennen ^^.
    Danke dir trotzdem recht herzlich für den Tipp.


    @ Jörg:
    Habe das Programm nun zumindest einmal soweit, dass beide Servos problemlos dahin fahren, wohin ich sie haben möchte. Ganz unkonventionell und ohne großen Schnickschnack drum herum. Ging doch mit dem Servo-Konfigurationsbefehl, aber ohne Main-Sub. *freu*


    Hier das File:

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686411
    
    
    Config Portb = Output
    Config Portc = Input
    
    Portb = &H03
    
    Taster1 Alias Pinc.0
    Taster2 Alias Pinc.1
    
    
    
    '*** Konfiguriere Servos ***
    
    Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
    Enable Interrupts
    
    
    '*** Setze Servos für Startup auf Mittelstellung ***
    Dim Pos1 As Byte
    Pos1 = 124       ' 124 = Mittelstellung, 48 = rechter Anschlag, 210 = linker Anschlag, Servo 1
    Servo(1) = Pos1
    Dim Pos2 As Byte
    Pos2 = 130       ' 130 = Mittelstellung, 48 = rechter Anschlag, 215 = linker Anschlag, Servo 2
    Servo(2) = Pos2
    
    
    '*** Konfiguriere Variablen ***
    
    Dim M1 As Byte
    Dim M2 As Byte
    M1 = 0
    M2 = 0
    
    
    
    '  *****************************
    '    ***** Hauptprogramm *****
    '  *****************************
    
    Do
    
    Debounce Taster1 , 0 , Sub_taster1 , Sub
    Debounce Taster2 , 0 , Sub_taster2 , Sub
    
    
    Loop
    
    
    
    ' **********************
    '   * Unterprogramme *
    ' **********************
    
    'Wenn Taster 1 gedrückt, zählt Merker1 um Wert 1 hoch. Mit jedem neuen Wert von M1 erfolgt eine neue Positionsausgabe per PWM an Servo1.
    
    Sub_taster1:
    
       If Taster1 = 0 Then
          M1 = M1 + 1
       Waitms 20
       End If
       If M1 = 1 Then
          Pos1 = 48
       Elseif M1 = 2 Then
          Pos1 = 210
       End If
       If M1 = 2 Then       'Wenn M1 den Wert 2 erreicht, wird M1 auf Null zurück gesetzt
          M1 = 0
       End If
       Servo(1) = Pos1
    
    Return
    
    
    'Wenn Taster 2 gedrückt wird, zählt Merker2 um Wert 1 hoch. Mit jedem neuen Wert von M1 erfolgt neue Positionsausgabe an Servo2.
    
    Sub_taster2:
    
       If Taster2 = 0 Then
          M2 = M2 + 1
       Waitms 20
       End If
       If M2 = 1 Then
          Pos2 = 48
       Elseif M2 = 2 Then
          Pos2 = 215
       End If
       If M2 = 2 Then       ' Wenn M2 den Wert 2 erreicht, wird M2 auf Null zurück gesetzt
          M2 = 0
       End If
       Servo(2) = Pos2
    
    Return
    
    End
    Ich kann damit sogar beide Taster gleichzeitig drücken und der Controller gibt sofort das entsprechende PWM-Signal an den Ports aus.

    Morgen Abend werde ich dann mal versuchen, ob ich die Eingabe durch den Servotester (PulseIn) implementiert bekomme. Irgendwie muss das doch funktionieren - vielleicht diesmal ^^.

    Auf deine Frage bezogen:
    Nein, auch wenn es noch 2 Monate dauert - das muss ich hinbekommen. Und wenn nicht, dann muss ich umso mehr dafür büffeln. N bissl Platz ist in meinem Hirn dafür noch frei ^^.
    Die Klappen, die im Boot verbaut sind, sollen definitiv getrennt zu öffnen sein. Finde das einfach schicker. Man soll ja auch sehen, dass ich mir echt Gedanken für die Steuerung gemacht habe - und meine Frau freut sich sicher auch über ausgereiftere Konzepte als halbherzige Notlösungen (z.B. weil ich nicht weiter gekommen bin).

    Die Beleuchtung soll NICHT nur per Tastkanal zu schalten, sondern dauerhaft eingeschaltet sein wenn der entsprechende Schalter an der Fernsteuerung umgelegt wird. Und da habe ich dann einen 3-Stufen-Schalter, welcher dafür genutzt werden soll: Stufe unten - Licht aus, Stufe Mitte - Licht ein, Stufe oben - Licht und Zusatzscheinwerfer.


    MFG - Maik

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Ja, na endlich hat er es gesagt: Zwei Taster, zwei Klappen - jeweils ein Taster pro Klappe. Nicht das das wichtig wäre um ein Programm zu beurteilen

    ...interessanter Verlauf ....was ich nicht verstehe ist warum du Deine Hardware ständig änderst? Konkret die Frage: Hast du nun einen 8Mhz oder einen 3686411 Crystal, intern oder extern ?

    Ich hätte auch vermutet das wenn ein Taster auf 0 (GND) im Debounce eingestellt wird, nicht nochmal im Unterprogramm geprüft werden muss ob der 0 ist - weil sonst hätte man ja in dem Unterprogramm nichts verloren, oder? Der Merker wäre so oder so okay. Naja, wenn es nicht stört und funktioniert.

    Wäre es nicht auch möglich jeweils die letzte if m(x) abfrage in die da vor zu packen weil du löscht den Merker ja sowieso danach, dann kannst Du ihn auch gleich noch mit auf 0 setzen.

    Mir wäre es ja auch lieb gewwesen wenn du gleich gesagt hättest das Du für die Beleuchtung extra Schalt-Kanäle an der Funke hast. Aber sowas passiert jedem Mal

    Viele Grüße
    Jörg
    Geändert von HeXPloreR (07.10.2014 um 17:22 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Mehrere RC Signale einlesen und mehrere Servos ausgeben
    Von R2D2 Bastler im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 74
    Letzter Beitrag: 10.01.2022, 09:35
  2. Mehrere ATMEL parallel programmieren
    Von Realisator im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 09.05.2009, 17:54
  3. mehrere Ausgänge parallel regeln?
    Von marius86 im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 5
    Letzter Beitrag: 20.07.2008, 22:23
  4. Mehrere RS232 Rx/Tx parallel?
    Von Jaecko im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 24.03.2007, 10:24
  5. [ERLEDIGT] Mehrere LED´s Parallel geschaltet
    Von Gast A.M. im Forum Sensoren / Sensorik
    Antworten: 25
    Letzter Beitrag: 05.06.2005, 12:37

Berechtigungen

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

LiTime Speicher und Akkus