Forum: Mikrocontroller und Digitale Elektronik Servozittern bei PWM


von Alexander O. (ogi)


Lesenswert?

Hallo Zusammen

Ich erzeuge über ein Lm3s8962-Eval-Board ein PWM Signal für ein Volz 
Servo des Typs DA-20-06-105. Das Board hat 6 PWM-Ausgänge von denen 4 
für Peripherien wie Switches, LED und Speaker belegt sind. Ich verwende 
einen der 2 freien PWM-Ausgänge.

Servo:
Betriebsspannung: 6-7,2 Volt
Impulswiederholrate: 7-20 ms
Impulslänge ist die übliche: 0,9-2,1 ms
Das Servo wird über ein DC-Netzgerät bestromt (6,5 Volt).

Ich lass mir das PWM-Signal parallel auf einem Osci anzeigen und dort 
sieht auch alles soweit ganz gut aus.
Ich habe die Pulswiederholrate momentan bei 15ms, hatte sie aber auch 
schon mal auf 10 ms und 20 ms.
Mit einem kleinen Programm kann ich über 2 Switches mir für paar 
Sekunden einen rechts oder links Ausschlag erzeugen. Die Pulslänge geht 
dann von 1,5 ms entweder auf 0.9 ms oder auf 2,1 ms je nach dem welcher 
Switch betätigt wird.

Das Servo zittert in der neutralstellung ca. 3 Skunden. Bei Betätigung 
der Switches bewegt es sich in die jeweilige Richtung und zittert aber 
dabei die ganze Zeit. Wenn es dann wieder in die Neutral- bzw. 
Mittelstellung zurück kommt zittert es noch paar Sekunden und ist dann 
wieder "ruhig".
Wenn ich das mit einem Regler vergleiche, würde ich sagen: es muss sich 
in den jeweiligen positionen erst einschwingen. Aber als Modellflieger 
weiß ich, dass das nicht so ist.
Ein zweites Servo hat das gleiche Verhalten gezeigt! Servokabel ist 
geschirmt und ca. 30cm lang, Netzgerät liefert eine konstante Spannung.

Hat hier jemand eine Idee woher die Störungen kommen könnten durch die 
das Servo zittert?

Grüße
Alex

von Smarti (Gast)


Lesenswert?

Hallo Alex,

ich konnte das Servozittern auch schon beobachten und zwar unter 
folgenden Bedingungen:

- Servos am Anschlag
- Servos unter Last

Ansonsten nach deinen Angaben sollten die Servos sauber laufen...

LG Smarti

von Purzel H. (hacky)


Lesenswert?

Ja. Analoge Servos unter Last zittern mit der Updatefreuquenz. 
Digitalservos zittern nicht. Allenfalls sollte man die Speisung pruefen. 
Wenn die Servos viel Strom ziehen, wuerde die Speisung mit der 
Updatefrequenz einbrechen.

von Alexander O. (ogi)


Lesenswert?

Vielen Dank für die schnellen Antworten.

Das Servo ist ein digitales und steht nicht unter Last. Ich werde jetzt 
aber mal noch ein anderes Netzgerät ausprobieren und mich wieder melden.

Mir ist nämlich auch gerade aufgefallen, dass wenn die PWM-Leitung nicht 
am Mikrocontroller angeschlossen ist aber das Servo am Netzgerät hängt, 
hin und wieder mal ein kleiner "Zucker" kommt.

Grüße Alex

von Regler (Gast)


Lesenswert?

Vielleicht ein EMV Problem?

Wie lang/dick sind denn die Zuleitungen zum Servo, insbesondere die 
Signalleitung?

von Olaf (Gast)


Lesenswert?

> Ich lass mir das PWM-Signal parallel auf einem Osci anzeigen und dort
> sieht auch alles soweit ganz gut aus.

Schalte mal dein Oszi in die analoge Betriebart. <BG> Es kann sein das
deine PWM durch irgendetwas (Interrupt) gestoert wird und du das
auf einem digitalen Oszi nicht siehst.

Olaf

von Regler (Gast)


Lesenswert?

Und Schliess das Oszi möglichst NAHE am Servo an.

von Regler (Gast)


Lesenswert?

...schliess natürlich...

von Alexander O. (ogi)


Lesenswert?

Hallo Zusammen

Ich habe nun, nachdem ich die Spannung am Netzgerät aufgezeichnet habe, 
festegestellt, dass immer wieder kurzzeitige Spannungseinbrüche 
vorgekommen sind, was auf einen kurzzeitigen hohen Strom am Servos 
zurück zuführen ist.
Nach dem ich am Netzgerät jetzt einen 4700 µF Kondensator angeschlossen 
habe (von Pol zu Pol) ist der größte Teil des Zitterns weg. 4700 µF, 
weil ein Kollege diesen gerade zur Hand hatte, ich denke dass ein 
kleinerer auch geeignet wäre.
Das Servo zieht laut Datenblatt einen Maximalstrom von 3,5 A, das ist 
aber der Blcokierstrom! Mein Netzgerät bringt maximal 3 A. Ich hatte 
gedacht, dass es ausreicht, da ich das Servo eh gerade nicht belaste.
Nach dem ich den Kondensator nun zwischen die beiden Pole geschaltet 
habe und die Spannung noch mal analysiert habe, bricht diese immer 
wieder mal noch kurzzeitig ein! Diese Einbrüche sollte jetzt aber mit 
einem Netzgerät welches mehr Ampere liefert oder einem Akku weg gehen.

Ich werde mir jetzt mal ein Netzgerät organisieren und schauen das die 
Spannung konstant bleibt und melde mich dann mit den Ergebnissen wieder.


Zu den Tips der Forenteilnehmer:

- Die drei Servoleitungen sind nicht die üblichen Servokabel.
  Sie sind sehr gut geschirmt und von einander isoliert. Sie sind auch
  nur 30 cm lang

- Das Osci misst das PWM-Signal mit einem Tastkopf der ein <1 m
  langes Kabel hat direkt an dem Platinenpin an dem die
  Servosignalleitung angeschlossen ist. Näher kann ich leider nicht
  messen ohne das Servo auf zu schrauben.

- Auf dem Osci (TDS 210) gibt es, soweit ich gesucht habe, keinen
  analogen Modus.


Vielen Dank nochmal für eure Hilfe

Grüße Alex

von Karl H. (kbuchegg)


Lesenswert?

Alexander O. schrieb:

> Das Servo zieht laut Datenblatt einen Maximalstrom von 3,5 A, das ist
> aber der Blcokierstrom! Mein Netzgerät bringt maximal 3 A. Ich hatte
> gedacht, dass es ausreicht, da ich das Servo eh gerade nicht belaste.

Entweder dein Netzgerät hat in der Regelung einen Fehler oder aber was 
du siehst, hat mit dem Strom erst mal gar nichts zu tun.
Was du siehst wird wahrscheinlich vom Servomotor selber erzeugt. Genauer 
gesagt von seinen Bürsten. D.h. du müsstest die Motoren entstören.

(Was mich allerdings verblüfft. Denn Servomotoren sind in aller Regel 
entstört)

von Regler (Gast)


Lesenswert?

Alexander O. schrieb:
> Näher kann ich leider nicht
>   messen ohne das Servo auf zu schrauben.

Na dann schraub mal auf! Dann könntest Du nachmessen ob es eine 
Korrelation zwischen dem Spannungseinbruch und dem Eingangsignal gibt. 
Alternativ kannste ja ein anderes Servo (...falls zur hand...) 
anschließen...

Du solltest erstmal den Fehler eingrenzen: Servo, Zuleitung, uC-Board 
oder uC-Programm. Alles könnte Schuld sein. (Wobei eine geschirmte 
Einzeladerzuführung unwahrscheinlich Störungen auffängt.) Hatte selbst 
auch schon dumme Aussetzter, weil ein Stück Lötzinn sich auf die Platine 
verirrt hat.

Am einfachsten macht man das indem man Komponenten, die man Austauschen 
kann, austauscht. Also ist der Ansatz eine andere Versorgung zu 
organisieren, gar nicht so schlecht. Alternativ Ansteuerung und/oder 
Servo austauschen. Bei welchen Komponenten bist Du Dir denn sicher, dass 
sie 100% funktionieren?

