Forum: Mikrocontroller und Digitale Elektronik Verschiedene PID-Regelalgorithmen in C für AVRs


von Dennis P. (seedman)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mal eine Frage bezüglich verschiedener PID-Regelalgorithmen in 
C.

Es wurde ja hier schon oft über diese bekannten Codezeilen diskutiert:

e = w - x;                                  //Vergleich
esum = esum + e;                            //Integration I-Anteil
y = Kp*e + Ki*Ta*esum + Kd/Ta*(e – ealt);   //Reglergleichung
ealt = e;


Bei dieser Reglergleichung und ebenso in dem Codebeispiel der 
Application Note AVR221 von Atmel, handelt es sich offenbar um einen 
sogenannten

"Parallelen-PID-Regler" richtig ?


Der P-Anteil, I-Anteil und D-Anteil wird summiert.

Somit hat Kp kein Einfluss auf die anderen Größen.

Das ist ungünstig wenn es um die bekannten Einstellregeln

nach Ziegler/Nichols geht.

In der Literatur ist aber eigentlich immer die Rede vom

"Standard-PID-Regler" (siehe Gleichung im Anhang).


Wenn ich den Standard-PID-Regler benutzen will, müsste dann

die Gleichung in c so lauten:

y = Kp*( e + Ki*Ta*esum + Kd/Ta*(e – ealt));    // Kp ausmultipliziert

Wäre das so richtig ?


Spricht etwas gegen diese Variante vom PID-Regler ?

Warum gibt es diese Unterschiede zwischen "standard" und "parallel" ?

von Falk B. (falk)


Lesenswert?

@  Dennis P. (seedman)


>Application Note AVR221 von Atmel, handelt es sich offenbar um einen
>sogenannten

>"Parallelen-PID-Regler" richtig ?

Ja.

>Somit hat Kp kein Einfluss auf die anderen Größen.

>Das ist ungünstig wenn es um die bekannten Einstellregeln

>nach Ziegler/Nichols geht.

Wer sagt das? Ist es nicht eher anders herum? Man hat drei unabhängige 
(othogonale) Parameter.

>y = Kp*( e + Ki*Ta*esum + Kd/Ta*(e – ealt));    // Kp ausmultipliziert

>Wäre das so richtig ?

Ist doch auch eine parallele Struktur, nur dass die Koeffizienten anders 
aufgeteilt sind, Kp ist halt ausgeklammert.

>Spricht etwas gegen diese Variante vom PID-Regler ?

Nö.

>Warum gibt es diese Unterschiede zwischen "standard" und "parallel" ?

Weil die Welt sonst langweilig wäre. ;-)

von Karl H. (kbuchegg)


Lesenswert?

Dennis P. schrieb:

> In der Literatur ist aber eigentlich immer die Rede vom
>
> "Standard-PID-Regler" (siehe Gleichung im Anhang).


Und wenn du die Gleichung mal ausmultiplizierst, dann siehst du, dass es 
sich um exakt das gleiche handelt mit dem einen Unterschied, das die 
Integrale durch diskrete Summen ersetzt wurden.

Ob du Ki durch Kp dividierst nur um dann im Nachhinein wieder mit Kp zu 
multiplizieren oder ob du gleich einfach nur den Term mit Ki 
multiplizierst, kommt sich arithmetisch aufs gleiche raus.

von Dennis P. (seedman)


Lesenswert?

Naja okay,...

dann muss ich mir nochmal anschauen auf welchen Algortihmus sich

Ziegler/Nichols bezieht. Egal kann es ja nicht sein, denke ich.

Bei einer Simulation in Matlab/Simulink kam mit dem 
"Parallelen-PID-Regler"

und den Einstellregeln von Ziegler/Nichols nur Müll heraus...


Falk Brunner schrieb:
> @  Dennis P. (seedman)
>
>>y = Kp*( e + Ki*Ta*esum + Kd/Ta*(e – ealt));    // Kp ausmultipliziert
>
>>Wäre das so richtig ?
>
> Ist doch auch eine parallele Struktur, nur dass die Koeffizienten anders
> aufgeteilt sind, Kp ist halt ausgeklammert.
>

Hmmm aber meine Gleichung in c entspricht jetzt der im Anhang oder ?

Das habe ich doch hoffentlich richtig gemacht...

von uC (Gast)


Lesenswert?

nein, da in der angehängten SChaltung beim I und D-Anteil durch Kp 
geteilt wird.
Multiplizierst du das Kp rein, ist es das zeitkontinuierliche Äquivalen 
zu der in deimem Post angegebenen Gleichung.

von Karl H. (kbuchegg)


Lesenswert?

Dennis P. schrieb:

> Hmmm aber meine Gleichung in c entspricht jetzt der im Anhang oder ?

Das hat sie auch vorher schon getan :-)

 t = 3 * ( Ki/3 * Si );

und

 t = Ki * Si;

ergeben nun mal dasselbe.
Dividierst du durch 3 um danach mit 3 zu multiplizeren, hast du 
mathematisch eine 0-Operation gemacht.
rein mathematisch. Auf einem Computer kann es allerdings durch die 
begrenzte Rechengenauigkeit einen Unterschied machen. (Alle Werte als 
double vorausgesetzt)

von Chris (Gast)


Lesenswert?

"Parallelen-PID-Regler"  - pPID
"Standard-PID-Regler"    - sPID

