malthy
18.05.2010, 17:24
Hallo!
Um möglichst direkt auf den Punkt zu kommen: Ich habe bereits an verschiedenen Stellen digitale PID-Regler verwendet - sonderlich schwierig ist das ja auch nicht. Allerdings muss ich zugeben, dass ich mir die Sache nie ganz zu Ende überlegt habe, auch wenn mir der D-Anteil schon immer irgendwie etwas seltsam vorkam ;-). Das Problem bei einem "digitalen D-Anteil" ist ja wohl, dass er immer nur instantan wirken kann, also von Sample zu Sample. Ich habe in dieser Sache etwas recherchiert, und siehe da, das ist natürlich ein alter Hut: man sollte sinnvollerweise einen PIDT1-Regler verwenden, also ein D-Glied mit exponentiellem Abfall.
Auf der Diskussionsseite zum RN-Wissen Artikel "Regelungstechnik" ist ja sogar ein Codeschnipsel, der angeblich ein solches Verhalten implementiert (http://www.rn-wissen.de/index.php/Diskussion:Regelungstechnik). Allerdings habe ich diesen nicht so richtig verstanden und mich deshalb daran gemacht, die Sache selbst zu implementieren (was am Ende ja oft schneller geht, als anderer Leute Code zu verstehen…). Um nun meine eigentliche Frage allen weiteren Details vorweg zu nehmen: Mein Regler tut qualitativ was er soll, sprich: die Sprungantwort sieht so aus, wie sie aussehen soll. Ich bin mir aber unsicher, ob die Dinge auch quantitativ stimmen, ob also die Werte, die ich aus den typischen Parametrisierungsverfahren erhalte, den DT1-Anteil korrekt gewichten.
Zunächst mal etwas Code. Das ist so eine Art Pseudocode, also keine bestimmte Programmiersprache, die Sache ist ja ziemlich "klartext".
do
//aktuelle regelabweichung
e = soll - ist;
//P-Anteil
P = e * kp;
//I-Anteil
I = esum * ki * ta;
//DT1-Anteil
//grundlage: out(i) = a0 * in(i) + a1 * in(i-1) + b1 * out(i-1);
DT1 = a0 * e + a1 * ealt + b1 * DT1;
//zu PIDT1 kombinieren
PIDT1 = P + I + DT1 * kd;
esum = esum + e;
ealt = e;
loop
P- und I-Anteil sind hier unproblematisch. Die Werte Ki und Kd berechne ich aus Tn und Tv, diese erhalte ich neben Kp aus den klassischen Einstellregeln (bzw. durch probieren), ta ist die Abtastzeit (also der zeitl. Abstand zwischen zwei Samples). Meine Herangehensweise an den DT1-Anteil war: DT1 müsste ja ein einfacher Hochpass sein, den man in diesem Anwendungsfall am besten als rekursiven Filter implementiert. Also habe ich da nochmal nachgelesen und komme zu dem Ergebnis:
out(i) = a0 * in(i) + a1 * in(i-1) + b1 * out(i-1)
Wobei in[i] das Eingangs- und out[i] das Ausgangssignal zum Zeitpunkt i sind. Wie ich aus der gewünschten Zeitkonstante die Parameter a0, a1 und b1 bestimme, ist mir klar. Ich habe außerdem gelesen, dass man die Zeitkonstante des DT1-Gliedes auf Tv/4 stellt. Somit kann ich den nötigen Hochpass umsetzen. Nun soll ja aber nicht nur die Zeitkonstante des DT1-Gliedes von Tv abhängen, sondern auch das "Gewicht" mit dem es in den PIDT1-Wert eingeht, zumindest setze ich das mal voraus, denn beim reinen PID-Regler ist es ja (nachvollziehbarerweise) auch so. Ist es also korrekt, wenn ich, analog zum PID, den DT1-Anteil nochmal mit Tv gewichte? So habe ich es im Code getan, wie man sieht.
Ich hoffe ich habe mich halbwegs verständlich machen können, ich würde mich wirklich freuen, wenn jemand die Mühe auf sich nehmen könnte, die Sache einmal im Detail nachzuvollziehen.
Ich danke schonmal sehr!
Malte
Um möglichst direkt auf den Punkt zu kommen: Ich habe bereits an verschiedenen Stellen digitale PID-Regler verwendet - sonderlich schwierig ist das ja auch nicht. Allerdings muss ich zugeben, dass ich mir die Sache nie ganz zu Ende überlegt habe, auch wenn mir der D-Anteil schon immer irgendwie etwas seltsam vorkam ;-). Das Problem bei einem "digitalen D-Anteil" ist ja wohl, dass er immer nur instantan wirken kann, also von Sample zu Sample. Ich habe in dieser Sache etwas recherchiert, und siehe da, das ist natürlich ein alter Hut: man sollte sinnvollerweise einen PIDT1-Regler verwenden, also ein D-Glied mit exponentiellem Abfall.
Auf der Diskussionsseite zum RN-Wissen Artikel "Regelungstechnik" ist ja sogar ein Codeschnipsel, der angeblich ein solches Verhalten implementiert (http://www.rn-wissen.de/index.php/Diskussion:Regelungstechnik). Allerdings habe ich diesen nicht so richtig verstanden und mich deshalb daran gemacht, die Sache selbst zu implementieren (was am Ende ja oft schneller geht, als anderer Leute Code zu verstehen…). Um nun meine eigentliche Frage allen weiteren Details vorweg zu nehmen: Mein Regler tut qualitativ was er soll, sprich: die Sprungantwort sieht so aus, wie sie aussehen soll. Ich bin mir aber unsicher, ob die Dinge auch quantitativ stimmen, ob also die Werte, die ich aus den typischen Parametrisierungsverfahren erhalte, den DT1-Anteil korrekt gewichten.
Zunächst mal etwas Code. Das ist so eine Art Pseudocode, also keine bestimmte Programmiersprache, die Sache ist ja ziemlich "klartext".
do
//aktuelle regelabweichung
e = soll - ist;
//P-Anteil
P = e * kp;
//I-Anteil
I = esum * ki * ta;
//DT1-Anteil
//grundlage: out(i) = a0 * in(i) + a1 * in(i-1) + b1 * out(i-1);
DT1 = a0 * e + a1 * ealt + b1 * DT1;
//zu PIDT1 kombinieren
PIDT1 = P + I + DT1 * kd;
esum = esum + e;
ealt = e;
loop
P- und I-Anteil sind hier unproblematisch. Die Werte Ki und Kd berechne ich aus Tn und Tv, diese erhalte ich neben Kp aus den klassischen Einstellregeln (bzw. durch probieren), ta ist die Abtastzeit (also der zeitl. Abstand zwischen zwei Samples). Meine Herangehensweise an den DT1-Anteil war: DT1 müsste ja ein einfacher Hochpass sein, den man in diesem Anwendungsfall am besten als rekursiven Filter implementiert. Also habe ich da nochmal nachgelesen und komme zu dem Ergebnis:
out(i) = a0 * in(i) + a1 * in(i-1) + b1 * out(i-1)
Wobei in[i] das Eingangs- und out[i] das Ausgangssignal zum Zeitpunkt i sind. Wie ich aus der gewünschten Zeitkonstante die Parameter a0, a1 und b1 bestimme, ist mir klar. Ich habe außerdem gelesen, dass man die Zeitkonstante des DT1-Gliedes auf Tv/4 stellt. Somit kann ich den nötigen Hochpass umsetzen. Nun soll ja aber nicht nur die Zeitkonstante des DT1-Gliedes von Tv abhängen, sondern auch das "Gewicht" mit dem es in den PIDT1-Wert eingeht, zumindest setze ich das mal voraus, denn beim reinen PID-Regler ist es ja (nachvollziehbarerweise) auch so. Ist es also korrekt, wenn ich, analog zum PID, den DT1-Anteil nochmal mit Tv gewichte? So habe ich es im Code getan, wie man sieht.
Ich hoffe ich habe mich halbwegs verständlich machen können, ich würde mich wirklich freuen, wenn jemand die Mühe auf sich nehmen könnte, die Sache einmal im Detail nachzuvollziehen.
Ich danke schonmal sehr!
Malte