mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo verhält sich nicht wie erwartet


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe noch nie etwas mit Servos gemacht und habe mir entsprechend das 
günstigste Servo gekauft, welches ich finden konnte. Vermutlich war das 
bereits ein Fehler ;).

Ich erzeuge mit einem Mega8 eine 64 Hz PWM. Über ein Poti, welches ich 
mit dem ADC einlese erzeuge ich den Duty Cycle von der PWM.

Wenn ich das Servo von Hand auf "0" drehe und anschließend anfange das 
Potentiometer zu drehen, fängt das Servo bei ca. 1ms an wie erwartet, 
sich zu drehen. Kurz vor 2ms hört es auf und klackert nur noch vor sich 
hin. Kein Zittern, rein akustisch.

Drehe ich das Potentiometer wieder runter passiert nichts. Ich muss das 
Servo von Hand wieder auf "0" drehen, damit es wieder auf die PWM 
reagiert.

Zusätzlich hat es bei diesen 1-2ms nur einen Drehbereich von ca. 15°. 
Das soll so bestimmt nicht sein. Irgendwelche tips?

Servo: https://www.ripmax.de/ripmax-sb09-servo-9g-1-6kg.html
#define F_CPU 1000000UL

#include <avr/io.h>
#include <stdbool.h>
#include "util/delay.h"

int main(void){
  
  DDRB = 0xff;
  DDRC = ~(1<<5);
  DDRD = 0xff;
  
  PORTB = 0;
  PORTC = 0;
  PORTD = 0;
  
  TCCR2 = (1<<COM21) | (0<<COM20) | (1<<WGM21) | (1<<WGM20) | (1<<CS22) | (0<<CS21) | (0<<CS20);
  OCR2 = 0;
  
  ADMUX = (1<<REFS0) | (1<<MUX2) | (1<<MUX0);
  ADCSRA = (1<<ADFR) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
  ADCSRA |= (1<<ADSC);
  
    while (1){
    OCR2 = F_CPU / 64 / ((uint32_t)ADC * 4000 / 1024);
    }
}

Autor: Mario M. (thelonging)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, aber das kenne ich bereits. Ich habe meine PWM, das Servo an 5V 
und es bewegt sich doch auch hin und her.

Nur gibt es einen auffällig kleinen Wendekreis und einen Point of no 
return, nachdessen PWM Wert ich das Servo von hand zurückdrehen muss.

Verhalten sich hier digitale Servos besser?

Autor: Jens G. (jensig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich erzeuge mit einem Mega8 eine 64 Hz PWM. Über ein Poti, welches ich
>mit dem ADC einlese erzeuge ich den Duty Cycle von der PWM.

Wird ein Servo nicht üblicherweise mit 400Hz angesteuert?

>Verhalten sich hier digitale Servos besser?

Nö. Warum auch Hat ja nix mit analog/digital zu tun, sondern entweder 
mit Deiner ansteuerung, oder vielleicht doch eine Eigenart Deines Servos 
(falls es nicht an der Frequenz liegen sollte)

: Bearbeitet durch User
Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut dem tutorial sind es 20ms, was 50Hz entspricht.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Jens G. schrieb:
> Wird ein Servo nicht üblicherweise mit 400Hz angesteuert?

Üblich sind 50 Hz.

> TCCR2 = (1<<COM21) | (0<<COM20) |
>         (1<<WGM21) | (1<<WGM20) |
>         (1<<CS22) | (0<<CS21) | (0<<CS20);

Timer 2 ( 8 bjt)
Fast PWM, TOP=0xFF
Clear OC2 on compare match
Clock Prescaler 64

Dein Systemtakt ist 1 MHz, das durch 64 geteilt ergibt 15625 Hz, bzw. 
eine Schrittweite von 1/15625 = 64 µs

Da der Timer immer bis 255 zählt, erzeugt er eine PWM Frequenz von 
15625/256 = 61 Hz.

Für 1 ms Pulse brauchst du in OCR den Wert 1 ms/64 µs = 16
Für 1,5 ms Pulse brauchst du in OCR den Wert 1,5 ms/64 µs = 23
Für 2 ms Pulse brauchst du in OCR den Wert 2 ms/64 µs = 32

Ich vermute, dass dein ADC Werte von 0 bis 1023 liefert. Rechnen wir mal 
nach, was deine Berechnung bei mittlerer Potistellung ergibt:

> OCR2 = F_CPU  64  ((uint32_t)ADC * 4000 / 1024);

512 * 4000 = 2048000
2048000 / 1024 = 2000
1000000 / 64 = 15625
15625 / 2000 = 7,8

Hier liegt der Fehler. Das ist schon weit unterhalb des richtigen 
Wertebereiches.

Ich würde die Berechnung anders angehen:

16 ergibt die kleinste Pulsbreite, kann man als Konstante hinschreiben.
Bei maximaler Potistellung (ADC 1023) willst du weitere 16 dazu 
addieren. 1023/16 = 64. Daraus ergibt sich:

OCR2 = ADC/64+16

Bersonders attraktiv finde ich bei diesem Ansatz, dass die teure 32bit 
Multiplikation entfällt.

Falls ich mich nicht irre. Probiere es aus.

: Bearbeitet durch User
Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OCR2 = 16 + ((uint32_t)ADC * 16 / 1024);

Jetzt kann ich eine schöne 64Hz PWM mit 1-2ms HIGH erzeugen. Jetzt 
bewegt sich das Servo aber überhaupt nicht mehr. Macht nur Knack 
Geräusche.

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe braun = GND, rot = 5V, orange = PWM :)

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss das Poti ganz langsam drehen, dann geht der Servo auch voll 
rum. Wenn ich zu schnell drehe (was heißt nicht in zeitlupe zu drehen), 
kommt der aus dem Trott und macht einfach klackendes Geräusch.

Dann muss ich das Poti wieder an die Position fahren, wo der Servo sich 
aufgehört hat zu drehen und wieder ganz ganz langsam weiter drehen (das 
Poti).

Autor: Mike J. (linuxmint_user)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist das Poti im Servo defekt oder verdreckt, so dass die 
Rückkopplung fehlerhaft ist.

Ideal wäre eine Schlitzscheibe mit optischem Encoder (etwa wie bei den 
alten Computermäusen) direkt am Motor, das wäre dann auch genauer.

