Datum:
N'Abend, ich hab mir einen PID-Regler programmiert, der eine Temperaturregelung (Kühlung per Peltier) eines isolierten Flüssigkeitsbehälters realisieren soll. Ja, Wikipedia und andere Literatur zum Try&Error-Einstellen der Parameter ist mir geläufig. Nein, in diesem Falle nicht anwendbar, denn die Regelung ist _träge_ (20°C->4°C dauern knapp 2 Stunden). Ich möchte nicht 30 Minuten davorsitzen, um zu schauen, ob die Schwingung jetzt aufgehört hat. Der Regler bekommt einen je UINT16 als Meßgröße (DS18S22), Stellgröße (AVR-OCR1A-PWM-Peltier) und Sollgröße (über GUI einstellbar). Dabei werden Meß- und Sollgröße als Fix-Kommawert mit zwei Nachkommastellen behandelt (00400 ^= 4,00°C). Die Abtastrate beträgt 244 (16MHz/0xFFFF) Hz und ist sehr konstant, da sie über die TOVR-ISR des Timers1 realisiert wird. Code der ISR:
ISR(TIMER1_OVF_vect) {
double e, y;
static double eAlt=0, eSum=0;
long tmp;
e = currentCoolerTargetTemperature; // globales u_int16
e -= ((struct ds18b20)*temperatureSensorColdSide).temperature; // globales u_int16
eSum += e;
// Begrenzen des I-Anteils...
if (eSum>5) eSum = 5;
if (eSum<-5) eSum = -5;
y=(0.1 * e) + (0.5 * eSum) + 5 * (e-eAlt);
// Begrenzen des Ausgangssignals...
if (y>1000) y=1000;
if (y<-1000) y=-1000;
eAlt = e;
tmp = ceil((float)OCR1A - y);
if (tmp > 65535) tmp = 65535;
if (tmp < 0) tmp = 0;
OCR1A = (unsigned int) tmp;
}
|
Mit den Parametern wie oben im C-Code verhält sich das Teil wie ne schlechte Zweipunktregelung. Kann mir nun jemand eine Methode nennen, wie ich die Parameter berechnen kann, so dass der Regelkreis möglichst stabil bleibt? Oder mich in die richtige Richtung weisen, was ich denn messen muss, um welchen Parameter wie zu berechnen. Danke.
Datum:
Ziegler und Nichols (ZN),Chien, Hrones und Reswick zwei bekannte Methoden um einen PID Regler mit Hilfe der Sprungantwort oder bei Schwingen der Regelstrecke zu optimieren. http://www.eat-engineer.de/Regleroptimierung.htm PS. Wenn es so träge ist wäre ein PI-Regler besser geeignet.
Datum:
Christoph Söllner schrieb: > Oder mich in die richtige Richtung weisen, Generell gilt: solange der Ausgang in der Begrenzung ist sollte der I-Anteil eingefroren sein. Ansonsten lernt der Regler einen falschen I-Anteil. Eine mögliche Strategie könnte sein 2 verschiedene Parametersätze für die Regler zu verwenden. (Großsignalverhalten und Kleinsignalverhalten je nach Regelabweichung). Das grundsätzliche Problem ist daß die Regelstrecke nicht linear ist. Der Regler muß sich in Richtung "kalt" viel mehr anstrengen als in Richtung "Warm". Normalerweise schaltet man in solchen Fällen ein Modell mit aus den Störgrößen (Umgebungstemperatur usw.) berechneten Parametern parallel zum Regler um den eigentlichen Regler zu linearisieren. Wahrscheinlich ist ein 2-Punktregler doch die bessere Strategie. Zumindest in der Abkühlphase. In der Haltephase kannst du ja dann den Integrator des PI-Reglers aus den Ein- + Ausschaltzeiten des 2-Punktreglers initialisieren. Gruß Anja
Datum:
Du scheinst einen AVR zu benutzen. Schau dir mal AVR221 an: http://www.atmel.com/Images/doc2558.pdf Da wird auch einiges zur Theorie erklärt. Da die Parameter hier schön getrennt sind, kannst du aus diesem Regler auch einen PI basteln.
Datum:
Grüße, Danke euch, @AN221: hab ich schon gelesen gehabt, wie man die Parameter einstellt, steht ja da auch nicht beschrieben. Das Problem ist tatsächlich die extrem große Totzeit der Regelstrecke. Nachdem's sowieso nur eine träge T-Regelung ist, hab ich das PID-Konzept übern Haufen geworfen und regele jetzt nur noch mit P und Verstärkungsfaktor 0.8, sonst gleich wie oben. Tut im Test recht zuverlässig, allerdings ist der Regler schon die ganze Zeit in der Nähe des Sollwertes. Ein Test von 20°C -> 4°C steht noch aus.
Datum:
Vllt. baust du dir ne serielle Schnittstelle ran ? Dann hast du jedenfalls einen Überblick über die Trends und kannst online die Parameter ändern, bevor du sie ins EEPROM oder in #define's festnagelst. Bei meiner Motorregelung hat sich das bewährt, gerade beim Einbringen von Störgrössen und den vielen unterschiedlichen Testmaschinen hier. Zugegeben, das liegt bei dir anders, aber vorschlagen tu ichs trotzdem mal :D
Datum:
hehe, ist schon drin, und die Motorregelung (PC-Lüfter über PWM und Tacho-Signal) klappt einwandfrei. Kann sogar mitm Radiergummer den Lüfter leicht bremsen (soviel Power hat das einfach nicht) und der PID regelt in 0.1 Sekunden wieder aus; und auch das Entfernen der Last wird einwandfrei abgefangen. Nur mit dem verflixten Temperatur-Dingen will es nicht. Naja, der Test mit 20° Wasser läuft...
Datum:
>Ja, Wikipedia und andere Literatur zum Try&Error-Einstellen der
Parameter ist mir geläufig. Nein, in diesem Falle nicht anwendbar, denn
die Regelung ist träge (20°C->4°C dauern knapp 2 Stunden). Ich
möchte nicht 30 Minuten davorsitzen, um zu schauen, ob die Schwingung
jetzt aufgehört hat.
Dann kan man sich ja eine Simulation der Strecke schreiben, sodass man
sie dann im Schnellgang simulieren kann.
Nochwas. Der PID fuer Temperaturegelung sollte modifiziert werden. Nimm
mal eine Kurve auf : Wie sich die Heizleistung auf die Endtemperatur
auswirkt. Dh eine Leistungsrampe fahren, die wesentlich langsamer wie
der Prozess ist. Dann nimmt man den P(T) Zusammenhang als erste
Ansteuerung aund haengt den PID drueber. Also Leistung := P(T) + PID.
Die P(T) Ansteuerung kann als Funktion oder als interpolierte Tabelle
ausgefuehrt sein.
Datum:
Christoph Söllner schrieb: > Das Problem ist tatsächlich die > extrem große Totzeit der Regelstrecke. ??? Das System hat zwar große Zeitkonstanten, aber überhaupt keine Totzeit. Insofern ist das relativ einfach zu regeln. Christoph Söllner schrieb: > Ja, Wikipedia und andere Literatur zum Try&Error-Einstellen der > Parameter ist mir geläufig. Nein, in diesem Falle nicht anwendbar, denn > die Regelung ist träge (20°C->4°C dauern knapp 2 Stunden). Doch. Ziegler und Co. sind die Zeitkonstante ziemlich egal. Oliver