PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rat zur Regleroptimierung gesucht



Janvi
27.07.2012, 20:18
Der hervorragende Regler-Artikel in RN-Wissen hat mir Mut gemacht, endlich mal einen (PI) Geschwindigkeitsregler für meinen Fahrantrieb in Angriff zu nehmen. Große Geschwindigkeiten (3-18 cm / sek) werden schon halbwegs ordentlich geregelt, darunter ruckelt es dummerweise ziemlich. Bei manueller Bedienung über einen analogen Joystick kann man 1cm/sek mit der Mechanik ohne weiteres ruhig fahren und punktgenau positionieren. Zur Ursache gibt es zwar schon einige Verdachtsmomente, aber auch viele Verständnisprobleme.

Fahrmotor ist ein Scheibenwischermotor aus einem LKW (24 Volt / 6 Amp) mit Schneckengetriebe 60:1. Weil das Schneckengetriebe selbsthemmend ist, brauche ich keine Geschwindigkeit von 0 ausregeln können und es gibt auch keine Bremse. Bergab ist der Bremsweg aber schon merkbar länger wie bergauf..Weil die Richtungsumkehr nur selten passiert und eine Abschaltung mit (redundanten) Relais sicherer (Angst vor Brücken-Querströmen bei SW-Fehler) und einfacher erschien, habe ich nur einen P-Kanal Mosfet für die PWM und mache den Rückwärtsgang mit 2 Blinker-Relais mit je einem Umschalter immer bei Stillstand.

Die PWM geht von 0-100%, der Timer Reload Wert ist auf 1000 gesetzt, so daß praktisch 0,1% von 0 bis 999 aufgelöst werden können. Um die Schaltverluste in Grenzen zu halten, habe die Frequenz auf 1khz gelegt. Weil der Motor damit hörbar pfeift, von den steilen Stromflanken Sensoren gestört werden können und ich kein abgeschirmtes Kabel mag, habe ich den Motorstrom über 100uH/2000uF gesiebt. Vielleicht ist dieser als Energiespeicher schon ein Fehler, denn das Bremsen erfolgt wegen der Relais nicht über den Rückwärtsgang sondern nur durch Abschalten der Motorspannung. Die Elkos enthalten da noch Energie. Sind sie geladen, kann damit bis zu einem cm weit gefahren werden und das ist möglicherweise schon die Unsicherheit Nr. 1 für den Regler.

Als Drehgeber habe ich einen HP (Avago) HEDS mit 200 Schlitzen über einen Rundriemen angeflanscht. Damit bekomme ich für jeden mm Fahrweg ein Signal, was mir ursprünglich mehr als ausreichend erschien. Zur Positionsmessung stimmt das, für die Geschwindigkeitsmessung ist das aber problematisch, weil die Torzeit zum Vergleichen von 2 Positionen ja nicht beliebig lang werden darf. Deshalb habe ich an meinem Mikrokontroller zum HW-Timer der die Position zählt noch einen weiteren HW-Timer im Input-Capture Modus initialisiert. Bei jeder Flanke des A-Signals wird ein Capture gemacht was dann der Zeit zwischen 2 Encoder-Schlitzen entspricht. D.h. ich bekomme alle 2 mm ein neues Geschwindigkeitssignal welches in der Genauigkeit dann aber auf 0,1mm aufgelöst ist. D.h. für 1cm / sek gibt es den Zahlenwert 100, womit auch langsame Geschwindigkeiten noch auf 1% genau sein dürften. Bei Timer Überlauf erfolgt ein Abbruch und die Geschwindigkeit wird auf 0 gesetzt. Das ist etwa bei 3mm / sek der Fall. Die Geschwindigkeitserfassung ist also auch nicht ganz linear, für 5 - 10mm / sek Fahrgeschwindigkeit müsste sie eigentlich aber noch gut sein. Hier kommt Unsicherheit Nummer zwei: Bei langsamen Geschwindigkeiten dauert es immer länger, bis eine neue Istwert-Geschwindigkeit vorliegt. Die Regler - Zykluszeit und auch die PI Paramter bleiben hingegen konstant.

