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