Forum: Mikrocontroller und Digitale Elektronik Fehler bei http://rn-wissen.de/index.php/Diskussion:Regelungstechnik?


von Tobi P. (sleven87)


Lesenswert?

Hallo liebe Leutz,

ich hab in mehreren Beiträgen zu PID Reglern den folgenden Link in eurem 
Forum entdeckt.

http://rn-wissen.de/index.php/Diskussion:Regelungstechnik

Meiner Meinung nach eine super Seite was die Regelungstechnik angeht.


Nun zu meinem Problem.
Ich wollte nen PID-Regler in C programmieren. Prinzipiel kein Problem da 
auf dieser Seite der fast fertige C-Code ja schon steht.

Laut RoboterNETZ
1
esum = esum + e
2
y = Kp * e + Ki * Ta * esum + Kd * (e  ealt)/Ta
3
ealt = e

Nun mein Problem.
Wenn man oben auf der Website über der Überschrift "Regelungstechnik" 
auf den blauen "Diskussion"-Button klick kommt als zweiter Eintrag 
"Programmkode beim D-Anteil falsch?".


Hier gibt der Verfassen den folgenden Code als richtige Variante an.
1
e = w - x;   //Vergleich
2
esum = esum + e;   //Integration I-Anteil
3
// y = Kp*e + Ki*Ta*esum + Kd/Ta*(e – ealt);  // falsch
4
y = Kp*e + Ki*Ta*esum + (e  ealt);   // richtig
5
// ealt = e;   // falsch
6
ealt += (1 - exp(-Ta/Kd)) * (e - ealt);   // richtig

Der Unterschied liegt nur in der Berechnun des D Anteils.
Ist es richtig das der D-Anteil expotentiel abklingen muss???
Bei der zweiten Variante finde ich auch ein wenig komisch das sobald man 
die Variable Kd = 0 setz wird beim berechnen der Stellgröße y immer 
e-ealt weiter hinzuaddiert, was ja eigentlich nicht sein dürfte oder???

Meine Frage nun, welches ist richtig???


Freundliche Grüße

Sleven

von Andreas B. (bitverdreher)


Lesenswert?

Die erste Formel ist richtig.
Der Differentialanteil ist Kd * de/dt

Gruß
Andreas

von Steel (Gast)


Lesenswert?

Das wo "richtig" daneben steht ist falsch. Da hatte wohl jemand einen 
Clown gefrühstückt?

von Karl H. (kbuchegg)


Lesenswert?

Tobi Privat schrieb:

> Bei der zweiten Variante finde ich auch ein wenig komisch das sobald man
> die Variable Kd = 0 setz wird beim berechnen der Stellgröße y immer
> e-ealt weiter hinzuaddiert, was ja eigentlich nicht sein dürfte oder???

Wenn Kd auf 0 gesetzt wird, dann wird hier
1
   .... -Ta/Kd ...
durch 0 dividiert, was für mich schon mal ein Hinweis ist, dass da 
irgendwas grundsätzlich nicht stimmt.


Auch gibt es da keine Begründung, warum der D-Anteil "exponentiell 
abklingen" muss. Warum überhaupt abklingen? Und warum exponentiell?

: Bearbeitet durch User
von Ulrich (Gast)


Lesenswert?

Wie man den Differentialterm berechnet ist nicht eindeutig vorgegeben - 
da gibt es verschiedene Möglichkeiten die Steigung zu berechnen. Die 
oberste Formel ist jedenfalls eine richtige Möglichkeit.

Vor allem wenn die Messwerte sehr schnell kommen, ist eine andere 
Berechnung der Steigung ggf. schon sinnvoll. In der einfachen Version 
einfach die Datenrate Reduzieren. Das kann dann schon so ähnlich die der 
exponetielle Abfall aussehen. Effektiv werden damit mehr als nur die 
beiden letzten Messwerte genutzt um die Steigung zu schätzen.

Der 2. Vorschlag aus der Diskussion ist aber so keine richtige Lösung. 
Das es mit der Division durch Null ist dabei eher nur ein Randproblem - 
der Grenzfall Kd = 0 gibt dann halt für den exp(-Ta/Kd) den Wert 0. 
Damit gibt sich dann für ealt der selbe Wert wie oben - nur in der 
Gleichung für den Stellwerte fehlt noch der Faktor Kd/Ta.

Wenn man die Formel etwas umstellt, ohne das C typische += und ein X für 
den exp(..) term erhält man:
 ealt = (1 - X)) * e +  X * ealt

Da wird also einfach für ealt eine Tiefpassfilterfunktion eingefügt. So 
falsch scheint der Ansatz also nicht zu sein, aber halt nicht zwingend, 
und natürlich muss dann oben der Faktor Kd/Ta noch mit rein.

von Tobi P. (sleven87)


Lesenswert?

Hey ho,

vorab vielen Dank an alle für eure Zeit und eure Antworten.

Das bei der zweiten Variante durch Null geteilt wird ist mir so auf den 
ersten Blick nicht aufgefallen. Aber natürlich finde ich die Teilung 
durch Null nicht sehr berauschend =D

