Verschiedene PID-Regelalgorithmen in C für AVRs

#3010998
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" ?
Angehängte Dateien:
#3011015
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. ;-)
#3011046
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.
#3011047
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...
#3011054
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)
Gast #3011057
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
#3011060
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 ?
#3011076
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.
#3011082
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...
#3011084
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
#3011100
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.
#3049027
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?
Gast #3049098
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren