Servo verhält sich nicht wie erwartet

Gast #5817315
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
}
Gast #5817328
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?
#5817332
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)
Gast #5817363
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.
Gast #5817452
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).
Gast #5817588
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
#5817614
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.
#5817763
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
Gast #5817871
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 :(.
Gast #5817936
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 ;-)
Gast #5817979
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.
#5817981
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?
#5817997
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. :)
Gast #5818457
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.
#5818479
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.
#5818570
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.
#5818592
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...
#5818600
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.
Gast #5818650
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...
Gast #5818653
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren