Forum: Mikrocontroller und Digitale Elektronik Tuning der Gain-Parameter eines PID-Reglers


von Christoph S. (mcseven)


Lesenswert?

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:
1
ISR(TIMER1_OVF_vect) {
2
  double e, y;
3
  static double eAlt=0, eSum=0;
4
  long tmp;
5
6
  e  = currentCoolerTargetTemperature; // globales u_int16
7
  e -= ((struct ds18b20)*temperatureSensorColdSide).temperature;  // globales u_int16
8
  eSum += e;
9
  // Begrenzen des I-Anteils...
10
  if (eSum>5) eSum = 5;
11
  if (eSum<-5) eSum = -5;
12
  y=(0.1 * e) + (0.5 * eSum) + 5 * (e-eAlt);
13
  // Begrenzen des Ausgangssignals...
14
  if (y>1000) y=1000;
15
  if (y<-1000) y=-1000;
16
  eAlt = e;
17
  tmp = ceil((float)OCR1A - y);
18
  if (tmp > 65535) tmp = 65535;
19
  if (tmp < 0)   tmp = 0;
20
  OCR1A = (unsigned int) tmp;
21
}

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.

von ge-nka (Gast)


Lesenswert?

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.

von Anja (Gast)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Christoph S. (mcseven)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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

von Christoph S. (mcseven)


Lesenswert?

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...

von Purzel H. (hacky)


Lesenswert?

>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.

von Oliver (Gast)


Lesenswert?

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

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.