Hallo,
ich hoffe ihr könnt mir weiterhelfen.
Verwendet wird ein Modellbauservo (MG996r) an einem Atmega8 mit einem
8MHz-Quarz.
Eingesetzt wird der Timer1 mit 16bit. Beim Timer_Overflow_Interrupt wird
der Timer mit einem Wert vorgeladen um die 50Hz (20ms) zu erreichen und
der Ausgang auf High gesetzt. Mittels Compare A Match Interrupt wird der
Port wieder auf low gesetzt. Ich habe mit dem Oszilloskop sehr genau
50Hz (20ms) gemessen und kann die Zeit wunderbar zwischen 1ms und 2ms
variieren. Servo läuft auch sauber verschiedene Positionen an und zuckt
beim erriechen der Position nicht.
Nun möchte ich den Servo sehr langsam um 180grad bewegen. Hierfür stehen
wir 2000Schritte von A nach B zur Verfügung. Alle paar ms erhöhe ich
meinen Positionswert um eine Stelle. Auf einem LCD-Display zählt der
Wert langsam nach oben und auf meinem Oszilloskop sieht man sehr schön
wie der Balken (High-Time) sehr langsam immer breiter wird.
Allerdings läuft mein Servo nicht sehr langsam und geschmeidig von A
nach B sondern macht immer ziemlich rucklige Schritte. Er bewegt sich in
gewissen "Stößen" weiter. Wenn ich den Servo mit der Hand etwas belaste
läuft er viel geschmeidiger. Ich würde die 180grad gerne sehr
geschmeidig über 1-20sek erreichen.
Das Ganze soll mal eine Schwenkvorrichtung für Videoaufnahmen werden.
Ist die rucklige Bewegung vom Servo bedingt? Habe testweise einen
mikroservo probiert, dieser macht aber ebenfalls die ruckligen
Bewegungen...
Viele Grüße,
Peter
Peter schrieb:> Ist die rucklige Bewegung vom Servo bedingt?
Jo, ist es. 2k Schritte kann der niemals auflösen.
Sieh Dir mal an, wie die Analogdinger funktionieren.
Da gibts aber sicher präzisiere, als diese normalen für Spielzeug.
Peter schrieb:> Das Ganze soll mal eine Schwenkvorrichtung für Videoaufnahmen werden.
Dafür sind Modellbauservos nicht gut genug.
Peter schrieb:> Allerdings läuft mein Servo nicht sehr langsam und geschmeidig von A> nach B sondern macht immer ziemlich rucklige Schritte. Er bewegt sich in> gewissen "Stößen" weiter.
Nur der Servo oder auch irgendeine Mechanik für die Kamera?
Das Ruckelproblem hatte ich damals auch bei Servos an Atmega.
Das Problem, war, dass das Interrupt für das LC-Display das Timing
versaut hatte.
Nach Abschalten des Displays lief dann alles wieder ruckelfrei und
sauber, die Servobewegungen waren absolut smooth.
Hallo Teo Derix,
das habe ich mir schon fast gedacht.
Natürlich kann ich die Schrittweite erhöhen. Jedoch sollte der Servo
sehr geschmeidig und ziemlich langsam (innerhalb 1-20sek) von A nach B
laufen.
Mit größeren schritten läuft der Servo ja nicht geschmeidiger (außer er
läuft zu schnell).
Eine Schwenkung bei Videoaufnahmen soll ja nicht ruckelig sein.
Welche Servo ist den zu empfehlen?
Oder ist meine Idee mit dem Servo ein falscher Ansatz?
Grüße Peter
Peter schrieb:> Nun möchte ich den Servo sehr langsam um 180grad bewegen. Hierfür stehen> wir 2000Schritte von A nach B zur Verfügung.
Das ist wirklich "übersportlich"! Das kann ein normaler Servo nicht.
Versuch es mal mit einem Drehteller, der von einem Schrittmotor
gesteuert wird. Die Übersetzung (am besten per Zahnriemen, würde ich
vorschlagen) muss dann entsprechend angepasst werden
PS: große Zahnriemen für den Drehteller und den Zahnscheibenaufsatz für
den Schrittmotor gibt es günstig im Modellhubschrauber-Zubehör.
PPS: nimm am besten einen Steppertreiber, der auch Mikroschritte kann,
dann ruckelt es quasi gar nicht mehr.
So wie beschrieben, dürfte der Timer im nicht-PWM Modus betrieben
werden, die Compare-Register sind da nicht doppel-gepuffert. Beim
Hochzählen/Verlängern des Impulses dürfte das eigentlich nichts machen,
beim Runterzählen kann's zum Verfehlen des Matches führen.
Für nur ein Servo kann das der Timer komplett in Hardware erledigen,
PWM, Mode 15, OCR1A als Top für die 20ms und OCR1B für die Erzeugung des
Servopulses, doppel-gepuffert ist's dann auch.
Solltest Du das nicht wollen, verändere in der Main-loop nur eine
Variable, die Du beim Overflow nach OCR1A übernimmst, das ist dann auch
ein Doppelpuffer. Allerdings musst Du das Beschreiben der Variable in
Main dann atomar machen.
Einfacher und sauberer ist's im Mode 15.
Danke für die schnellen Antwortem.
@Rolf Magnus:
Vorerst sollte einfach eine Kamera direkt auf den Servo montiert werden.
Ich wollte in Zukunft mit Rampen etc arbeiten. Jedoch möchte der Servo
einfach nicht langsam geschmeidig (ohne rickbewegungen) von A nach B
laufen (innerhalb mehrerer Sekunden).
@GR:
Habe die Anzeige des auf dem Display auch schon aus meinem Code
genommen.
Jedoch läuft der Servo immernoch ruckweise vorwärts. Ich habe das Gefühl
ein Servo kann keine so langsamen Bewegungen?
Grüße Peter
Einen Drehteller aus Multiplex kann man am Rand direkt mit einer Führung
und den Fräsungen für den Zahnriemen versehen, wenn man halbwegs
geschickt ist.
Der Drehteller sollte kugelgelagert oder besser walzengelagert sein.
Peter schrieb:> Jedoch läuft der Servo immernoch ruckweise vorwärts. Ich habe das Gefühl> ein Servo kann keine so langsamen Bewegungen?
Wahrscheinlich kann er nicht so kleine Schrittweiten?!?
Peter schrieb:> Habe die Anzeige des auf dem Display auch schon aus meinem Code> genommen.> Jedoch läuft der Servo immernoch ruckweise vorwärts. Ich habe das Gefühl> ein Servo kann keine so langsamen Bewegungen?
wenn du sicher gehen willst, benutzt hardware-PWM, das ist unanfällig
für Timing-probleme.
hat der controller einen 16-bit-timer? wenn ja, nimm den für die
hardware-PWM.
Kann auch sein, dass der Referenzpoti im Servo leichte
Unlinearitäten/Verschmutzungen besitzt. Dann bringt sein eigenes
Feedback ihn zum zittern.
Eventuell Servo öffnen und Kohlebahn/Schleifer von dem Referenzpoti
säubern.
Vorher würde ich Hardware-PWM testen, um software-Probleme
auszuschließen.
Noch besser ist die Idee mit dem Schrittmotor und der Übersetzung per
Zahnriemen!!!
Peter schrieb:> an einem Atmega8 mit einem 8MHz-Quarz.
Wird der Quarz auch benutzt oder läuft der Atmega8 mit irgendwelchen
1MHz aus dem RC-Oszillator?
Peter schrieb:> Jedoch läuft der Servo immernoch ruckweise vorwärts. Ich habe das Gefühl> ein Servo kann keine so langsamen Bewegungen?
doch, ein servo kann normalerweise auch langsame bewegungen ohne zu
ruckeln!
Wolfgang schrieb:> Peter schrieb:>> an einem Atmega8 mit einem 8MHz-Quarz.>> Wird der Quarz auch benutzt oder läuft der Atmega8 mit irgendwelchen> 1MHz aus dem RC-Oszillator?
und sind das überhaupt 50Hz, die da aus dem AtMi kommen oder irgendwo
beim Programmieren verrechnet?
Je nach Qualität der Servos haben alle Modellbauservos einen mehr oder
weniger grossen Totbereich, genau das dürfte hier das Problem sein.
Strom steht im Modell nicht unbegrenzt zur Verfügung, und ein um seine
Nullage minimal zitterndes Servo braucht ordentlich Saft.
Mit guten Servos (das heisst spielarmes Getriebe und hochwertiges Poti)
ist es aber machbar.
Peter schrieb:> Allerdings läuft mein Servo nicht sehr langsam und geschmeidig von A> nach B sondern macht immer ziemlich rucklige Schritte.
Wie "groß" sind die Ruckelschritte? 10° - 20 ° ? oder Kleiner? größer?
> Er bewegt sich in> gewissen "Stößen" weiter. Wenn ich den Servo mit der Hand etwas belaste> läuft er viel geschmeidiger. Ich würde die 180grad gerne sehr> geschmeidig über 1-20sek erreichen.
Ist schon sehr langsam.
Mal ne andere Frage, was heisst bei dir "Servo"? Ist das eine
Synchronmaschine/ Drehstrommotor mit Permanentmagneten? Wenn ja dann
wieviel polig ist die Maschine? Oder ist das ein Schrittmotor?
Werner schrieb:> Kann auch sein, dass der Referenzpoti im Servo leichte> Unlinearitäten/Verschmutzungen besitzt.
Eventuell sind da Digitale besser (hab ich noch nie in der Hand gehabt).
Wende Dich mit Deinem Problem, doch mal an ein Modellbau-Forum. Die
sollten da wohl mehr Ahnung haben.
Frank The Tank schrieb:> Mal ne andere Frage, was heisst bei dir "Servo"?
Was ist daran unklar?
Peter schrieb:> Verwendet wird ein Modellbauservo (MG996r)
Das ist ein normales mit DC-Motor und Brückenansteuerung - vermutlich
eines der vielen mit M51660L o.ä.
Oft erlaubt das Controller IC eine Einstellung der Totzeit, das hat
allerdings nur dann Sinn, wenn die Mechanik und die Auflösung des Potis
das hergibt.
Gute Erfahrungen mit grossem Schwenkbereich und Auflösung habe ich mit
den Graupner C5XX Servos gemacht, für einen Gimbal würde ich aber
trotzdem auf BLDC setzen.
Peter schrieb:> Nun möchte ich den Servo sehr langsam um 180grad bewegen. Hierfür stehen> wir 2000Schritte von A nach B zur Verfügung. Alle paar ms erhöhe ich> meinen Positionswert um eine Stelle.
Alle paar ms macht keinen Sinn, du kannst ja nur alle 20ms einen neuen
Wert vorgeben.
> Auf einem LCD-Display zählt der> Wert langsam nach oben und auf meinem Oszilloskop sieht man sehr schön> wie der Balken (High-Time) sehr langsam immer breiter wird.>> Allerdings läuft mein Servo nicht sehr langsam und geschmeidig von A> nach B sondern macht immer ziemlich rucklige Schritte. Er bewegt sich in> gewissen "Stößen" weiter. Wenn ich den Servo mit der Hand etwas belaste> läuft er viel geschmeidiger. Ich würde die 180grad gerne sehr> geschmeidig über 1-20sek erreichen.
Also, ein (analoges) Servo hat ein Deadband von ca. 5µs bezogen auf die
Pulsdauer. Wenn sich dein Servopuls um weniger ändert, bewegt sich das
Servo garnicht. Irgendwann überschreitest du diesen Wert, das Servo
dreht sich ein klein wenig. Das ist aber längst abgeschlossen, bevor du
einen neuen Wert lieferst, der wieder aus dem Deadband herauskommt. Wenn
du jetzt mechanisch bremst, dreht das Servo langsamer und das Ruckeln
wird nicht so deutlich.
Ich würd es mal mit einer kürzeren Periodendauer probieren. Viele Servos
kommen auch mit 10ms klar, digitale häufig auch mit 3-4ms. Ob das dann
"geschmeidig" genug wird, kA. Außergem würde ich die Spannung für das
Servo so klein wie möglich wählen, die laufen ab 4V. Ob dann die Kraft
noch reicht, ebenfall kA
MfG Klaus
Matthias Sch. schrieb:> Frank The Tank schrieb:>> Mal ne andere Frage, was heisst bei dir "Servo"?> Was ist daran unklar?
Weil es einige Unterschiedliche Motorentypen gibts die als Servo gelten.
> Peter schrieb:>> Verwendet wird ein Modellbauservo (MG996r)> Das ist ein normales mit DC-Motor und Brückenansteuerung - vermutlich> eines der vielen mit M51660L o.ä.
Habe das oben nicht gelesen...
flo schrieb:> Peter schrieb:> Jedoch läuft der Servo immernoch ruckweise vorwärts. Ich habe das Gefühl> ein Servo kann keine so langsamen Bewegungen?>> doch, ein servo kann normalerweise auch langsame bewegungen ohne zu> ruckeln!
Nein, normale analoge Servos haben einen Totbereich in dem sie nicht
reagieren. Erst wenn die Abweichung gross genug ist, läuft der Servo an
und wenn er die Zielposition erreicht stoppt er wieder.
Das kann 100 Schritte ergeben. Erst besondere Präzisionsservos lösen
beispielsweise 2000 Schritte auf, bei üblich gestörtem Eingangssignal
sind die aber immer am zittern und verbrsuchen Strom.
Ich bin immer noch der Meinung, daß ein Modellbauservo nicht ruhig genug
läuft für eine geschmeidige Kamerafahrt.
Schon das Getriebe hat zuviel Spiel und zuviel Reibung. Einfache
Gleichstrommotoren intern auch. Deshalb werden für solche Systeme
typischerweise bürstenlose Direktantriebe verwendet.
Hallo,
danke für die zahlreichen Antworten.
Habe das ganze eben mal mit Hardware-PWM probiert (Mode15 etc).
Mit dem Oszi ein wunderbares Singla erzeugt. Bei sehr langsamen
Bewegungen wieder das gleiche Ergebnis.
Liegt wohl wirklich am Servo...
Habe mal ein Video aufgenommen und lade es gerade in Youtube hoch. (Link
kommt wenn hochgeladen)
Vielleicht hilft es weiter und man sieht meine Problematik.
Ich habe mittlerweile das Gefühl meine Idee mit dem Servo ist einfach
der falsche Ansatz. :(
Grüße
Peter schrieb:> Ich habe mittlerweile das Gefühl meine Idee mit dem Servo ist einfach> der falsche Ansatz. :(
Auf Position geregelte Antriebe mit relativ großer Hystere und eher
mäßiger Mechanik können das nun mal nicht. Die Hystere spart zwar Strom,
ist aber hinderlich für einen gleichmäßigen Lauf.
Und natürlich ist es sinnlos, den Sollwert häufiger zu ändern, als die
Sollposition zum Servo übertragen wird.
Peter schrieb:> Habe mal ein Video aufgenommen und lade es gerade in Youtube hoch. (Link> kommt wenn hochgeladen)
Wie lange braucht das denn zum hochladen?
Peter schrieb:> Nun möchte ich den Servo sehr langsam um 180grad bewegen. Hierfür stehen> wir 2000Schritte von A nach B zur Verfügung. Alle paar ms erhöhe ich> meinen Positionswert um eine Stelle. Auf einem LCD-Display zählt der> Wert langsam nach oben und auf meinem Oszilloskop sieht man sehr schön> wie der Balken (High-Time) sehr langsam immer breiter wird.
Wenn dein Atmega8 den Servo steuert und gleichzeitig das Display, kann
es über das Display-Interrupt zu timingproblemen in der Servosteuerung
kommen.
Schalte das Display mal softwaremäßig ab, schau, ob es noch ruckelt und
berichte.
Leo schrieb:> Wenn dein Atmega8 den Servo steuert und gleichzeitig das Display, kann> es über das Display-Interrupt zu timingproblemen in der Servosteuerung> kommen.
Wieso verrät dir deine Glaskugel, dass das Display Interrupts benutzt,
die den Timer stören und meine nicht?
Wolfgang schrieb:> Wieso verrät dir deine Glaskugel, dass das Display Interrupts benutzt,> die den Timer stören und meine nicht?
Wird wohl ein Unterschied in der Bezugsquelle sein - nicht jede
Glaskugel gleicht der anderen. Das LCD isses aber nicht, hat der TE
schon ausprobiert, wie o. a.
Es ist sehr abhängig von der Qualität der Servos. Ich habe letztes Jahr
zwei Graupner Servos dazu benutzt, ferngesteuert Fokus und Blende einer
EB (Steady-)Cam zu ziehen und das läuft sehr sauber, geräuschlos und
ruckelfrei. Allerdings musste ich schon aus einer Handvoll dieser Servos
mir die besten raussuchen. Graupner musste es wegen der Bauform mit dem
Ring unterm Servohorn sein.
Zum Schluss gewann ein C515 und ein C505, wimre.
Peter schrieb:> endlich ist das Video hochgeladen:> Youtube-Video "Atmega8 + Servo = Problem"
Wenn du einen Video zum Hochladen auf Youtube aufzeichnest, wäre es gut,
sich vorher zu überlegen, dass mein bei 16:9 und Querformat etwa drei
mal mehr Bildschirmfläche zur Verfügung hätte. Insbesondere in der
Totalen, in der gerade mal 11% des Bildes relevante Bildbereiche
enthalten, bleiben sonst nur knapp 4% des Videobildes für Information -
das könnte man bei vernünftiger Aufteilung besser auf einer Briefmarke
unterbringen.
-1
Guten Morgen,
Display wurde schon komplett aus dem Code entfernt.
Genauso wurde der Servo schon per Hardware-PWM angesteuert und der Servo
machte dieselben Bewegungen.
Ich glaub es ist wirklich die Hardware (Billigservo)...
Ich schau mal was ein besseres Servo kostet.
Das Video ist mit dem iPhone aufgenommen und direkt hochgeladen. An den
PC habe ich dabei nicht gedacht... Sorry!
Grüße
Peter schrieb:> Das Video ist mit dem iPhone aufgenommen und direkt hochgeladen.
Auch ein iPhone sollte sich doch quer halten lassen. Welec DSO und Servo
so nebeneinander anzuordnen, dass Display und Servo das Bild halbwegs
ausfüllen, sollte so schwierig auch nicht sein :-(
10 Gang poti direkt an deine Drehachse dann hast du schon mal kein Poti
Problem.
Die meisten servos haben ne Auflösung von 512 bei analog Servos
neuere1024 digital Servos .
Matthias Sch. schrieb:> Ich habe letztes Jahr> zwei Graupner Servos dazu benutzt, ferngesteuert Fokus und Blende einer> EB (Steady-)Cam zu ziehen und das läuft sehr sauber, geräuschlos und> ruckelfrei.
Es macht aber einen Unterschied, ob du die Blende einer Kamera damit
verstellen willst oder die ganze Kamera drehen.
mahwe schrieb:> Die meisten servos haben ne Auflösung von 512 bei analog Servos
Analogservos haben gar keine Auflösung, da sie ... naja, eben analog
sind.
Rolf Magnus schrieb:> Es macht aber einen Unterschied, ob du die Blende einer Kamera damit> verstellen willst oder die ganze Kamera drehen.
Allerdings. Hier war es ein C-Mount Teleobjektiv der 400mm Klasse und
einer benötigten Stellkraft bei Blende von etwa 30-40Ncm - schon etwas
mehr Power. Der Fokusring braucht etwa 40-60Ncm. Soviel wirds bei einer
kleinen Digicam nicht brauchen.
Rolf Magnus schrieb:> Analogservos haben gar keine Auflösung, da sie ... naja, eben analog> sind.
Na irgendwie doch. Alles was über Hysterese/Jitter hinaus geht, ist
vergebene Liebesmühe und ist damit nicht zur gezielten Ansteuerung einer
Position nutzbar. Somit ist die Auflösung auch für Analogservos
begrenzt, durch zwar durch die stochastischen Positionsfehler.
Es gäbe noch'n Weg mit mehr Bastelei, indem man das RC-Servo in der Art
eines Endlosservos umbaut.
Bei diesem Umbau wird üblicherweise das Servopoti ausgebaut, der
Endanschlag entfernt und das Poti durch zwei gleiche Festwiderstände
ersetzt.
Damit wird quasi eine fixe Mitte geschaffen. Abweichungen davon versucht
das Servo mit Gegendrehung zu kompensieren, mangels mechanischem
Feedback klappt natürlich nicht mehr, das Servo dreht dauernd.
Mit der Differenz zum "Mitten"-Puls lässt sich die Drehgeschwindigkeit
in gewissem Maß steuern, abhängig vom im Servo eingebauten Controller.
Entfernt man das Servopoti nicht, sondern klemmt man es an den ADC des
µC, so kann dieser die Regelung übernehmen und das Laufverhalten über
die Abweichung zum Mitten-Puls steuern. Wie gut das letztendlich klappt,
hängt vom steuerbaren Drehgeschwindigkeitsbereich ab.
mahwe schrieb:> 10 Gang poti direkt an deine Drehachse dann hast du schon mal kein Poti> Problem.
Die Drehachse des Servos macht in der Regel 180° zwischen Anfang und
Ende. Dort ein 10-Gang-Poti ran und das Poti bewegt sich gerade mal ein
20stel seines möglichen Weges. Ich finde, damit hast du erst recht ein
Poti-Problem. Das interne Poti eines Servos nutzt den Drehwinkel fast
vollständig aus, aber ein 10-Gang-Poti gerade mal zu 5%...
Wolfgang schrieb:> Somit ist die Auflösung auch für Analogservos begrenzt, durch zwar durch> die stochastischen Positionsfehler.
Das ist nicht Auflösung, sondern Genauigkeit.
MWS schrieb:> Mit der Differenz zum "Mitten"-Puls lässt sich die Drehgeschwindigkeit> in gewissem Maß steuern, abhängig vom im Servo eingebauten Controller.
Das klappt aber nur bei Analogservos. Die digitalen geben auch bei sehr
kleinen Abweichung ziemlich schnell Vollgas - zumindest die, die ich
bisher im Einsatz hatte.
Ich benutze oft die billigsten Analogservos von Conrad - da ruckelt nie
was (habe schon ca. 20 Stück verbaut).
Die halten halt nur nicht ewig wegen der Plastikgetriebe.
(das nur mal als Info am rand)