Autor: Arno M. (morri65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht zieht der Servo auch einfach nur zu viel Strom und der 
Prozessor geht durch den Reset. Was hast du für eine Versorgung?

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Albert schrieb:
> Jetzt kann ich eine schöne 64Hz PWM mit 1-2ms HIGH erzeugen.

Hast du das nachgemessen?

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arno M. schrieb:
> Vielleicht zieht der Servo auch einfach nur zu viel Strom und der
> Prozessor geht durch den Reset. Was hast du für eine Versorgung?

Kann ich mal prüfen, aber:

Wolfgang schrieb:
> Hast du das nachgemessen?

die PWM sieht am Oszilloskop nun sehr sauber aus. Per Poti auf 1-2ms 
einstellbar bei 64Hz.

Autor: Christian M. (Firma: magnetmotor.ch) (chregu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Verhalten ist absolut nicht normal!

Aber was erwartest Du anderes, wenn die 50Hz nicht stimmen?!
Ausserdem muss die Speisung gut abgeblockt und dem Strom entsprechend 
ausgelegt werden! Mach mal Kondensatoren rein!

Gruss Chregu

Autor: Mike J. (linuxmint_user)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian M. schrieb:
> Aber was erwartest Du anderes, wenn die 50Hz nicht stimmen?!
Eigentlich benötigt der Servo doch nur ab und zu einen Rechteckimpuls 
der 1-2ms breit ist und dazu eine gewisse Ruhepause.
Die Periode war glaube ich 25ms lang. Bei den 
Kanal-Multiplex-Schaltungen hat man in der Zeit etwa 8 Kanäle übertragen 
können.

> Ausserdem muss die Speisung gut abgeblockt und dem Strom entsprechend
> ausgelegt werden! Mach mal Kondensatoren rein!

Ich hatte einen Tiefpass gebaut, 100µF Kondensator direkt an den Motor 
und der wurde über einen kleinen Widerstand (10 Ohm) mit 5V (mit 1000µF 
nach Masse) gespeist. Zur Platine gingen die 5V über eine Diode zu einem 
100µF Kondensator und dann zum 3,3V Spannungsregler.

Ich konnte die Spannungsversorgung zum Motor per Transistor abschalten 
wenn ich die Position erreicht hatte. Diese kleinen, blauen 9g-Servos 
hatten genügend Getriebewiderstand, so dass ich keine zusätzliche 
Energie benötigte um sie auf Position zu halten.
Die größeren, stärkeren Servos mit Metall-Getriebe hatten hingegen einen 
geringeren Getriebewiderstand, das war in meinem Fall ungünstig.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian M. schrieb:
> Aber was erwartest Du anderes, wenn die 50Hz nicht stimmen?!

Der übliche Pulsabstand von 20ms ist einem Modellbauservo gewöhnlich 
ziemlich egal. Die Sollposition ist ausschließlich in der Dauer des 
(meist) positiven Pulsteils kodiert.

Autor: Norbert S. (norberts)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ich habe von Empfängern schon von 30-60Hz alles Mögliche gesehen. Das 
interessiert die Servos nicht.
Ich tippe auch auf Stromversorgung.
Auch ein 9g Servo zerrt mal gerne mit 1-2A beim Anlauf.
Wenn die Servosignale sauber aussehen, liegt es zu 99% an der 
Versorgung.

Gruß,
Norbert

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werde nacher mal einen 100uf elko parallel zu der 
spannungsversorgung vom 5v/gnd vom servo schalten, danke.

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, die 100uF habens gebracht!

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein Problem: Wenn ich mit dem Poti nun regle, fährt es in die 
gewünschte Position. Soweit ok.

Mache ich in Software einen sofortigen Sprung um 180° fährt das Servo 
nur ganz langsam klackernd in seine Position :(.

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich brauchte einfach mehr uF.. ;)

Autor: äxl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich find's super, wenn man auch mal über sich selbst lachen kann ;)

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike J. schrieb:
> Ich hatte einen Tiefpass gebaut, 100µF Kondensator direkt an den Motor
> und der wurde über einen kleinen Widerstand (10 Ohm) mit 5V (mit 1000µF
> nach Masse) gespeist.

Bei einem Anlaufstrom von 1A hast du an dem "kleinen" Widerstand einen 
Spannungsabfall von 10V. Wenn der Widerstand sein muss, sitzt der 1000µF 
Kondensator zumindestens auf der falschen Seite. Der muss die Lastspitze 
durch den Motor direkt abpuffern können ;-)

Autor: Mike J. (linuxmint_user)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Albert schrieb:
> Ich brauchte einfach mehr uF.. ;)

Hat die Elektronik im Servo keine genügende Abblockung um solche 
Spannungseinbrüche bei plötzlicher Belastung des Motors mal kurz 
abfangen zu können?

Autor: Teo D. (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike J. schrieb:
> Hat die Elektronik im Servo keine genügende Abblockung um solche
> Spannungseinbrüche bei plötzlicher Belastung des Motors mal kurz
> abfangen zu können?

Für den normalen Einsatz reicht der sicher. Hier vermute ich, ist das 
dem Aufbau (Breadboard, Krokoklemmen,...?) geschuldet.

Autor: Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Teo D. schrieb:
> Für den normalen Einsatz reicht der sicher. Hier vermute ich, ist das
> dem Aufbau (Breadboard, Krokoklemmen,...?) geschuldet.

Ne, Prototyp auf Lochraster gelötet :). Erst 220uF parallel, dann konnte 
ich mit Poti die Position regeln. mit nun 440uf funktionieren auch 
plötzliche Sprünge von einem zum anderen Ende.

Autor: Udo S. (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Albert schrieb:
> Ich brauchte einfach mehr uF.. ;)