Bei 3A Netzteil und 3.5A Spitzenstrom kann der Fehler auch gut durch die 
Unterdimensionierung auftreten. Dafür muss die Regelung gar nicht defekt 
sein. Das kann ja gewollt sein (SW: Strombegrenzung!)
Der Strom eines GSM ist in der Regel beim Anlaufen am größten. Treten 
die Einbrüche periodisch auf? Und dann noch mit der Regelfrequenz des 
Servos (falls bekannt)?
MAn ist das wahrscheinlicher, als dass ein Servo 
(gebraucht/neuwertig/selbstgebaut?) rumspinnt. Und wenn ein Motor 
entstört werden müsste, sollte er das auch sein, zumindest wenn es sich 
nicht um billigste Chinaware mit gefälschtem CE-Kennzeichen handelt.

Ein analoges Oszi brauchst Du bei 1 GS/s denke ich nicht.

von Regler (Gast)


Lesenswert?

Nochwas: Kannste den Strom, den der Servo zieht, messen? Auch mit dem 
Oszi?

von Olaf (Gast)


Lesenswert?

> Ein analoges Oszi brauchst Du bei 1 GS/s denke ich nicht.

Das Problem ist, es kann sein das alles bereits funktioniert,
aber das Programm nur einmal pro Sekunde eine falsche Position
ausgibt und der Servo dann sehr kurz woanders hinfahren will
bevor er 1ms spaeter wieder die richtige Position bekommt.

Wenn das Oszi aber immer schoen brav auf die normalen Servoimpulse
triggert dann sieht man das nicht. Bei einem analogen Oszi wuerde
man eventuell sehen das die Breite oder Position leicht zittert.

Vielleicht kann man ja bei einem digitalen Oszi mal 50 Pulse aufzeichen 
und dann mal kurz durchscrollen ob die alle gleichmaessig aussehen.

Olaf

von Alexander O. (ogi)


Angehängte Dateien:

Lesenswert?

Guten Morgen

Ich habe nun das Netzgerät gewechselt, jetzt hab ich ein Agilent E36320A 
welches mir auch den Strom der gerade fließt anzeigt. Das Netgerät 
liefert einen Maximalstrom von 7 A.

Das "Gesammtverhalten", wenn ich es mal so nennen darf, ist jetzt 
besser. Das Servo steht ruhig und fährt auch ohne Zuckungen in die 
jeweiligen Richtungen.

Wenn ich das Servo öfters nach rechts oder links fahren lasse fängt es 
irgendwann an wieder zu wackeln.

Ich habe jetzt folgendes ausprobiert und das Verhalten hat sich nicht 
verbessert:

- 2 identische Servos durch gewechselt (dig. Volz Servos, 105Ncm, ~200€)

- 3 identische Eval-Boards durchgewechselt (Lm3s8962)

- Das Wechseln des Netzgerätes plus das Dazwischenschalten eines
  Kondensators brachte bereits ein zbesseres Verhalten.

Ich seh gerade noch ein analoges Servo, das werd ich auch mal noch 
schnell ausprobieren.

Da nach einem Reset des Boards das Servo wieder "ruhig" steht seh ich 
nun das Problem am Board bzw. vielleicht an meinem Programm.

Da ich das erste Mal mit einer PWM arbeite und daher keine 
Erfahrungswerte habe kann ich Aussagen in anderen Foren nicht richtig 
Bewerten.
Ich habe gelsen, dass manche einen exterenen Quarz auf ihrem Board 
verwenden um Servozittern weg zu bekommen.
Bringt das was? Ist der interne Oscillator bzw. die PLL des 
Lm3s8962-Board nicht stabiel für eine PWM ?
Das Board erzeugt momentan eine PWM und bei Betätigung eines Switches 
auf dem Board wird ein Interrupt ausgelöst, bei dem sich die Pulslänge 
für paar Sekunden ändert.
Ich hänge meinen Programmcode mal mit an. Ich arbeite mit Code Composer 
Studio.

Grüße Alex

von Karl H. (kbuchegg)


Lesenswert?

Normalerweise würde man sagen, dass deine Probleme ziemlich sicher mit 
der Stromversorgung zu tun haben. Wobei hier Akkus meistens besser 
abschneiden, weil es keine Regelung gibt. Ein Akku buttert Strom rein 
wenn er gebraucht wird, ohne dass erst extra eine Regelgung ansprechen 
muss. Ich denke mal du wirst dich damit abfinden müssen, dass du deiner 
Servo-Stromversorgung ein paar Kondensatoren verpassen musst: einen 
großen für die langsamen heftigen Spitzen und einen kleinen für die 
schnellen kurzen Spikes.