Schließlich gibt es Unsicherheit Nummer Drei: Soll und Istwert sind Variablen als uint16_t in 0,1mm/sek unsigned, weil der Regler ja vorwärts und rückwärts gleichermaßen arbeiten soll. Der Fehler e und auch esum selbst kann aber sowohl positiv wie auch negativ werden, weil der Motor ja entweders zu langsam oder auch zu schnell sein kann. Deshalb habe ich hierzu eine vorzeichenbehaftete 32 bit Variable int32_t angelegt. Der Regler-Ausgang ist nun auch 32 bit und entsprechend dem Fehler kann der Ausgang auch negativ werden. Dieses Signal muß ich nun auf meine PWM von 0-100% bzw. 0-999 anpassen. Deshalb begrenze ich zunächst auf 0, dann teile ich durch 256 und dann begrenze ich noch auf 999. Bei negativen Ausgangswerten „taucht“ der Regler mal kurz ab und der Motor bleibt stehen bis er wieder anläuft. (Das könnte zum Ruckeln bei kleinen Geschwindigkeiten führen?) Ein Offset zum Reglerausgang hinzuzuzählen hat nicht geholfen. Falls das richtig wäre, wie groß muß der sein ?

Die Regler-Zykluszeit habe ich mal mit 10 mSek angegeben. Zuvor hatte ich 50mSek womit die Beiwerte aber etwas klein waren. Vielleicht muß die Zykluszeit bei langsamen Geschwindigkiten aber viel langsamer sein (?) Kp ist 64 und Ki ist 8. Bei Kp=255 bekomme ich deutlich hörbare Schwingungen auch bei höheren Geschwindigkeiten. Bei Ki=16 gibt es zu große Korrekturen um den Sollwert so daß es auch schon schwingt. Error ist etwa 10-20 (also 2mm) und esum ist bei mittleren Geschwindigkeiten negativ und bei großen positiv.

rossir
29.07.2012, 19:40
Vielleicht hilft oder inspiriert ein "simulated annealing" Vorgehen zur automatischen Bestimmung von Kp, Ki wie ich ihn schon hier gemacht habe:
https://www.roboternetz.de/community/threads/54487-Genetischer-Algorithmus-für-QuadroCopter?highlight=genetisch
Dort hat er zumindest inspiriert.

Insgesamt befürchte ich, dass Dein System nichtlinear ist. D.h. es könnte sein, dass am (von mir übertriebenen) Ende für jede Sollgeschwindigkeit ein eigenes Kp, Ki Paar am besten wäre. (Interessant wäre dann, ob diese Paare in einem funktionalen Zusammenhang zur Sollgeschwindigkeit stehen.)