Nun ja ich hab bisher auch noch nicht gehört bzw. gelesen das der 
D-Anteil exp. abklingen sollte aber naja, man soll nicht vorurteilen 
sofern man sich nicht 100%ig sicher ist =)


Mir ist nun noch ein kleines Problem beim Integrierer aufgefallen.
Bei meiner Regelung habe ich eine Führungsgröße gleich Null.
Sofern ich beim Start meiner Regelung schon einen Fehler der Regelgröße 
habe, Integriere ich doch den Fehler ewig weiter da ich die Stellgröße 
mit dem Startfehler immer weiter zusummiere oder??

Muss ich hier den Startfehler erkennen und beim ersten erreichen von x=0 
mein esum auch gleich Null setzten um den Startfehler zu korrigieren???

Grüße Sleven

von Andreas B. (bitverdreher)


Lesenswert?

Tobi Privat schrieb:
> Sofern ich beim Start meiner Regelung schon einen Fehler der Regelgröße
> habe, Integriere ich doch den Fehler ewig weiter da ich die Stellgröße
> mit dem Startfehler immer weiter zusummiere oder??

Deshalb begrenzt man normalerweise auch den integralen Anteil. Ansonsten 
ist die Formel ok.

Gruß
Andreas

von Tobi P. (sleven87)


Lesenswert?

Ah ok

sprich das ganze würde z.B. dann wie folgt aussehen
1
e = w - x;
2
esum += e;
3
if( esum > limit ){esum = limit}
4
if( esum < limit ){esum = -limit}
5
y = Kp * e + Ki * Ta * esum + Kd/Ta * (e  ealt);
6
ealt = e;

wäre es hier eventuell auch sinnvoll die Stellgröße zu begrenzen statt 
esum??

von rava (Gast)


Lesenswert?

wenn du nur die stellgröße beschränkst, dauert es ewig, bis esum wieder 
"herunterintegriert" ist und das Ding neigt zu "digitalen" schwingungen.

beides ist aber auch ok

von Ulrich (Gast)


Lesenswert?

Eine Alternative für die Begrenzung des Integrals ist es zu erkennen 
wann der Regler den linearen Bereich verlassen hat, für den die 
Parameter gelten sollen. Also etwa das Integral nicht weiter zu erhöhen, 
wenn die Stellgröße am Anschlag ist. Das kann man ggf. auch zusätzlich 
zu dem Limit oben machen. Je nach Anwendung dürfen das obere und untere 
Limit für den Integralteil auch verschieden sein.


Das "Problem" mit der Teilung durch Null bekommt man nur wenn man KD auf 
Null setzen will, also gar keinen PID Regler mehr hat. Das passiert ja 
auch nicht zur Laufzeit, sondern einmal am Anfang zum Berechnen der 
Konstanten für die Regelung. Da ist aber noch ein anderes Problem das 
auch einen Fehler hindeutet Ta/Kd ist nicht dimensionslos. Vermutlich 
fehlt da noch ein Faktor wie Kp.

von Tobi P. (sleven87)


Lesenswert?

@Ulrich
Das ist zum glück bei mir nicht der Fall da sich der Regler hier immer 
in einem relativ linearen Bereich bewegt.
Bei mir dient er alt Positionsregler um die Sollposition Null.


Wäre es sinnvoll die Regelabweichung, so wie den Integrierer zu 
begrenzen???

Bsp.:
1
e = w - x;
2
if( (e < e_max) && (e > e_min) ){//Begrenz. der Regelabweichung Anti-Windup/down
3
    esum += e;                //Aufsummierung des Integrators
4
    }
5
// Begrenzung des Integrators
6
if( esum > limit ){esum = limit}
7
if( esum < limit ){esum = -limit}
8
// Berechnung der Stellgroesse
9
y = Kp * e + Ki * Ta * esum + Kd/Ta * (e  ealt);
10
ealt = e;

somit wäre doch gewährleistet das bei einem großen Sprunghaften Fehler 
(zum Beispiel das kurzzeitige Durchdrehen eines Rades bei einem 
Differentialantrieb) der Integrierer nicht zu stark Sprunghaft 
integriert.

Und durch die Begrenzung von esum halte ich das Überschwingverhalten des 
Integrierers in einem von mir erwünschten Bereich oder???

von Andreas B. (bitverdreher)


Lesenswert?

Tobi Privat schrieb:
>Das ist zum glück bei mir nicht der Fall da sich der Regler hier immer
>in einem relativ linearen Bereich bewegt.
>
spätestens in der Begrenzung eben nicht mehr. ;-)

> somit wäre doch gewährleistet das bei einem großen Sprunghaften Fehler
> (zum Beispiel das kurzzeitige Durchdrehen eines Rades bei einem
> Differentialantrieb) der Integrierer nicht zu stark Sprunghaft
> integriert.
>
Kann man machen, begrenzt damit aber per SW die mögliche Beschleunigung.

> Und durch die Begrenzung von esum halte ich das Überschwingverhalten des
> Integrierers in einem von mir erwünschten Bereich oder???
>
Ja. So wird das i.A. auch gemacht.

Gruß
Andreas

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.