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
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
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.
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
Vielleicht ein EMV Problem? Wie lang/dick sind denn die Zuleitungen zum Servo, insbesondere die Signalleitung?
> 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
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
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)
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.
Nochwas: Kannste den Strom, den der Servo zieht, messen? Auch mit dem Oszi?
> 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
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
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.
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
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
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?
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?
Wenn du so viele Servos hast: Kannste auch mal die Ansteuerung gegen eine kommerzielle Lösung tauschen?
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.
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); |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.