Nein, du brauchst eine stärkere Stromversorgung für den Servo.

Albert schrieb:
> Mache ich in Software einen sofortigen Sprung um 180° fährt das Servo
> nur ganz langsam klackernd in seine Position :(.

Weil die Stromversorgung zusammenbricht und damit die interne 
Servoregelung resettet oder (falls rein analog) spinnt.

Mike J. schrieb:
> Hat die Elektronik im Servo keine genügende Abblockung um solche
> Spannungseinbrüche bei plötzlicher Belastung des Motors mal kurz
> abfangen zu können?

Wofür? Die Servos werden normalerweise von Akkus gespeist. Warum sollte 
man also in so einen Servo einen Elko packen der den Bauraum für die 
Elektronik mal schnell verdoppelt?

Autor: Teo D. (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Albert schrieb:
> Teo D. schrieb:
>> Für den normalen Einsatz reicht der sicher. Hier vermute ich, ist das
>> dem Aufbau (Breadboard, Krokoklemmen,...?) geschuldet.
>
> Ne, Prototyp auf Lochraster gelötet :).

Ne...? Zeig mal, inkl. Stromversorgung, Zuleitungen, etc.
Model u. Marke des Servos, wäre auch interessant. Wenns nicht daran 
liegt, weiß man wenigsten, wovon man die Finger lassen sollte. :)

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Teo D. schrieb:
> Hier vermute ich, ist das
> dem Aufbau (Breadboard, Krokoklemmen,...?) geschuldet.

Wohl eher, dem "kleinen" Widerstand

Mike J. schrieb:
> Ich hatte einen Tiefpass gebaut, 100µF Kondensator direkt an den Motor
> und der wurde über einen kleinen Widerstand (10 Ohm) mit 5V ... gespeist.

Autor: Teo D. (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Wohl eher, dem "kleinen" Widerstand

Was interessiert mich Mike's Aufbau?!

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian M. schrieb:
> Aber was erwartest Du anderes, wenn die 50Hz nicht stimmen?!

Das wird nicht die Problemursache sein. Alle mir bekannten Servos 
funktionieren auch mit wesentlich mehr als 50Hz und auch mit etwas 
weniger.

> Ausserdem muss die Speisung gut abgeblockt und dem Strom entsprechend
> ausgelegt werden! Mach mal Kondensatoren rein!

Ja. Ich würde sogar erst mal eine separate Stromversorgung für die 
Servos verwenden. Gerne 4 Mignon Zellen.

Autor: Markus M. (adrock)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vom TO:

"Ich hatte einen Tiefpass gebaut, 100µF Kondensator direkt an den Motor
und der wurde über einen kleinen Widerstand (10 Ohm) mit 5V (mit 1000µF
nach Masse) gespeist."

Du solltest die Servos direkt speisen, OHNE diesen Widerstand! Warum 
hast Du diesen "Tiefpass" überhaupt gebaut? Der Controller hat doch 
sowieso seinen eigenen Spannungsregler.

Nimm doch diesen 10 Ohm Widerstand einfach raus. Er kann im Extremfall 
sogar durchbrennen, da dort viel Leistung verbraten wird.

Wenn Du für irgendeinen Schaltungsteil eine geglättete Spannung 
brauchst, kannst Du diesen Teil ja separat versorgen mit einem Tiefpass, 
wobei eine Induktivität (L/C Kombination) wohl besser wäre als eine R/C 
Kombination.

Autor: Mike J. (linuxmint_user)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus M. schrieb:
> Vom TO:

Der TO ist Albert. Mein Aufbau hat gut funktioniert und sollte auch 
vornehmlich die Störungen nicht zurück in die Versorgung speisen, also 
daher ein Tiefpass erster oder zweiter Ordnung.

Markus M. schrieb:
> Er kann im Extremfall
> sogar durchbrennen, da dort viel Leistung verbraten wird.

Dann dient er als billige Sicherung. Solche Strombegrenzungen sollte man 
eigentlich überall einbauen wo Fehler absehbar sind. Zum Beispiel beim 
Aufbau von Prototypen oder bei Versuchsaufbauten. Es ist besser wenn die 
Bauteile in der Versorgung abrauchen (und nur so kaputt gehen können 
dass die Versorgung einfach nur ausfällt) als die davon gespeiste 
Schaltung.
Der eine Teil lässt sich leicht ersetzen und der andere eben nur mit 
viel Mühe/Kosten/Zeit.

Widerstände (0 Ohm) kann man auch gerne mal aus Schaltungen entnehmen 
und damit dann bestimmt Schaltungsteile abtrennen.

Irgend eine Entstörung muss man ja dem Servo spendieren, das Ding ohne 
Entstörung zu betreiben wäre nicht sehr weise.

Autor: Harald W. (wilhelms)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Albert schrieb:

> Ich brauchte einfach mehr uF.. ;)

