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


von Albert (Gast)


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
1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <stdbool.h>
5
#include "util/delay.h"
6
7
int main(void){
8
  
9
  DDRB = 0xff;
10
  DDRC = ~(1<<5);
11
  DDRD = 0xff;
12
  
13
  PORTB = 0;
14
  PORTC = 0;
15
  PORTD = 0;
16
  
17
  TCCR2 = (1<<COM21) | (0<<COM20) | (1<<WGM21) | (1<<WGM20) | (1<<CS22) | (0<<CS21) | (0<<CS20);
18
  OCR2 = 0;
19
  
20
  ADMUX = (1<<REFS0) | (1<<MUX2) | (1<<MUX0);
21
  ADCSRA = (1<<ADFR) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
22
  ADCSRA |= (1<<ADSC);
23
  
24
    while (1){
25
    OCR2 = F_CPU / 64 / ((uint32_t)ADC * 4000 / 1024);
26
    }
27
}

von Mario M. (thelonging)


Lesenswert?


von Albert (Gast)


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?

von Jens G. (jensig)


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
von Albert (Gast)


Lesenswert?

Laut dem tutorial sind es 20ms, was 50Hz entspricht.

von Stefan F. (Gast)


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.

von Albert (Gast)


Lesenswert?

1
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.

von Albert (Gast)


Lesenswert?

Ich habe braun = GND, rot = 5V, orange = PWM :)

von Albert (Gast)


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).

von Mike J. (linuxmint_user)


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.

von Arno M. (morri65)


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?

von Wolfgang (Gast)


Lesenswert?

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

Hast du das nachgemessen?

von Albert (Gast)


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.

von Christian M. (Gast)


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

von Mike J. (linuxmint_user)


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.

von Wolfgang (Gast)


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.

von Norbert S. (norberts)


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

von Albert (Gast)


Lesenswert?

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

von Albert (Gast)


Lesenswert?

Danke, die 100uF habens gebracht!

von Albert (Gast)


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 :(.

von Albert (Gast)


Lesenswert?

Ich brauchte einfach mehr uF.. ;)

von äxl (Gast)


Lesenswert?

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

von Wolfgang (Gast)


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 ;-)

von Mike J. (linuxmint_user)


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?

von Teo D. (teoderix)


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.

von Albert (Gast)


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.

von Udo S. (urschmitt)


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?

von Teo D. (teoderix)


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. :)

von Wolfgang (Gast)


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.

von Teo D. (teoderix)


Lesenswert?

Wolfgang schrieb:
> Wohl eher, dem "kleinen" Widerstand

Was interessiert mich Mike's Aufbau?!

von Stefan F. (Gast)


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.

von Markus M. (adrock)


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.

von Mike J. (linuxmint_user)


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.

von Harald W. (wilhelms)


Lesenswert?

Albert schrieb:

> Ich brauchte einfach mehr uF.. ;)

Uf, uf sagt Winnetou...

von Markus M. (adrock)


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...

von J. T. (chaoskind)


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.

von Sebastian S. (amateur)


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.

von Marvin M. (Gast)


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...

von Tim T. (tim_taylor) Benutzerseite


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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.