Die meisten digitalen PID`s sind pPID, alle analogen PID´s sind sPID.

Für die Umwandlung nimmt man folgende Formeln:

Pp = Ps (1 + Is Ds)

Ip = Is/(1 + Is Ds)

Dp = Ds/(1 + Is Ds)


Diesen Pseudocode kennst du warscheinlich auch :


Err=(Input+(Input-InputLast)*Derivative *60)-SetP
InputLast = Input
IF Action = ‘DIRECT’ THEN Err=0 – Err
OutPutTemp = Err*Gain+Feedback
IF OutPutTemp > 100 THEN OutPutTemp =100
IF OutPutTemp < 0 THEN OutPutTemp =0
OutP = OutPutTemp
Feedback=Feedback+(OutP-Feedback)*ResetRate/60

von Dennis P. (seedman)


Lesenswert?

uC schrieb:
> nein, da in der angehängten SChaltung beim I und D-Anteil durch Kp
> geteilt wird.
> Multiplizierst du das Kp rein, ist es das zeitkontinuierliche Äquivalen
> zu der in deimem Post angegebenen Gleichung.

Okay also ich habe verstanden,

das es eine zeitkontinuierliche Variante mit Integrale (wie in der 
angehängten Gleichung) und eine zeitdiskrete wie in der C-Gleichung 
gibt.

Eigentlich will ich ja nur eines Wissen,

wie setzte ich die angehängte zeitkontinuierliche Gleichung in eine 
zeitdiskrete Gleichung (c-code) um, wenn ich fragen darf ?

von Karl H. (kbuchegg)


Lesenswert?

Der Unterschied zwischen kontinuierlich und diskret besteht in diesem
Fall darin, dass man die Integrale durch Summen ersetzt :-)

Was anderes bleibt einem in einem Digitalcomputer ohnehin nicht übrig, 
weil der COmputer nun mal nicht dauernd lückenlos integrieren kann, wie 
es ein Kondensator kann.

von Dennis P. (seedman)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Der Unterschied zwischen kontinuierlich und diskret besteht in diesem
> Fall darin, dass man die Integrale durch Summen ersetzt :-)
>
> Was anderes bleibt einem in einem Digitalcomputer ohnehin nicht übrig.

Okay, also kann ich die angehängte Formel im Microcontroller nicht 
verwenden und muss mich auf die bisher bekannte "Summenformel" 
beschränken...

von Karl H. (kbuchegg)


Lesenswert?

Du scheinst es immer noch nicht kapiert zu haben.

Das hier
1
e = w - x;                                  //Vergleich
2
esum = esum + e;                            //Integration I-Anteil
3
y = Kp*e + Ki*Ta*esum + Kd/Ta*(e  ealt);   //Reglergleichung
4
ealt = e;

IST die diskrete Umsetzung deiner Formel aus dem Eröffnungsposting!

Wenn du unbedingt darauf bestehst, dann kannst du natürlich

   Kp*e  + Ki * irgendwas   + Kd * irgendwas_anderes

durch

  Kp * ( e  + Ki/Kp * irgendwas + Kd/Kp * irgendwas_anderes )

ersetzen. Aber ausser das du dem Computer 2 Divisionen mehr aufbürdest, 
kommt da das gleiche raus. Das ist einfach nur die Formel ein bischen 
umgestellt - mehr nicht!

Mathe!

   a * (b + c)   <==>   a*b + a*c

von Dennis P. (seedman)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du scheinst es immer noch nicht kapiert zu haben.

Ja sorry, ich habe es ja jetzt kapiert.

Danke für eure Antworten :-)

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Der Unterschied zwischen kontinuierlich und diskret besteht in diesem
> Fall darin, dass man die Integrale durch Summen ersetzt :-)
>
> Was anderes bleibt einem in einem Digitalcomputer ohnehin nicht übrig,
> weil der COmputer nun mal nicht dauernd lückenlos integrieren kann, wie
> es ein Kondensator kann.

Und natürlich das Differential durch den Differenzenquotienten ersetzt. 
Aus dem gleichen bzw. ähnlichen Grund wie beim Integral.

von Carsten M. (ccp1con)


Lesenswert?

In diesem Zusammenhang:

Ich habe jetzt schon zum zweiten Mal gesehen, dass der D-Term 
subtrahiert wurde.
1
// the magic feedback bit
2
  return  pTerm + iTerm - dTerm;

und
1
axisPID[axis] =  PTerm + ITerm - DTerm;

Ich kann aber bei der Ermittelung der Terme keinen Grund erkennen, warum 
nicht addiert wird (wie in der allgemeinen Formel angegeben).

Oder kann der Differenzierbeiwert Kd auch negativ werden?
Wenn ja, wann kann/sollte das der Fall sein?

von Frank K. (fchk)


Lesenswert?


von Heya ho. (Gast)


Lesenswert?

Das ist doch voellig egal. Dann wechselt eben das Vorzeichen des 
Koeffizienten, oder die Differenz e-ealt wird nach ealt-e gewechselt. 
Der D-Anteil ist eh der Letzte der eingestellt wird. In einer Richtung 
wird's besser, auf die Andere wird's schlechter.
Ich habd den D-Anteil noch nie verwendet, denn das ADC Rauschen bringt 
so Unruhe ins System.

von Carsten M. (ccp1con)


Lesenswert?

Danke Frank,

"eliminating the derivate kick"

Sehr gute Seite!

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.