Zum Programm
1
float PulseWidth = 0.075;
2
3
....
4
5
      while(PulseWidth>=0.045) // = 0,9 ms          // langsam nach links fahren
6
      {
7
        PulseWidth = PulseWidth-0.000001;

Ich muss schon sagen: du hast ein gesundes Gottvertrauen, für PulseWidth 
einen float zu nehmen. Wenn du den für die PWM sowieso noch mal 2500 
nimmst, warum nimmst du dann nicht einfach einen int dafür her? Ist 
einfacher zu rechnen und Rechenfehler akkumulieren sich dann auch nicht.

von Simon L. (simon_l)


Lesenswert?

Hi,

teste doch mal andere Zeiten, ich dachte eigentlich Servos arbeiten von 
1...2ms, vllt übersieht das Servo bei 0,9ms den Impuls. Und wenn du das 
Servo in den Anschlag fährst könnte ich mir vorstellen, dass das Servo 
nich korrekt den Endanschlag erkennt und mechanisch begrenzt wird, also 
ein "blockieren" sieht, dann wären die 3,5Apeak auch plausibel.

Gruß Simon

von U.R. Schmitt (Gast)


Lesenswert?

Karl Heinz und Simon haben das Wesentliche wohl schon gesagt.
1. Float Rechnung: Bei der Addition kann es schon einen merkbaren Fehler 
geben, da Float nicht besonders viele signifikante Stellen hat. 
Ausserdem völlig unnötig. Du hast die Zeiten in ms (oder von mir aus µs: 
1000 - 2000) Also nehme ein dazu passendes einfaches Zahlenformat (int)
2. Max und Min Werte. Man steuert ein Servo nicht unnötigerweise bis in 
die Begrenzung, sondern so weit wie nötig und dimensioniert die Mechanik 
entsprechend, daß man Reserve hat. Vor allem für einen ersten Test ist 
die 0.9 und 2.1 völlig daneben, besser wäre 1.2, 1.5 und 1.8ms.
3. Stromversorgung. Kann es sein, daß deine Servos und der µC an 
derselben Stromversorgung hängen? Wenn ja solltest Du den µC mal 
entkoppeln.
4. Langsame Hochfahren. Wenn dein Hochfahren zu langsam erfolgt, dann 
ruckt das Servo bei jeder Stufe kurz einen schritt weiter und Du hast 
ein ruckeln oder brummen beim Verfahren.
5. Timerinterrupt. Da du so unnötig floats benutzt, die ja durchaus 
teuer in Bezug auf Rechenzeit sind. Könnte es sein, daß ab und an 
Interruptfunktionen zu viel Zeit brauchen bzw. dein Rechner an der 
Grenze oder gar überlastet ist?

Viel Erfolg

von Horst H. (horha)


Lesenswert?

Hallo,

die MC ist ja ein ARM3 auf 8 Mhz Takt gestellt.
Natürlich hätte man integer von 2500 *0,045 = 113 bis 2500*0,105= 262 
zählen lassen können, aber dann sähe man auch ,dass die Auflösung nur 
149 Teile ist.
Es ging wohl um eine leichte Anpassung der Zeit, die für die Bewegung 
gebraucht wird.
Float wird nicht im Interrupt gerechnet, spielt also da keine Rolle.

Aber es ging doch um das zittern in der Neutralstellung, wenn also keine 
Taste gedrückt ist.
Irgendwie unangenehm ist, dass die Werte 0.045,0.075,0.105 x 2500 immer 
nur krumme Zahlen ergeben die immer gerundet werden.

Wenn der PWM div nicht _PWMDIV_64 sondern _PWMDIV_8 wäre könnte man die 
Auflösung entsprechend erhöhen.
Dann wäre nicht 2500 sondern 20000 der PWM Rahmenwert.
Die Werte wären im Bereich 900-2100, was auch anschaulicher ist.
Also zum testen einfach ein wenig austauschen:
1
void PWMInit(void)
2
{
3
  SysCtlPWMClockSet(SYSCTL_PWMDIV_8); 
4
 ..
5
  PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 20000);             //20ms = 50Hz
6
}
7
// und in main 
8
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 20000 * PulseWidth);
9
     }
