Wenn zwei Servos exakt das gleiche und zur selben Zeit tun sollen, kann man sie einfach komplett parallel schalten, d.h. an einen Signalausgang.
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:
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.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
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
Wenn zwei Servos exakt das gleiche und zur selben Zeit tun sollen, kann man sie einfach komplett parallel schalten, d.h. an einen Signalausgang.
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
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
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)
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
Leider kombinierst Du anscheinend ein LED-Lauflicht mit Deiner Anwendung die ja eindeutig eine PWM-Ausgabe auf mindestens einen (oder vielleicht auch zwei) festen Ausgang hat. Wenn Du aber mit einem Zähler in der Schleife auch noch den Pulseout beschickst ... also kurz gesagt ich denke Du benutzt den Befehl leider einfach falsch.
Welche Anzahl von Wiederholungen denn? Du drückst doch eine Taster, daraufhin verfährt der Servo auf einen festen Wert. Wiederholungen gibt es doch, abgesehen von der eigentlichen Hauptschleife garnicht, oder? Und auch wenn du Wiederholungen einbauen wollen würdest, ganz sicher nicht an dieser Stelle. Um eine Wartezeit von zb 15ms zu erzeugen würde ich vorerst einfach ein waitms15 vor die loop setzen. Der Nachteil dabei ist dein debounce-Befehl ... das ganze würde ich in eine Interrupt packen ohne debounce, deshalb Hardware entprellt und dort das drücken zählen lassen (- den Taster würde ich persönlich immer hardware entprellen - da ich mir grade nicht sicher bin ob debounce im Interrupt einfach funktionieren würde)
Zusaätzlich könntest du den Tipp von hbquax nachmal ansehen... ...und dazu Deinen Code: wenn Du genau hinsiehst erkennst du vermutlich das Du zwei Variablen angelegt hast, die vermutlich letzten Endes das Gleiche enthalten. Auch das wäre unnötig, wenn beide Servo die gleichen Werte bekommen sollen, denn genau dazu sind Variablen eben auch gut
Ein wenig Bascom für die Praxis - Halvar.at
EVA - Guckst Du hier
Viel Erfolg
Jörg
Geändert von HeXPloreR (02.10.2014 um 23:21 Uhr)
Recht hast du. Wiederholungen gibts im Dem Sinne nicht. Ich sehe leider nicht die Software die hinter der Hardware steckt. Mit "Wiederholungen" meinte ich wohl das Verfahren der Servos, jedoch habe ich dabei nicht betrachtet, dass mit dem Tastsendruck das ausgegebene PWM-Signal sofort geändert wird und das Servo halt nur seine Zeit braucht, um den dazu gehörigen Wert anzufahren.
Nein, kein Lauflicht, sondern eine PWM-Eingabe. Habe einen Sevotester, der ein PWM-Signal ausgibt. Damit füttere ich den Controller, und der soll das dann nur auswerten und einen Ausgang ab 1,8ms PWM-Input einschalten. Also genau das Gegenteil von dem, was ich mit den Servos vor habe.
Werde heute oder morgen noch mal ein wenig Probieren - u.U. komme ich aber erst kommende Woche dazu. Dann poste ich auch das Programm.
LG - Maik
Wie meinst Du das? - Ich nehme mal an die schreibst die Software selbst - in Bascom, oder wovon reden wir jetzt? "Hardware entprellen" bedeutet das parallel zu dem Taster z.B. ein 10µF Keramikkondensator verbaut wird. Damit spart man sich den Debounce in der Software, was eben auch seine Vorteile haben kann.
...hört sich an als drückt man sehr ungeduldig auf dem Taster rum.und das Servo halt nur seine Zeit braucht, um den dazu gehörigen Wert anzufahren..
Nur weil es vielleicht das Gegenteil ist ändert es nicht die Tatsache das auch hier ein fester Eingang mit Pulsein benutzt werden kann. Und ab dem dazu fraglichen Wert ein IO eingeschaltet wird..... und der soll das dann nur auswerten und einen Ausgang ab 1,8ms PWM-Input einschalten. Also genau das Gegenteil von dem, was ich mit den Servos vor habe.
Sollen diese beiden Anwendungen später irgendwas zusammen machen oder sich gegenseitig beeinflussen?
Mit "Hardware hinter der Software" meinte ich Folgendes:
Wenn ich den Taster drücke, ändert der Controller ja SOFORT das ausgegebene PWM-Signal von z.B. 1ms auf 2ms. Das Servo jedoch braucht seine Zeit, um von 1ms (linker Anschlag) auf 2ms (rechter Anschlag) zu fahren. Wenn ich also zwischen den ausgegebenen PWM-Signalen schnell hin und her switchte, habe ich wohl einen zu hohen Stromfluss für das kleine Board erzeugt, was den Controller u.U. dazu zwang, sein Programm anzuhalten oder er sogar ganz abgestürzt ist.
Für die kommende Woche habe ich mir nun neue, deutlich kleinere Servos eingepackt. Die haben einen weitaus geringeren Strombedarf - bin gespannt, wie das Board diesmal reagiert. Auf dem Board sitzt ja ein Festspannungsregler, und der darf nicht zu warm werden, um korrekt zu funktionieren. Bin selbst gespannt ^^
Ich habe mit dem Controller folgendes vor:
Er soll in meinem Modellboot laufen. Dieses hier:
Bild hier
DSCN0646 von tenner21 - Album.de
An Deck sind 2 Doppelklappen zu sehen (die mit dem Messerfurnier), welche servoelektrisch angetrieben sind. Im Cockpit befinden sich dafür 2 Taster, welche diese Klappen dann per Tastendruck öffnen und schließen sollen.
Weiterhin hat mein Boot eine elektrische Wasserpumpe sowie eine Beleuchtung in 2 Stufen verbaut, welche per Fernsteuerung geschaltet werden müssen.
Demzufolge muss an 2 Pins ein PWM-Signal überwacht werden, 3 weitere Pins sind Schaltausgänge.
Zusätzlich sind 2 Pins Tastereingänge und 2 Ausgänge müssen ein PWM-Signal für die Servos ausgeben.
Ist das möglich oder reicht dafür mein Bascom-Wissen nicht aus bzw. kann Bascom das nicht?
LG - Maik
Lesezeichen