Forum: Mikrocontroller und Digitale Elektronik PID Ausgang skalieren


von Mach F. (machfax)


Lesenswert?

Hallo

Ich habe einen funktionierenden PID regler inkl. Anti Wnd-UP vom I 
Anteil.
Der PID Regler wird für die Geschwindigkeitsregelung eines Motors 
benutzt.
Als Soll und Ist-Wert habe ich die aktuelle Encoderposition, somit eine 
Reglerdifferenz von einigen 1000.
Der Speed vom Motor ist aber in rpm einstellbar und liegt normalerweise 
bei ca. 500-5000rpm. Der Ausgangswert vom PID Regler ist aber sehr 
gross, da ich mit Integer-Werten für P, I und D arbeite (long).
Wird der Error zwischen aktueller Position und Sollposition vom Encoder 
klienr, soll auch die Geschwindigkeit abnehmen.
Gibt es dazu eine elegantere Lösung als mit einer Division vom 
Ausgangswert zu arbeiten? Ich würde den maximalen Ausgangswert vom PID 
im Verhältnis zum aktuellen Speed rechnen und danach den Ausgangswert 
vom PID (der ja immer abnimmt) wieder durch diesen Faktor teilen, damit 
ich von z.Bsp 500rpm langsam auf 0 zurückfahre.
Gibt es da keine bessere Lösung? Und nein, ich möchte keine float 
Berechnung im Regler.

Vielen Dank

von Karl H. (kbuchegg)


Lesenswert?

Domi --- schrieb:

> Gibt es dazu eine elegantere Lösung als mit einer Division vom
> Ausgangswert zu arbeiten?

Wenn du die Division geschickt anlegst, als 2-er Potenz, dann ist diese 
Division für den µC  Pipifax.


So wie für dich eine Division durch eine 10-er Potenz (1, 10, 100, 1000, 
...) Pipifax ist, weil du einfach nur Stellen wegstreichen brauchst und 
nicht rechnen musst. Was für dich 10 ist, ist für deinen µC die 2. Und 
da die Parameter im PID Regler sowieso niemandem irgendetwas sagen und 
einfach nur Zahlenwerte sind, ist es völlig unerheblich, ob dein 
Benutzer da jetzt 3 oder 24 einstellt und dein Programm danach noch mal 
durch 8 dividiert. Ausser natürlich, dass du durch die Fix Point 
Arithmetik ein paar 'Kommastellen' mit durch die Rechnung geschleust 
hast :-) Was ja auch das Ziel der Sache war. Aber 24 sagt deinem 
Benutzer genausowenig, wie es 3 getan hätte.

von Mach F. (machfax)


Lesenswert?

ok, danke für den Input

Aber das ist so wie ich verstehe schon der korrekte Lösungsansatz mit 
der Division?
Oder wäre es sinnvoller den PID Algorythmus so umzustellen, dass der 
Ausgangswert des PID nicht mehr skaliert werden muss?

Ich bin mir einfach nicht sicher, ob in diesem Fall mit sehr hohen 
Differenzen zwischen Soll und Ist und einer verhältnismässig kleinen 
Stellgrösse die Division wirklich die einzige Lösung ist oder ob ich da 
die Differenz für den Reglereingang besser verkleinern sollte, was aber 
wieder Geanuigkeit kostet, was ich nicht will.

Gruss

von Karl H. (kbuchegg)


Lesenswert?

Domi --- schrieb:
> ok, danke für den Input
>
> Aber das ist so wie ich verstehe schon der korrekte Lösungsansatz mit
> der Division?
> Oder wäre es sinnvoller den PID Algorythmus so umzustellen, dass der
> Ausgangswert des PID nicht mehr skaliert werden muss?

Den Algorithmus tangiert (bis auf mögliche Overflows und daher 
notwendige Zahlenwertbegrenzungen) das überhaupt nicht.

PID steht und fällt mit den Reglerkonstanten!
Die sind dein Werkzeug um einen PID-Regler anzupassen.

von Mach F. (machfax)


Lesenswert?

ok, danke für die schnelle Antwort!

von Kaese (Gast)


Lesenswert?

Irgendwie ist das alle Käse was du da schreibst, das fängt schon damit 
an, dass du keine Geschwindikgkeitsregelung (wie du schreibst) sondern 
offensichtlich eine Positionsregelung realisieren willst.

Deine Faktoren die du berechnen willst scheinen mir reichlich konfus. 
Und warum die Geschwindigkeit immer abnehmen soll bleibt dein Geheimnis.

Was ist mit deinen Faktoren für P, I und D Anteil?
Du kannst z.B. deine P-Verstärkung so wählen, dass bei einer 
Positionsabweichung x die Stellgröße y (z.B. maximale Geschwindikgeit) 
rauskommt. Dann musst du nicht nachher mit weiteren Faktoren 
rumfrickeln.

von Mach F. (machfax)


Lesenswert?

Es geht um eine Positionsregelung, aber da ich ebenfalls die 
Geschwindigkeit stabil haben muss, werde ich den Fehler der 
Positionsregelung auf den Rampengenerator geben, der anschliessend die 
Geschwindigkeit regelt, und bei Abweichung von Soll-Ist = 0 ist die 
Geschwindigkeit 0 und somit die Position erreicht.

Kaese schrieb:
> Was ist mit deinen Faktoren für P, I und D Anteil?
>
> Du kannst z.B. deine P-Verstärkung so wählen, dass bei einer
>
> Positionsabweichung x die Stellgröße y (z.B. maximale Geschwindikgeit)
>
> rauskommt. Dann musst du nicht nachher mit weiteren Faktoren
>
> rumfrickeln.

Ja könnte ich, wenn aber die P-Verstärkung in int ist und der Fehler von 
Soll zu Ist 40'000 wird es schwierig ohne Division auf eine 
Ausgangsgrösse von 500 zu kommen...

von Mach F. (machfax)


Lesenswert?

Kaese schrieb:
>
> Deine Faktoren die du berechnen willst scheinen mir reichlich konfus.
> Und warum die Geschwindigkeit immer abnehmen soll bleibt dein Geheimnis.
>
Damit ich eine Position anfahren kann, muss logischerweise die 
Geschwindigkeit vom Motor abnehmen.

von Jossy (Gast)


Lesenswert?

@ Domi ---

Möchtest Du mit Deinem Regler nur elektrische Antriebe ansteuern?
Dabei solltest Du bedenken, dass zum Beispiel in Frequenzumrichtern auch 
schon Regler eingebaut sind und sich ein Antrieb (je nach Last) auch 
nicht immer "linear" verhält. Wenn der Antrieb über seine Sollposition 
gefahren ist, ist auch nicht immer ein direktes Gegensteuern möglich.

Solltest Du damit zum Beispiel auch hydraulische Antriebe betreiben, 
dann wirst Du merken, dass diese Dinger "sauschnell" auf Änderungen 
reagieren. Der ganze Aufbau (besonders wenn mehrere geregelte 
Hydrauliken gleichzeitig arbeiten) gerät dann schon mal ins Schwingen. 
Auch sollte Deine Positionsmessung direkt die Auslenkung des 
Hydraulikzylinders bestimmen und nicht irgendwo an dem Aufbau messen 
(das verringert nicht gerade die Schwingneigung oder irgendwelche 
Regelabweichungen).

von Karl H. (kbuchegg)


Lesenswert?

Domi --- schrieb:
> Es geht um eine Positionsregelung, aber da ich ebenfalls die
> Geschwindigkeit stabil haben muss, werde ich den Fehler der
> Positionsregelung auf den Rampengenerator geben,

wow, wow, wow.

Welcher Rampengenerator?

Der Positionsregler sieht sich die Positionen an und rechnet aus, mit 
welcher Geschwindigkeit er in welche Richtung fahren will. Mehr nicht. 
DIe Rampe ergibt sich doch ganz von selbst, in dem der PID Regler bei 
Annäherung die Geschwindigkeit zurücknimmt.

Damit sich dieses Verhalten einstellt, werden die Kp, Ki und Kd des 
Positionsreglers entsprechend eingestellt.