10
}

Kann es sein, dass
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 2500 * PulseWidth);
den PWM ab und an im falschen Moment neu beschreibt und das ein Impuls 
ausbleibt?

von oszi40 (Gast)


Lesenswert?

Horst Hahn schrieb:
> im falschen Moment neu beschreibt und das ein Impuls
> ausbleibt?

Dann nehmt doch unabhängig davon einen anderen TTL-Impuls als 
Gegenprobe?

Evtl. sind nun noch irgendwelche induktive Abschaltspannungen im Spiel, 
die bis auf die Steuerung zurückschlagen?

von Regler (Gast)


Lesenswert?

Wenn du so viele Servos hast: Kannste auch mal die Ansteuerung gegen 
eine kommerzielle Lösung tauschen?

von Regler (Gast)


Lesenswert?

Noch ein Vorschlag:

Toggle doch mal einen Pin wenn sich die (tatsächliche...) PWM-Width 
ändert. Schau mal mit einem Oszi nach, wie gleichmäßig der Takt der 
Änderung ist.  Und verwende Festkomma, float frist richtig Leistung und 
Speicher und ist ungenauer als breite Festkommazahlen.

von Horst H. (horha)


Angehängte Dateien:

Lesenswert?

Hallo,

vielleicht kann man das Problem umschiffen, indem im Interrupt eine 
Flagge zurückgesetzt wird.
EDIT:
die Korrektur des PWM Teilers fehlt.
1
void PWMInit(void)
2
{
3
  SysCtlPWMClockSet(SYSCTL_PWMDIV_8);

von Alexander O. (ogi)


Lesenswert?

Hallo

Vielen Dank für die vielen hilfreichen Tips. Ich bin von diesem Forum 
echt begeistert wie schnell man hier Feedback bekommt.

Den Punkt mit den float-Variablen hab ich bereits in integer-Variablen 
geändert. Mir war das schlichtweg einfach nicht bewusst wieviel mehr 
Rechenaufwand/Rundungsfehler bei dem Umgang mit float-Variablen ensteht 
aus dem Grund hab ich mir darüber keine Gedanken gemacht. Danke für die 
Belehrung!

Ich werde die weiteren Punkte mal abarbeiten bzw. ausprobieren.

Grüße
Alex

von Alexander O. (ogi)


Lesenswert?

So ich melde mich mit sehr guten Neuigkeiten zurück

Das Servozittern ist nun komplett weg das Servo führt langsame sowie 
schnelle und ruckartige Bewegungen ohne das kleinste Zittern aus.

Mein Weg zum Erfolg zusammengefasst:

- Alle Float-Variablen durch Integer-Variablen getauscht. So wie es mir
  viele von euch geraten haben. Unglaublich was das ausmacht!

- Die Auflösung hab ich, so wie es Horst Hahn weiter oben beschrieben
  hat, feiner/größer gemacht, sodas auch die Werte anschaulicher sind
  (1500 = 1,5 ms / 2100 = 2,1 ms / 900 = 0,9 ms)

- Das Netzgerät wurde, wie auch schon oben beschrieben, ausgetauscht und
  ein 4700 µF Kondensator zwischwen die Pole, zum "Abfangen" der
  Stromspitzen, geschaltet.

- Später werde ich das Netzgerät gegen einen Akku austauschen (Wurde 
erst
  bestellt).

Nach dem ich nun die Spannung am Netzgerät mal beobachtet habe, hat 
diese nur noch sehr leichte Einbrüche wenn das Servo ruckartig maximal 
ausgelenkt wird, was aber kein Zittern/Ruckeln im Servo mehr verursacht!
Bei langsamen Auslenkungen bleibt die Spannung jetzt jedoch konstant, 
was für den späteren Einsatz, eine Antennennachführung für den Datenlink 
von UAVs die 5 - 70 km weit weg fliegen, vollkommen ausreichend ist.
Mit der Speisung über einen Akku, so wie ich es später mal vor habe, 
kann die Spannung noch weiter stabilisiert werden.

Ich möchte mich bei euch allen für eure Hilfe bei der Lösung meines 
Problems bedanken. Ich hab in den letzten 3 Tagen einiges gelernt :-)
Macht weiter so!

Grüße Alex

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.