Uf, uf sagt Winnetou...

Autor: Markus M. (adrock)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike J. schrieb:

> Der TO ist Albert. Mein Aufbau hat gut funktioniert und sollte auch
> vornehmlich die Störungen nicht zurück in die Versorgung speisen, also
> daher ein Tiefpass erster oder zweiter Ordnung.

Ah ok, sorry :)

Aber einen Widerstand in die Servostromversorgung ist nicht sinnvoll. 
Die Dinger haben die Angewohnheit hohe Spitzenströme zu erzeugen und man 
möchte sie deshalb so niederohmig wie möglich an die Versorgungsspannung 
anbinden.

Davon können Dir die RC Jungs ein Lied singen ;-)

Warum es bei Albert so schlecht funktioniert ist allerdings unklar. Es 
kann eigentlich nur an einer mangelhaften Spannungsversorgung liegen. 
Die Servos sind normalerweise ziemlich tolerant was die 
Wiederholfrequenz angeht, alles von wenigen Hz bis zu 50..60 Hz sollte 
wohl i.O. sein.

Das so große Pufferkondensatoren benötigt werden ist zumindest sehr 
seltsam...

Autor: J. T. (chaoskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens G. schrieb:
> Wird ein Servo nicht üblicherweise mit 400Hz angesteuert?

Ne, die alte Technik war 20ms von Impuls zu Impuls, also 50Hz. Die 400Hz 
sind für moderne Servos. Wobei die Frequenz als solche ziemlich 
unkritisch ist. Ich hab die 20ms auch schon auf Werte gedrückt, das ich 
so gerade die Pulslänge für Vollanschlag unterbringen konnte. Einige 
Servos halten sich auch nicht an die 1-2ms. Mein extremster ging von 
0.7-2.4ms.

Autor: Sebastian S. (amateur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manchmal hat man die Scheuklappen auf und merkt es gar nicht!

Ein Oszilloskop scheint ja vorhanden zu sein, die Idee es an die 
Versorgungsspannung zu klemmen lässt wohl noch auf sich warten.

Autor: Marvin M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Albert schrieb im Beitrag #5817979 um 09:49
> Erst 220uF parallel, dann konnte
> ich mit Poti die Position regeln. mit nun 440uf funktionieren auch
> plötzliche Sprünge von einem zum anderen Ende.

11 Beiträge, und keiner hat gemerkt, dass das Problem längst gelöst 
ist...

Autor: Tim T. (tim_taylor) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marvin M. schrieb:
> Albert schrieb im Beitrag #5817979 um 09:49
>> Erst 220uF parallel, dann konnte
>> ich mit Poti die Position regeln. mit nun 440uf funktionieren auch
>> plötzliche Sprünge von einem zum anderen Ende.
>
> 11 Beiträge, und keiner hat gemerkt, dass das Problem längst gelöst
> ist...

Doch doch, aber bei µC.net steigt man eben nicht von toten Pferden ab, 
hier wird bis zum bitteren Ende weiter geritten.

Und in 6 Monaten bis 8 Jahren wird der Thread dann wieder von irgend 
einem Nekromanten ausgebuddelt der dann munter lustig weitere 
Leichenschändung betreibt...

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.