Mir hat sehr viel geholfen, dass ich mir auf dem PC mal eine Simulation 
gemacht habe, in der ich die jeweiligen Werte grafisch aufgemalt habe 
und mir angesehen habe, wie sich Regelabweichung, Stellgröße und auch 
interne Werte im Laufe der Zeit verändern. Aus den Diagrammen ist, mir 
zumindest, einiges klar geworden, wie die Dinge zusammenarbeiten.

von Mach F. (machfax)


Lesenswert?

Ja es wird ein BLDC Motor über eine H-Brücke (alle 3 Phasen) 
angesteuert. Die Speedregelung ist schon im Application Note vom 
EvalBoard integriert, aber die Positionsregelung leider nicht. Aber ich 
habe nachgelesen und bei Roboter und CNC Maschinen, die genau einen 
Speed und Position anfahren müssen, wird es so gemacht, dass der Fehler 
zwischen Soll und Ist-Position auf den PID vom Speedregler gegeben wird 
(über den Rampengenerator vom Speed)
Es funktioniert grundsätzlich, aber das Problem mit dem Verhältnis 
zwischen PID Positionsregler Ausgang und Stellgrösse für den Speed habe 
ich noch nicht gelöst

von Mach F. (machfax)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Welcher Rampengenerator?

Der Teil, der zuständig für die Soll und Ist-geschwindigkeit zuständig 
ist, damit ich kontrolliert und einstekllbar anfahren bzw. Bremsen kann.

von Mach F. (machfax)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Welcher Rampengenerator?
>
>
>
> Der Positionsregler sieht sich die Positionen an und rechnet aus, mit
>
> welcher Geschwindigkeit er in welche Richtung fahren will. Mehr nicht.
>
> DIe Rampe ergibt sich doch ganz von selbst, in dem der PID Regler bei
>
> Annäherung die Geschwindigkeit zurücknimmt.

Das stimmt, hast du vollkommen recht, aber in diversen CNC Steuerungen 
und Roboterarmen-Regler wird dies anscheinend so gemacht. Ich versuche 
mal beides und werde die Resultate danach posten.

von Mach F. (machfax)


Lesenswert?

Grundsätzlich dient der Rampengenerator dazu, den SollSpeed langsam 
(über eine einstellbare Rampe hochzufahren bzw. wieder runterzufahren. 
Der PID Regler vom Speed folgt dann dieser Rampe und somit ist die 
Beschleunigungsrampe und Bremsrampe einstellbar und der Motor 
beschleunigt gemäss einer vorgegebenen Rampe. Aber eventuell kann ich 
das auch direkt ohne Rampe realisieren. Natürlich muss die Rampe so 
schnell sein, damit der PID Ausgang auch korrekt verarbeitet wird.

von Joerg (Gast)


Lesenswert?

Sehen wir doch mal, wie es die Industrie macht:

- P-Regler für Position, Istwert ist die aktuelle Position
Ausgang ist der Lagefehler.
- Ausgang dieses PI-Regler auf Sollwerteingang des 
Geschwindigkeitsregler, Istwert dieses Regler ist die aktuelle 
Geschwindigkeit
Ausgang dieses Reglers ist der Momenten/Kraft/Druck/Stromsollwert
- Ausgang dieses Reglers auf den Strom/Druckregler

Und jetzt das Wunder:
Du brauchst für den ersten Regler einen Sollwert, dieser schimpft sich 
meist Lagesolltwertinterpolator (oder Rampengenerator).

So arbeiten zumindest alle mir bekannten Servoantriebe.

Jörg

von Mach F. (machfax)


Lesenswert?

Danke Joerg, genau so dachte ich es mir auch, habe es vielleicht etwas 
kompliziert beschrieben.

von Stilz (Gast)


Lesenswert?

Sinnvollerweise ueberlaesst man nicht die ganze Arbeit dem dummen PID. 
Sondern rechnet was man rechnen kann und legt den PID oben drueber.

Wenn man das Stellglied zum approximativen manuellen Anfahren der 
Position auf 256*F(Error) stellen muss, so sollte man das auch schon so 
verwenden. Dazu wird das Stellglied durch die Stellgliedskalierung 
zurueckgerechnet, zB, mal 512. Dann erscheint der Algorithmus als

Stellglied : = (1/512)*(Error*P + Integrator div 1024 + Diff() + 
512*256*F(Error))

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.