oberallgeier
29.07.2012, 20:25
... halbwegs ordentlich geregelt ... PWM geht von 0-100% ... Regler-Zykluszeit ... 10 mSek ...Hast Du die Sprungantwort >im System< aufgenommen? Am Besten mit unterschiedlichen Sprüngen - vorerst evtl. nicht mit PWM sondern mit einem einstellbaren Netzteil? Dann eine ordentliche Analyse dieser Sprungantworten, siehe Beispiel hier (klick). (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=427784&viewfull=1#post427784) Natürlich sollte da auch der GENAUE Zeitpunkt der Sprungfunktion enthalten sein.

Mir wäre eine PWM mit 1 kHz bei diesem Motor eher langsam - aber ich habe nur Erfahrung mit wenigen, sehr kleinen Motoren. Die Regelfrequenz von 1/10 der PWM-Frequenz finde ich eher gering - aber wieder mein Hinweis, dass mir die ERfahrung mit diesen größeren Motoren fehlt.

Zum besseren Verständnis der Reglerfunktion und der Schwankungen der tatsächlichen Regleranteile hatte ich auch diese mitgeschrieben und mir die Werte offline ausgeben lassen - das gibt eine recht ordentlichen Einblick (klick) (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=422091&viewfull=1#post422091) in die Geschehnisse. Ergebnis ist mittlerweile eine recht saubere Fahrerei. (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=495507&viewfull=1#post495507)

Viel Erfolg - auch wenn der bei mir erst nach etlichem Schweiß kam.

Janvi
29.07.2012, 21:04
>Vielleicht hilft oder inspiriert ein "simulated annealing"
interessant ...
>Hast Du die Sprungantwort >im System< aufgenommen?
Nein. Weis gar nicht wie ich das anstellen soll. An die Geschwindigkeit komme ich nur ran, wenn ich ein Programm schreibe wo das ausgibt. Da kann ich dann natürlich auch gleich die Fehler mit ausgeben. Hast du die Kurven mit Excel gemacht ?

Also den Elko habe ich jetzt mal von 2000 auf 200uF verkleinert. Das bringt rein gar nix, ausser daß jetzt der Motor pfeift. Dann habe ich einen D-Anteil eingeführt. Große Geschwindigkeiten werden schneller ausgeregelt, bei kleinen Geschwindigkeiten wird das Ruckeln noch katastrophaler. Ich habe dann probiert, ob ich PI Werte finde die nur bei den kleinen Geschwindigkeiten passen. Der Durchbruch kam, als ich die Regler Zykluszeit mal von 10mS auf 100mS hochgesetzt habe. 10mm/sek hat sofort ordentlich funktioniert. Also habe ich die Zykluszeit variabel gemacht. Sie steht in der Reglerformel nicht drin, weil ich ja seither angenommen habe, daß diese Konstant ist. Bergauf, bzw. wenn etwas Last da ist, funktioniert jetzt sogar Fahren mit 5mm/sek. Hier ist die Zykluszeit 200ms und bis 150mm/sek wird die Zykluszeit bis 10mS stetig verkürzt. Funzt erstaunlich und ist vermutlich der Tatsache zu schulden, daß es bei kleinen Geschwindigkeiten immer länger dauert bis ein neuer Istwert angeliefert wird.
Die großen 1000uF Elkos bau ich wieder rein, weil beim Bremsen locker Spannungen über 40 Volt zurückgespeist werden.

WL
29.07.2012, 22:29
Als Drehgeber habe ich einen HP (Avago) HEDS mit 200 Schlitzen über einen Rundriemen angeflanscht. Damit bekomme ich für jeden mm Fahrweg ein Signal, was mir ursprünglich mehr als ausreichend erschien. Zur Positionsmessung stimmt das, für die Geschwindigkeitsmessung ist das aber problematisch, weil die Torzeit zum Vergleichen von 2 Positionen ja nicht beliebig lang werden darf.

Genau da würde ich nachbessern.
Je größer die Auflösung des Istwertes ist umso besser (in Grenzen> maximale Frequenz beachten).
Angenommen, die Übertragung vom Drehgeber auf die Getriebewelle beträgt 1:1 ergibt das (200/60) = 3,3 Imp/ Motorumdrehung.
Das erscheint mir arg wenig. Das Getriebespiel solltest Du auch beachten. Das Nachbessern mit Interpolieren macht das auch nicht besser.

Ideal wäre der Inkrementalgeber direkt auf der Motorwelle.

RP6conrad
31.07.2012, 20:21
Der Zycluszeit von ein Regler wird eigenlich bestimmt durch die samplefrequenz von die ist-wert Messung. Nur dan gibts neue information ueber die actuelle "Error", und damit kan dan auch eine neue, korrigierte PWM-Wert berechnet werden. Wen deine Regler schneller ist, lauft nur das I-Anteil weiter weg. Auch den Trick mit diese Input Capture hilft nur bedingt, da bei langsame Geschwindigkeit auch nur neue Info da ist beim flankwechsel von sensor !
Das D-anteil brauchts du nur für "Overshoot" zu verbesseren, aber fuhrt schnell zu Instabilitat beim "Rausch" auf die Messwerte.