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" ?
@ 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. ;-)
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.
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...
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.
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)
"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
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 ?
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.
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...
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
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 :-)
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.
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?
Lies mal das hier: http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/ fchk
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.