Hallo!
Ich soll einen Temperaturregler implementieren, hab aber noch nie einen
Regler implementiert. Deswegen bitte ich euch um Hilfe...
Es geht um einen Temperaturregler (Kühlung). Es soll eine Metallkammer
mit Peltierelementen gekühlt werden. Die Peltiers kann ich mit einem
DutyCycle vom µC aus ansteuern (es wird die Spannung an den Peltiers
dadurch eingestellt), die Temperatur in der Kammer wird mit
Temperatursensoren gemessen. Die Temperatur soll auf 6 +/- 1°C gehalten
werden. Ohne Regelung funktioniert das Ganze schon gut, wenn ich einen
fixen Wert als DutyCycle (Spannung an Peltiers) einstelle und das System
laufen lasse, bekomme ich nach einer gewissen Zeit die gewünschte
Temperatur (die andere Seite der Peltiers wird mit Kühlkörpern und
Lüftern gekühlt, die würde ich zunächste mal auf einen fixen Wert
einstellen, das wird später dann ein eigener Regelkreis mit der
TEmperatur am Kühlkörper)... Auch die Temperaturmessung funktioniert
ganz gut (Kann die Temperatur in der Kammer auf +/- 0,5°C genau messen.
Die ganze Peripherie funtkioniert also, es muss nur der Regler
implementiert werden.
Was dazu noch zu sagen ist, ist, dass das System sehr träge ist (wie
vermutlich immer wenn die Temperatur geregelt werden soll). Wenn ich mit
der vollen Leistung fahre, dauert es um die 2 Stunden, bis ich auf 6°C
bin.
Was ich also habe ist:
Temperaturwert in°C (float) oder entsprechenden ADC Wert)
und ich kann über einen Wert (0-100% bzw entsprechender Digitalwert in
Registern) die Spannung am Peltier einstellen.
Der Temperaturwert wird über den ADC Wert eingelesen (Spannungsteiler
mit NTC) und in die Temperatur in °C umgerechnet. Alle 100ms wird
automatisch eine AD Wandlung durchgeführt und damit die Temperatur
gemessen (es wird eine ISR alle 100ms aufgerufen und der ADC-Wert
eingelesen). Hier würde ich dann auch jedesmal den Regler aufrufen...
Welchen Reglertyp würdet ihr hier prinzipiell auswählen? Ich dachte an
PI ohne D anteil, was sagt ihr dazu?
LG
Beim Regler hat man die Wahl. Je mehr Parameter, desto schwieriger wird
die Einstellung, aber desto genau kann es auch werden. Wenn keine so
starken Störungen da sind kann PI reichen, wenn es schneller werden soll
dann eher PID. Beim PID hat man halt mehr Parameter passend zu wählen.
Ein Tip noch: Die Kühlleistung der Peltierelemente ist nichtlinear vom
Strom abhängig. Irgendwo bei etwa dem maximal erlaubten Strom ist die
Kühlleistung maximal - darunter ist die Kurve in ganz guter Näherung
eine Parabel. Je nachdem wie gut die Kühlung auf der heißen Seite ist,
verschiebt sich ggf. das Optimum noch etwas zu kleineren Strömen. Für
die Regelung lohnt es sich da die Kurve wenigstens näherungsweise zu
linearisieren: also den Regler die Kühlleistung berechnen lassen, und
dann anhand er Parabel den passenden Strom zu berechnen.
Eine AD-Wandlung alle 100 ms ist ggf. empfindlich auf Störungen durch
die Netzfrequenz. Besser wären jeweils 4 Wandlungen mit 5 ms Abstand:
Damit hätte man eine ganz brauchbare Unterdrückung von 50 Hz und 100 Hz
Störungen. Vor allem mit Differential Anteil sollte die Messung nicht zu
viel Rauschen und Störungen drin haben, auch wenn es nicht so dramatisch
ist wie es auf den ersten Blick aussieht.
Ulrich schrieb:> Beim Regler hat man die Wahl. Je mehr Parameter, desto schwieriger wird> die Einstellung, aber desto genau kann es auch werden. Wenn keine so> starken Störungen da sind kann PI reichen,
Bei 'den' Zeitkonstanten?
Da ist der INtegralanteil sowieso dauernd in der Sättigung.
Werner13 schrieb:> Die Peltiers kann ich mit einem> DutyCycle vom µC aus ansteuern (es wird die Spannung an den Peltiers> dadurch eingestellt)
Wieso eigentlich PWM. In den PWM Pausen diffundiert die im aktiven Teil
des Pulses mühsam auf die eine Seite transportierte Leistung sofort
wieder zurück, d.h. sie pendelt hin und her, ohne eine richtige Chance
zu haben, den Kühlkörper zu erreichen oder gar an die Umgebung abgeführt
zu werden. IMHO wäre eine Stromquelle, z.B. ein Schaltregler mit einer
Induktivität als Zwischenspeicher deutlich effektiver.
Hallo,
das mit dem Zweipunktregler hatte ich mir auch schon überlegt, da ich
das regelmodul jedoch öfter brauche, wollte ich gleich einen passenden
regler implementieren. Ich denke, ich werde fürs erste einen PI-Regler
implementieren...
Zur Zeit mach ich alle 100ms eine Wandlung und berechne daraus direkt
die Temperatur. Deinen Tip werde ich annehmen, ev. alle 5ms wandeln und
aus 4 wandlungsergebnissen den mittelwert wählen. Erst wenn diese 4
Werte vorhanden sind aus dem mittelwert die Temperatur berechnen und mit
diesem Wert den regler aufrufen. Aber ist das nicht eine viel zu
schnelle abtastung für so ein träges system?
Anbei ein Diagramm das ich aufgenommen habe: Hier hab ich einfach fast
die volle Leistung ans Peltier geschalten und die Temperatur mitgemessen
(auf der X-Achse sieht man die Zeit, 2h). Kann ich nun daraus die
Regelparameter bestimmen?
LG
Wenn man 4 Werte Mittelt um dann damit eine Temperatur zu bestimmen
macht man die Abtastung nicht schneller. Der Regler sieht weiterhin nur
einen neuen Wert alle 100 ms. Je nach System sind die 100ms ggf. noch
recht schnell - für einen PI Regler ist eine schnelle Abtastung aber
kein Problem. Bei einem PID Regler muss man ggf. die Art wie man die
Steigung berechnet an die Abtastrate anpassen - einfach nur die
Differenz aus den letzten beiden Werten ist dann ggf. nicht mehr gut.
Ob der Integralteil in die Sättigung geht hängt von der Auslegung ab -
das ist relativ unabhängig davon wie schnell man Abtastet. Im Idealfall
wird der Regler nach dem Einschalten relativ schnell in die Sättigung
gehen und maximal Kühlen - erst kurz vor dem Erreichen der Endtemperatur
kommt er dann aus der Sättigung und kommt dann nicht mehr dahin.
Weil abzusehen ist, das der Regler in die Sättigung kommt, sollte man
auch ein Anti Windup drin habe, etwa in der Form, dass der Integralterm
nicht mehr erhöht wird, wenn die Kühlleistung bereits maximal ist.
Sieht nach nem PT2 System aus.
Da das System echt Träge ist, ist ein hoher P Anteil denkbar.
Ich empfehle WinFact...
Damit kann man ziemlich genau simulieren wie sich der Regelkreis
verhält!
Für da Bestimmen der passenden Regelparameter passt die Kurve im Prinzip
schon: interessant ist vor allem der aller erste Teil, vom Anschalten
der Kühlung bis zu den ersten etwa 20 Minuten. Das ist die Sprungantwort
des System. Wichtig ist dabei auch die Zeitskala nach dem Anschalten.
Aus der Sprungantwort lassen sich ganz gut die Parameter bestimmen. Als
Beispiel:
http://www.rn-wissen.de/index.php/Regelungstechnik#Dimensionierung_nach_Einstellregeln
Ein 2. Punkt wäre noch die Linearisierung der Kühlleistung vs. PWM Wert.
Das Peltierelement sollte nicht direkt das PWM Signal abbekommen - das
ist zum einen nicht so effektiv und zum anderen soll es nicht so gut für
die Lebensdauer sein. Die Kurve PWM Wert vs. Kühlleistung zu bekommen
ist leider relativ zeitaufwendig: am einfachsten wohl für etwa 4 oder 5
verschiedene PWM Werte die Kurve wie oben aufnehmen (je etwa 1/Stunde
sollte reichen) - daraus die maximale Steigung bestimmen und gegen den
PWM Wert auftragen. Das sollte eine Parabel geben mit einem Maximum etwa
beim maximalen PWM-wert oder ggf. auch etwas darüber.
@ Werner13 (Gast)
>regler implementieren. Ich denke, ich werde fürs erste einen PI-Regler>implementieren...
Ist schon OK.
>Zur Zeit mach ich alle 100ms eine Wandlung und berechne daraus direkt>die Temperatur. Deinen Tip werde ich annehmen, ev. alle 5ms wandeln und>aus 4 wandlungsergebnissen den mittelwert wählen.
Man kann es auch übertreiben. Bei einer Zeitkonstante von ~1h reicht
eine Abtastfrequenz von 1 Hz locker aus!
Und man braucht auch selten eine Float-Zahl, Festkommaarithmetik tut
es meistens auch deutlich resourcenschonender.
>(auf der X-Achse sieht man die Zeit, 2h). Kann ich nun daraus die>Regelparameter bestimmen?http://de.wikipedia.org/wiki/Reglerhttp://de.wikipedia.org/wiki/Faustformelverfahren_%28Automatisierungstechnik%29
Vielen Dank für die zahlreiche Hilfe!
@Michael: Ja stimmt. Ich steuer die Peltiers nicht direkt mit PWM an.
Mit der PWM stell ich nur die Spannung an den Peltiers ein, d.h. 0% PWM
OV an den Peltiers und 100% PWM 24V an den Peltiers. dazwischen ist eine
Stufe mit Treiber und Spulen...
@Ulrich:
Vielen Dank, ich werde gleich versuchen, die beiden Parameter aus der
Sprungantwort zu bestimmen.
Was meinst du aber mit der Linearisierung der Kühlleistung vs PWM? das
verstehe ich nicht ganz... ich werde mal versuchen die Parameter zu
bestimmen und dann einen code zu entwerfen. vielleicht kannst du mir
dann diesbezüglich noch mal weiterhelfen.
Ulrich schrieb:> Ob der Integralteil in die Sättigung geht hängt von der Auslegung ab -> das ist relativ unabhängig davon wie schnell man Abtastet. Im Idealfall> wird der Regler nach dem Einschalten relativ schnell in die Sättigung> gehen und maximal Kühlen - erst kurz vor dem Erreichen der Endtemperatur> kommt er dann aus der Sättigung und kommt dann nicht mehr dahin.
Ich habe mir schon Gedanken gemacht, wie diese erste Phase der Kühlung
mit dem regler ausschaun wird und hatte dabei bedenken, dass der maximal
zulässige Strom durch die Peltiers durch eine zu hohe Spannung
überschritten werden könnte, weil die gewünschte Temperatur nicht gleich
erreicht ist und der regler versucht die Spannung immer weiter zu
erhöhen. Bedeutet das, dass ich hier eine Grenze einstellen kann, dass
ich mir keine Gedanken über eine zu hohe Belastung der peltiers machen
muss??
@falk:
vielen Dank für den Tipp mit der festkommaarithmetik! das muss ich
unbedingt implementieren!
LG
>Wenn ich mit der vollen Leistung fahre, dauert es um die 2 Stunden,>bis ich auf 6°C bin.
Das sagt genauso viel aus wie wenn, nach 12 Wochen Trockenheit, ein
Landwirt sagt: "Schönes Wetter heute".
Früher gings dabei um Masse und Wärmeabfuhr "Kühlleistung" - falls es so
etwas überhaupt gibt.
Wird also ein Raum mit 5 Tonnen Inhalt in dieser Zeit abgekühlt, so ist
das ganze recht sportlich.
Wird ein Raum mit 10 cm³ und einem Papiertaschentuch, als Inhalt, in
dieser Zeit gekühlt, so solltest Du auch nicht mehr einbringen.
Ich habe nun die Parameter aus der Kurve bestimmt (Skizze siehe Anhang):
Tu = 350s
Tg = 4300s
Ks = -0,011 °C/s
Daraus die Parameter (z.B. nach Ziegler/Nichols) berechnen:
Kp = 573 s/°C
Tn = 1155 s
Ki = Kp/Tn = 0,496 1/°C
Ich werde die Parameter natürlich noch genauer bestimmen, wichtig ist
nur ob die Vorgehensweise stimmt. Ist das so korrekt?
Ich nehme an, dass es hier nicht auf eine große Genauigkeit der
Parameter ankommt, richtig? Sprich: es ist nicht wirklich entscheidend,
ob z.B. Kp nun 570 oder 580 ist. Oder kokmmt es hier wirklich auf sehr
genaue werte an?
Mit diesen beiden Werten kann ich nun die Reglergleichung aufstellen...
Würde mich sehr über eine Rückmeldung freuen :)
Wenn die Steuerung den maximalen Strom des Peltierelements überschreiten
kann, sollte man den Strom unbedingt begrenzen. Am besten sogar
zusätzliche hardwaremäßig. Ein höherer Strom als etwa 80-95% des
Maximalwertes sind auch kontraproduktiv. Ab etwa dem Strom nimmt die
Kühlleistung wieder ab. Die Begrenzung legt man eher schon auf den
optimalen Strom, auch wenn ggf. etwas mehr zulässig wäre.
Wenn man die Kühlleistung als Funktion des Stromes betrachtet, erhält
man beim Peltierelement keine Gerade, sondern eine nach unten offene
Parabel mit einem Maximum irgendwo knapp unterhalb des maximalen
Stromes. Oft wird auch im Datenblatt der Strom für die maximale
Kühlleistung bzw. maximale Temperaturdifferenz angegeben. I.A. gilt dies
unter der Randbedingung sehr guter Kühlung auf der heißen Seite; mit
einer nicht so guten Kühlung verschiebt sich der optimale Strom noch
einmal nach unten.
Diese nichtlineare Kennlinie des Stellgliedes erschwert die Regelung,
weil das System nicht mehr linear ist, wie in der Regelungstheorie
vorausgesetzt. Über die Kennlinie lässt sich der nichtlineare Effekt
ausgleichen. Der Regler berechnet also die gewünschte Leistung - da ist
das System in guter Näherung linear. Der passende PWM Wert kann dann
einfach per Formel ausgerechnet werden. Das Problem kennt man so ähnlich
von der Heizung mit vorgegebener Spannung - auch das ist nichtlinear
(andere Richtung, aber ähnliches Problem).
So super genau müssend die Regelparameter nicht sein - sonst würde kaum
ein Regler funktioniere. Man sieht es auch schon daran, dass es mehrere
verschiedene Rezepte gibt um aus der Sprungantwort die Regelparameter zu
bestimmen. Das sind halt alles Näherungen mit etwas Reserve damit der
Regler nicht gleich anfängt zu schwingen. Es gibt im Prinzip einen
optimalen Satz Parameter, andere Regler funktionieren auch, sind aber
langsamer bzw. zeigen mehr Überschwinger. Das Verhältnis der Ki, Kp und
ggf. Kd sollte so etwa (+-25%) stimmten - wenn die Werte insgesamt
kleiner werden wird es zunehmend weniger kritisch, der Regler aber auch
langsamer.
Wenn der PI Regler so zu langsam ist, wird man auch kaum versuchen die
Parameter noch etwas zu verbessern, sondern dann auf einen PID-Regler
umsteigen.
Grüß Euch!
Das Pletier kann maximal 5A, das wird auch hardwaremäßig begrenzt. Aber
wie kann ich es softwaremäßig begrenzen?
Hab nun einen Regler implementiert, den ich euch kurz präsentieren will:
Hab gleich einen allgemeinen PID Regler implementiert, der D-Anteil wird
fürs erste, da ich ja nur einen PI will, einfach auf Null gesetzt. Nun
wird jede Sekunde der ADC Wert eingelesen und die Temperatur daraus
berechnet. Die berechnete Temperatur und die Solltemperatur werden eine
Reglerfunktion übergeben. Zusätzlich werden Regelparameter eines Reglers
in eine Struktur zusdammengefasst:
1
typedefstruct
2
{
3
U16Ta;// sampling time in s
4
U16Kp;// P part
5
floatKi;// I part
6
U16Kd;// D part
7
floatoffset;// control deviation
8
floatoffset_sum;// sum of offsets
9
floatold_offset;// offset of the last sampling
10
U8duty_cycle;// controlled variable
11
U8trigger_threshold;// within this value around the nominal value nothing happens
12
}st_PID_settings;
13
14
st_PID_settingsControlTec0={
15
.Ta=5,
16
.Kp=573,
17
.Ki=0.5,
18
.Kd=0,
19
.offset=0.0,
20
.offset_sum=0.0,
21
.old_offset=0.0,
22
.duty_cycle=0,
23
.trigger_threshold=1,
24
};
Ich rechne hier alles in den Einheiten Sekunde und °C.
Die Werte für Kp und Ki wurden wie oben angeführt aus der Sprungantwort
berechnet. Kann das ungefähr hinkommen?
Wird die Temperatur nun jede sekunde berechnet, wird folgedne
Reglerfunktion aufgerufen:
1
U8PID_control(floatactual_value,floatnominal_value,st_PID_settings*PID)// actual value: Istwert; nominal_value: Sollwert
2
{
3
PID->offset=nominal_value-actual_value;// calculate control error
if((PID->duty_cycle>0)&&(PID->duty_cycle<60))// anti windup: freeze integration in case of overdriven actuator
9
{
10
PID->offset_sum+=PID->offset;// update sum of control errors
11
}
12
13
PID->duty_cycle=(PID->Kp*PID->offset)+(PID->Ki*PID->Ta*PID->offset_sum)+(PID->Kd*(PID->offset-PID->old_offset)/PID->Ta);// control equation
14
15
PID->old_offset=PID->offset;
16
}
17
18
if(PID->duty_cycle>60)
19
{
20
PID->duty_cycle=60;
21
}
22
if(PID->duty_cycle<1)
23
{
24
PID->duty_cycle=0;
25
}
26
27
returnPID->duty_cycle;
28
}
Meine Stellgröße ist der duty_cycle in %, mit dem die SPannung am
Peltier eingestellt wird (ich will diese vorerst mit 60 begrenzen). Ist
dies schon die beschrieben Begrenzung durch software?
Ist der regler so richtig implementiert?
Ich versteh das nicht ganz:
angenommen, ich hab raumtemperatur wenn ich den regler starte und ich
will auf 15°C regeln. Dann ist die differenz aus sollwert - istwert ca.
-8 und wenn Kp 573 ist, dann hab ich hier schon einen sehr großen (573*
(-8)) Wert (negativ) für meine Stellgröße, den duty cycle. zusätzlich
kommt dann noch der I-Anteil dazu...
Was ist hier falsch? Kann ich den DutyCycle als Stellgröße verwenden?
Liegt der Fehler einfach an einem zu hohen Kp wert?
Werner13 schrieb:> angenommen, ich hab raumtemperatur wenn ich den regler starte und ich> will auf 15°C regeln. Dann ist die differenz aus sollwert - istwert ca.> -8 und wenn Kp 573 ist, dann hab ich hier schon einen sehr großen (573*> (-8)) Wert (negativ) für meine Stellgröße, den duty cycle.
Dann hast du dein Kp falsch rum bestimmt. Das sollte dann negativ sein.
Irgendwo muss da ein Vorzeichenwechsel rein. Sieh es so: Je niedriger
die Soll-Temperatur desto größer ist der Absolutwert des Fehlers. Da es
sich bei dir um eine Kühlung handelt, wirst du dein Element stärker
aufdrehen wollen, damit die Temperatur sinkt, wodurch der Fehler kleiner
wird.
Der übliche betrachtete Normalfall ist ja gerade anders rum. Da ist
meistens von zb einer Heizung die Rede. Und da ist es ja so, dass der
Istwert größer wird (ist ja die Temperatur), je mehr man den Aktuator (=
die Heizung) aufdreht.
Bei dir ist es aber gerade anders rum: Die Temperatur wird niedriger, je
mehr du deinen Aktuator (= das Peltier Element) aufdreht. Also müssen da
ein paar Vorzeichendreher rein, die das berücksichtigen.
> Wert (negativ) für meine Stellgröße, den duty cycle.
Der wird dann positiv ....
> zusätzlich kommt dann noch der I-Anteil dazu...
... und kann logischerweise nicht größer als 100% werden. Selbst wenn
dein Regler auf 874% aufdrehen will, mehr als 100% geht nicht (der
Regler selbst weiß ja nichts von Prozenten. Der errechnet nur eine Zahl,
je größer desto mehr soll das dahinter liegende System arbeiten). Also
wirst du das begrenzen. In der anderen Richtung natürlich auch. Weniger
als 0% geht nicht. Einen Wert kleiner 0 könnte man als Heizung
interpretieren. Wenn der Regeler also haben möchte, dass dein Aktuator
mit -20% arbeitet, dann will er in Wirklichkeit heizen. Das kannst du
allerdings nicht, also nimmst du statt dessen 0%, was dein Peltier
Element effektiv ausschaltet und lässt der Natur ihren Lauf, deinen
was_auch_immer wieder zu erwärmen.
Formeln sind zwar ganz schön, aber wiiie sich die thermische Trägheit,
der Wärme/Kälteverlust/die Wärmeverteilung zur Masse und Leistung in der
wahren Welt verhalten, wird der TS wohl geduldig testen müssen um
anschließend die optimale Leistung und die passende Hysterese zu finden.
Zu viel Leistung führt zu großen Temperatursprüngen, zu kleine Leistung
erfordert viel Geduld bis zum Erreichen der Wunschtemperatur. Von
Peltierelementen würde ich allerdings keine Wunder erwarten.
oszi40 schrieb:> Formeln sind zwar ganz schön
und vor allen Dingen muss man auch ein bischen verstehen, was die Zahlen
die da rauskommen für eine Bedeutung haben.
Gerade bei einem PI(D) Regler sollte man da schon ein bischen Gefühl
dafür entwickelt haben, was da eigentlich rein geht, wie das ganze
arbeitet und was da raus geht.
Wer denkt, er braucht da nur die Formel zu implementieren, dann irgend
ein Verfahren zur Bestimmung der Parameter nachvollziehen, die
ermittelten Werte dann einsetzen und alles ist paletti, der hat mit
Zitronen gehandelt.
Das hat in der Technik noch nie funktioniert, das man etwas auf eigene
Faust baut, von dem man nichts oder nicht viel versteht.
Hmmm, das ist wirklich nicht einfach, wenn man das das erste mal
macht...
Das würde bedeuten, dass der Kp negativ und der Ki positiv ist, und die
wirken dann entgegen, richtig?
Wie soll ich denn die Aufsummierung für den I-Anteil begrenzen? Wenn ich
nur aufsummiere, wenn der Regler nicht in Sättigung ist (also im
gültigen Bereich zwischen dutycycle 0 und 60, siehe code), dann ist der
Regler ja dauerend in sättigung...?!
Werner13 schrieb:> Hmmm, das ist wirklich nicht einfach, wenn man das das erste mal> macht...>> Das würde bedeuten, dass der Kp negativ und der Ki positiv ist, und die> wirken dann entgegen, richtig?
Die würden dann wohl beide negativ sein.
Aber in deinem Fall kannst du auch hergehen und den Fehler genau anders
rum berechnen. Wenn die Isttemperatur höher als die Solltemperatur ist,
dann hast du eben einen 'positiven' Fehler. Je positiver desto mehr
heizen.
Denn je höher der positive Fehler, desto mehr versucht der Regler dem
entgegenzuwirken indem er die dahinter liegende Maschinerie (bei dir das
Peltier Element) aktiviert.
Die übliche Berechnung
1
Fehler = Sollwert - Istwert
stammt ja nur daher, dass man die Heizung umso mehr aufdrehen möchte, je
niedriger die Isttemperatur in Bezug zur Solltemperatur ist.
Stellst du die Heizung auf 30° ein und hat es 10° im Raum, dann hast du
einen Fehler von 30-10 gleich 20° (positiv!). positiver Fehler heisst:
die Heizung muss arbeiten.
Bei dir mit der Kühlung ist aber alles genau anders rum. Ist die
Solltemperatur 30° und dein Sensor meldet 10°, dann bist du
offensichtlich mit der Kühlung schon weit übers Ziel hinausgeschossen.
Du musst überhaupt nicht mehr Kühlen. Also bleibt die Kühlung aus.
Du könntest also in deinem Fall auch
1
Fehler = Istwert - Sollwert
rechnen und dafür Kp und Ki so lassen wie sie sind.
Du hast aber auch noch eine dritte Möglichkeit.
Du interpretierst das, was aus dem Regler rauskommt grundsätzlich als
'Heizung'. Positive Werte bedeuten 'heizen', negative Werte bedeuten
'kühlen'.
Wenn also der Regler ermittelt, dass er die Maschinerie mit 80 ansteuern
will (weil der Istwert kleiner als der Sollwert ist), dann will er
prinzipiell heizen. Ermittelt der Regler, dass er die Maschinerie
dahinter mit -80 ansteuern will (weil der Istwert größer als der
Sollwert ist), dann will er kühlen.
Heizen interessiert dich nicht. Daher ignorierst du positive Ergebnisse.
Was dich interessiert ist kühlen, also der Fall das der Regler eine
negative Zahl ermittelt. Der Regler will mit -80 kühlen, also stellst du
dein Peltier Element auf +80% ein.
> Wie soll ich denn die Aufsummierung für den I-Anteil begrenzen?
1
if(Summe<SummenMaximum&&Summe>SummenMinimum)
2
Summe+=Fehler
Für SummenMaximum und SummenMinimum denkst du dir Werte aus, die dir
sinnvoll erscheinen.
Ziel der Sache ist es, dass die Summe nicht über alle Schranken wachsen
kann, so dass der Regler erst mal diese Summe wieder abbauen muss, wenn
er übers Ziel hinausschiesst.
> gültigen Bereich zwischen dutycycle 0 und 60, siehe code), dann ist der> Regler ja dauerend in sättigung...?!
sag ich doch, dass ein einfacher Regler
wenn zu warm
dann kühlen
es auch tun würde. Aber mir glaubt ja keiner was.
das funktioniert so aber nicht,w eil sobald ich einmal über die grenzen
hinaus bin kann sich die summe nie mehr ändern!
Ja, ich werde soll- und istwert vertauschen, erscheint mir auch
sinnvoll! dann bleiben die beiden Werte Kp und Ki so wie ich sie
berechnet habe!
Könnte vielleicht jemand überprüfen, ob ich bei der Berechnung ungefähr
richtig liege oder ob sich hier ein grober Fehler eingebaut hat?!
Vielen Dank für eure Hilfe!
>> das funktioniert so aber nicht,w eil sobald ich einmal über die grenzen> hinaus bin kann sich die summe nie mehr ändern!
Ja ok.
Dann musst du das eben ein bischen abändern :-)
Sei halt ein wenig kreativ.
Das ganze ist hier sowieso mehr 'schwarze Magie', im Fachjargon auch
'Heuristik' genannt.
> Könnte vielleicht jemand überprüfen, ob ich bei der Berechnung> ungefähr richtig liege oder ob sich hier ein grober Fehler> eingebaut hat?!
Brenns auf den µC, lass es laufen und dein µC wird dir sagen, ob das
richtige passiert :-)
(wenn du noch eine Ausgabemöglichkeit hast, dann ist es sehr zu
empfehlen, sich da ein paar der Kennwerte ausgeben zu lassen, so dass du
verfolgen kannst, wie sich die einzelnen Zahlen im Lauf der Zeit
entwickeln)
Der Wert von KS ist oben falsch bestimmt worden. Das gibt grob abgelesen
aus der Graphik etwa -30 K Temperaturänderung für eine Änderung des PWM
Wertes von vermutlich etwa 50 . Das sollte also irgendetwas in der
Größenordnung -0,5 °C/pwm-schritt . Entsprechend sind berechneten Ki und
Kp deutlich zu groß.
Der 2. Punkt ist, dass es sehr wahrscheinlich keinen linearen
Zusammenhang zwischen dem PWM Wert und der Kühlleistung gibt. Da müsste
man noch den Zusammenhang aus messen / Schätzen und berücksichtigen.
Wenn man für den ersten Versuch linear nähern will, müsste man eher die
größte Steigung nehmen. Das dürfte bei einem kleinen PWM Wert der Falls
ein, vermutlich so das man auf Ks von rund -1 °C/pwm-schritt kommt.
Wenn immer nur das eine Ziel angestrebt wird, und entsprechend der PWM
Wert meistens in einem engen Bereich bleibt kann man ggf. auch mit der
Steigung in dem Bereich besser fahren - da wäre dann Ks vermutlich sogar
eher kleiner (vom Betrag).
Im Idealfall braucht man halt die richtige Umrechnung von PWM nach
Leistung (nicht unbedingt in W, eher relativ zur Leistung bei der
Sprungantwort oben) und zurück von der Leistung in den PWM Wert.
Ich glaube, Du machst es ein bisschen zu kompliziert.
Ein so träges und noch dazu von den Umgebungsvariablen stabiles System
braucht maximal einen PI-Regler, vermutlich recht P auch.
Und den ganzen Trubel mit Linearisierung etc. kann man sich HIER
wirklich sparen, es soll ja kein superschneller Präzisionsregler werden.
Du ermittelst einfach die ADC-Werte, die 5, 6 und 7° entsprechen, und
setzt diese direkt (ohne Umrechnung in °C) in den Regler ein:
6°C-Wert ist "soll", aus 5°- und 7°-Wert bestimmst Du P
Daher ist Karl-Heinz's Vorschlag (04.03.2014 18:06) schonmal ganz gut:
wenn zu warm: Peltier ein
else: Peltier aus
Das kann man noch verfeinern in Richtung P:
PWM = P x (soll - ist);
if(PWM< 0)PWM= 0; else
if(PWM>100)PWM=100;
wobei man P so wählt, dass z.B: bis 7°C PWM=100 und dann linear
runtergeht auf 0 bei 5°C.
Je nach ermittelten Werten muss man noch kürzen, dabei aufpassen, dass
der Wertebereich eingehalten wird. 16bit kann dann leicht ausreichen.
Also z.B. PWM = P x (soll - ist) / 16;
Auch muss PWM nicht von 0 bis 100 gehen, weil wir Menschen es so gewohnt
sind.
Bei diesem P-Regler merkt man dann, dass zum Erhalten einer konstanten
Temperatur ein PWM von z.B. 40 erforderlich ist. Das kann man dann
erweitern um den I-Regler, der diesen Wert automatisch ermittelt. Aber
bei konstanten Umgebungsbedingungen reicht es völlig aus, auf I zu
verzichten und den Sollwert so zu korrigieren, dass bei 6°C sich ein PWM
von 40% ergibt.
Einen aufwendigen (PI oder PID)-Regler braucht man nur, wenn
- die Umgebungsparameter / Last sich ständig ändern
- hohe Konstanz gefordert ist
- die Regelstrecke träge ist, d.h. z.B. der Heizkörper thermisch
schlecht angekoppelt ist und / oder eine große Masse besitzt.
Nebenbei: für einen Hochleistungs-Kühlungsregler ist es sinnvoll, auch
heizen zu können (und umgekehrt).
Zeitgleicher Parallelthread:
Beitrag "Digitale Stromregelung für Peltierelement"
Zur Schonung der PeltierElemente (mechanische Spannungen) kannst Du beim
Einschalten eine Rampe hochfahren.
Was sie auch nicht mögen: Kondenswasser
ADC-Werte filtere (und falls erwünscht erweitere / multipliziere) ich
immer so:
filter += ADC + filter/16; //PT1-Glied
Der Wert filter pendelt sich dann auf das 16-fache von ADC ein,
/16 sind für den µC vier einfache Shift-Befehle.
Bei einem 10Bit-ADC (0..1023) ergibt sich dann ein Wertebereich von 0 ..
16368. Optimal, um in die Reglerformel eingespeist zu werden.
Man kann sogar die "Verstärkung" noch weiter erhöhen, wenn man vorher
vom ADC eine Offset (von Werten, die nie erreicht werden können)
subtrahiert.
z.B. offset ist der ADC-Wert von -10° oder 100°:
filter += ADC - offset + filter/128; /ist schon ein starkes Filter
Das System sieht mir schon recht träge aus. Wie gut der Regler sein muss
hängt davon ab wie stark und schnell die äußeren Störungen sind. Ein
wesentlicher Einfallspunkt für externe Störungen ist eine Veränderung
der Temperatur auf der heißen Seite des Peltierelements. Die Schlägt
halt fast direkt und ggf. auch recht schnell durch. Die Forderung das
die Warme Seite um weniger als 1 K in etwa 1/2 Stunde gestört wird ist
schon eine recht heftige Einschränkung, zumindest bei Luftkühlung. So
gering sind da die Anforderungen an den Regler gar nicht.
Ob man das linearisieren braucht, hängt davon ab wie dicht man an den
Optimalen Strom bzw. die maximal mögliche Kühlleistung kommt. Nahe an
der tiefsten Temperatur wird die Kurve schon sehr flach. Da ist dann die
lineare Näherung nicht mehr wirklich brauchbar. Wo der optimale Strom
für das System (incl. nicht perfekter Kühlung auf der heißen Seite)
liegt sollte man schon etwa wissen - das braucht man auch schon für eine
sinnvolle Begrenzung des Stromes. Wenn man die Größe hat, kann man das
auch gleich richtig nutzen.
Wenn die Kühlung auf der heißen Seite schlecht ist, wird das ganze ist
sogar noch etwas komplizierter: mit einem Sprung im Strom ändert sich
dann nämlich auch die Temperatur auf der heißen Seite. Der Effekt hängt
dann auch noch anders vom Strom ab als die Kühlwirkung auf der kalten
Seite. Es wäre da schon gut zu wissen, wie die Kühlung der heißen Seite
aussieht.
@Ulrich:
Achso, ich hatte die Steigung der Kurve berechnet (bezogen auf die
Zeit), das solte eigentlich wie du sagst auf die Stellgröße bezogen
werden... Danke für den Hinweis!!!!
Also: ich hatte bei dem Versuch eine DutyCycle von 75% eingestellt. Die
Istgröße (Temperatur) ändert sich um 20°C. Das gibt dann einen Ks Wert
von 20°C / 0,75 = 26,66 °C/%
Richtig?
Daraus ergeben sich dann folgende neue Werte für den Regler:
Tu = 350s
Tg = 4300s
Ks = -20°C / 75% = -0,266 °C/%
Kp = 0,9/Ks * Tg/Tu = -41,46 %/°C
Tn = 3,3 * Tu = 1155s
Ki = Kp/Tn = -0,036 %/(s°C)
Passt die Berechnung nun so?
Ich hab mir den Regler mit den falschen Werten vorher theoretisch
durchüberlegt, und das ist mir echt komisch vorgekommen. VBielleicht
passts mit diesen Werten nun besser!
@All: Danke für die anderen zahlreichen vorschläge, aber ioch will den
weg mit dem PI-Regler weitergehn, weil ich das Modul für viele andere
Anwendungen auch brauchen werde!
Vielen Dank!
Zwecks Kühlung: Es werden 2 Peltiers verwendet. Jedes Peltier hat einen
relativ großen (BxLxH = 10x10x30 cm) Aluminiumkühlkörper, der mit
Wärmeleitpaste am Peltier angebracht ist. Durch diesen Kühlkörper wird
mit einem Ventilator Luft geblasen. Auch auf diesem Kühlkörper messe ich
die Temperatur mit, das wird später eine eigene Regelschleife, um die
Kühlkölrpertemperatur auf einem entsprechenden Wert zu halten. Vorerst
werde ich aber den Kühler konstant laufen lassen und die Regelung der
Peltier vornehmen...
Habe nun den Regler für einen Sollwert von 15.0°C aufgerufen, die
Starttemperatur war ca 21°C
Im Anhang das Ergebnis... Sieht meiner Meineung nach super aus. Aber:
Was mir aufgefallen ist, ist, dass die offset_sum für den I-Anteil immer
in Sättigung bleibt! Der Regler regelt die Temperatur auf 15,3°C ein,
der kleine Offset ergibt sich durch ungenauigkeiten bei der
Temperaturmessung... D.h. der Offset wird eigentlich nie positiv, somit
bleibt der offset_sum wert immer wuf -250. Wie ist das zu bewerten?
Eigentlich sollte der Wert ja dann um 0 pendeln und im immer kleiner
werden, oder?
Werner13 schrieb:> Was mir aufgefallen ist, ist, dass die offset_sum für den I-Anteil immer> in Sättigung bleibt!
Das war zu erwarten.
Dein System ist so träge, dass sich der Fehler hier
1
offset=nominal_value-actual_value;
von einem Reglerdurchlauf zum nächsten überhaupt nicht großartig
verändern KANN.
Wenn du also einen Fehler von sagen wir mal 1° hast, dann hat sich
offsetSum spätestens 500 Durchläufe durch die Reglerschleife später auf
250 hochgeschaukelt und bleibt auch dort. 500 Reglerdurchläufe dauern
bei dir wie lange? Wenn die 5ms noch gelten, dann sind das gerade mal
2.5 Sekunden. Und um wieviele Grad kann sich dein Kühlgut in 2.5
Sekunden abkühlen (oder erwärmen)?
Dein Peltier arbeitet jetzt volle Pulle und verringert den Fehler. Der
Fehler sei dann irgendwann bei -1°. D.h. die Summierung verringert jetzt
wieder offset_sum. Aber in welcher Zeit? Aus symetrischen Überlegungen
heraus: 2.5 Sekunden später hängt deine offset_sum bei -250. Und wieder:
in diesen 2.5 Sekunden hat sich aber die Temperatur des Kühlgutes mit
Sicherheit nicht großartig verändert.
Dein Regler pendelt also mit dem I-Anteil mehr oder weniger ständig
zwischen Minimum und Maximum, weil sich in der Zeit in der offset_sum
NICHT an einem Endanschlag hängt, die Temperatur deines Kühlgutes gar
nicht soviel verändern kann, dass die Aufsummierung mittendrinn irgendwo
stoppen würde.
> Temperaturmessung... D.h. der Offset wird eigentlich nie positiv, somit> bleibt der offset_sum wert immer wuf -250. Wie ist das zu bewerten?> Eigentlich sollte der Wert ja dann um 0 pendeln und im immer kleiner> werden, oder?
Zerleg das hier
und sieh dir die einzelnen Anteile an.
PS: Ist das ein Fehler in deinem Code?
Sieh dir in der Reglergleichung mal den I-Anteil an. Da fehlt doch ein
offset_sum.
Hallo KarlHeinz,
ja stimmt, das ist ein Fehler im Code, wollte nur das Prinzip posten,
der originalcode enthält strukturen usw, was es zur diskussion unnötig
verkompliziert... In Wirklichkeit ist das richtig implementiert!
Ok, werde die Anteile mal zerlegen...
Aber ist das prinzipiell ein Problem, wenn dieser Anteuil in Sättigung
bleibt? Ich meine, der regler funktioniert seht gut, weas würde sich
ändern, wenn dieser Anteil nicht in Sättigung bleibt? Wo liegt das
Problem wenn der Anteil in Sättigung bleibt? Gibt es hier dann ev. ein
Probelm, wenn eine Störgröße einwirkt?
Ist meine Theorie richtig, dass der Anteil im eingeschwngenen Zustand
idealerweise um null pendelt?
Werner13 schrieb:> Aber ist das prinzipiell ein Problem, wenn dieser Anteuil in Sättigung> bleibt?
Offensichtlich nicht.
Es bedeutet nur, dass du dir in diesem konkreten Fall viel zu viel
Arbeit gemacht hast.
> Ist meine Theorie richtig, dass der Anteil im eingeschwngenen Zustand> idealerweise um null pendelt?
Wobei das pendeln im Idealfall sich auf einen Wert einpendelt (wenn es
keine externe Störgröße gibt).
Aber ob du das bei diesem konkreten System jemals sehen wirst. Ich hege
da so meine Zweifel. Man kann es auch so sagen: dein Regler ist viel zu
schnell für dieses träge System. Ich würde sogar soweit gehen zu sagen,
dass man das an deinen K-Werten schon erkennen kann.
Einem Kp von -41 steht ein Ki von -0.036 gegenüber. Da ist ein Faktor
1000 Unterschied.
Was ich mal probehalber probieren würde
geh mal mit der Windup Begrenzung höher.
1
if(offset_sum<=-25000)
2
{
3
offset_sum=-25000;
4
}
5
if(offset_sum>=25000)
6
{
7
offset_sum=25000;
8
}
problem ist natürlich, dass ein Probedurchlauf bei dir recht lange
dauert.
Wenn der Regler gut arbeitet, dann pendelt sich das System so ein, dass
der P-Anteil an der kompletten Reglergleichung zu 0 wird und nur der
I-Anteil die benötigte 'Grundleistung' aufbringt um das System stabil zu
halten.
Das hat mich verblüfft, als ich das erste mal einen PI Regler
probehalber aufgebaut habe. Wenn das System weit vom Ziel entfernt ist,
dann übernimmt der P-Anteil die komplette 'Arbeit'. Irgendwann kann sich
der aber dem Ziel nicht mehr nähern und dann fand etwas zunächst
erstaunliches statt: der I-Anteil in der Reglergleichung wurde immer
größer, während der P-Anteil abnahm. Bis dann am Ziel der P-Anteil 0 war
und der I-Anteil 'die ganze Arbeit' machte.
Im Moment denke ich, dass du mit den kleinen Windup Grenzen dem I-Anteil
gar nicht die Chance gibst 'die Kontrolle' zu übernehmen. Es ist wie
beim Autofahren, wenn 2 Fahrer am Lenkrad drehen sollen: ein schneller
der allerdings ordentlich am Rad rumdreht. Und ein feinfühliger, der
viel scahter mit dem Lenkrad umgeht. Wenn du den feinfühligen allerdings
zu sehr einschränkst, indem du ihm nur winzig kleine Lenkbewegungen
erlaubst, dann wird der Grobmotoriker alles machen müssen und der andere
dreht nur Däumchen. Und ich denke, in der Situation bist du gerade.
Aber sieh dir die einzelnen Anteile der Reglergleichung an. Das müsste
man dort eigentlich erkennen können.
Bei der Berechnung des Wertes für KS muss man noch zwischen den PWM% und
dem Wert für die Ausgabe (PWM Stufen) unterscheiden. Wenn der Regler die
PWM Schritte ausgeben soll, dann müsste man das KS mehr als 20°C/75
Schritte also etwa 0,27 sein. So wie der Regler jetzt ist, gibt er den
Bruchteil der Leistung relativ zum Testfall aus. Da müsste man noch
umrechnen auf den passenden PWM-Wert - diese Umrechnung muss aber nicht
linear sein. Wenn man den Bruchteil der Leistung etwa A nennt könnte
eine passende Umrechnung etwa PWM-Wert = 75 * (1 - sqrt( 1-A) ) sein.
Entsprechend wäre die obere Grenze für A bei 1. Der Faktor vorne wäre
der Wert für den Optimalen Strom, also den wo die Tiefste Temperatur
erreicht wird, bzw. am schnellsten gekühlt wird.
Das in dem Beispiel oben immer eine Restabweichung bleibt, liegt wohl
daran, dass der Integralwert nicht so klein werden darf wie nötig. Der
richtige Wert könnte müsste irgendwo bei -600 liegen. Da müsste man also
noch die Grenzen anpassen - das ist der Nachteil dieser Antiwindup
Lösung: die ist ggf. zu scharf oder auch nicht wirklich effektiv. Damit
es mit der Lösung einigermaßen klappt hilft es wenn man zusätzlich zur
Regelung noch den ungefähren Ausgabewert zur Zieltemperatur dazu zählt,
so dass der Integralteil in erster Näherung klein und unabhänig von der
Zieltemperatur bleibt.
Der Weg über die Sättigung des Ausgangs ist da einfacher und kommt ohne
zusätzliche Parameter aus - wenn man will kann man da ggf. noch ein
kleines bisschen Optimieren, damit der Regler die Grenze der Sättigung
besser trifft - nötig ist das aber nicht. Einen kleinen Nachteil hat die
Version wenn man gleich in der Sättigung anfängt (weil schon der
Proportionalteil die Sättigung erreicht) - dann kommt der Regler etwas
zu früh etwas aus der Sättigung und ist damit ein bisschen langsamer -
das ist aber in der Regel kein wirkliches Problem, macht den Regler nur
anfangs etwas langsamer.
@ Werner13 (Gast)
>Habe nun folgenden Regler implementiert:>S32 controlled_variable = 0;>S32 Kp = -41;>double Ki = -0.036;>double Kd = 0;
Wolltest du nicht Festkommaarithmetik nutzen? OK, das ist hier nicht
wirklich kritisch, aber double ist auch Overkill. float reich
vollkommen.
>Habe nun den Regler für einen Sollwert von 15.0°C aufgerufen, die>Starttemperatur war ca 21°C>Im Anhang das Ergebnis... Sieht meiner Meineung nach super aus.
Meiner Meinung nach nicht. Du hast noch ein ganz schönes Schwingen
drauf, was gerade bei den hohen Zeitkonstanten recht hervig ist. Deine
Reglerparameter sind noch nicht optimal.
>Was mir aufgefallen ist, ist, dass die offset_sum für den I-Anteil immer>in Sättigung bleibt!
Was ein klares Zeichen für einen Fehler ist.
> Der Regler regelt die Temperatur auf 15,3°C ein,>der kleine Offset ergibt sich durch ungenauigkeiten bei der>Temperaturmessung...
FALSCH! Ein digitaler Regler macht aus Sicht von "innen" KEINERLEI
Fehler, schon gar nicht als PI Regler. D.h. der digitale IST-Wert ist
IDENTISCH zum digitalen Sollwert, wenn der Regler eingeschwungen ist.
Wenn nicht, ist was faul. Natürlich ist die IST-Wert erfassung sprich
Temperaturmessung nie perfekt, aber das spielt für dieses Problem keine
Rolle. Der Regler wird solange arbeiten, bis SOLL==IST ist.
> D.h. der Offset wird eigentlich nie positiv, somit>bleibt der offset_sum wert immer wuf -250. Wie ist das zu bewerten?
Du hast noch einen Bug.
>Eigentlich sollte der Wert ja dann um 0 pendeln und im immer kleiner>werden, oder?
offset sollte um 0 pendeln und der I-Anteil dann konstant bleiben aber
nicht in Sättigung. Vielleicht ist deine Sättigungsgrenze zu klein?
http://de.wikipedia.org/wiki/Direct_Digital_Control_%28Regelungstechnisches_Verfahren%29
[c]
controlled_variable = Kp * offset + Ki Ta + Kd * (offset
-old_offset) / Ta;
[c]
Wo ist denn hier bitte offset_sum geblieben?
Gewöhn dir an VOLLSTÄNDIGEN Code, am besten als Anhang zu posten, nicht
zusammenkopierte Schnipsel.
Ach ja, zu Sättigungsgrenze. Im eingeschwungenen Fall ist offset=0 und
somit der P und D Anteil nicht wirksam. Es bleibt nur noch der I-Anteil.
Damit das aber funktioniert, muss der I-Anteil den Regler über den
vollen Aussteuerbereich allein treiben können. D.h.
I-Anteil (max) * Ki >= Ausgangsvariable (max)
Dito für das Minimum, fallst de Regler ein bipolares Ausgangssignal
erzeugt.
Karl Heinz schrieb:> Einem Kp von -41 steht ein Ki von -0.036 gegenüber. Da ist ein Faktor> 1000 Unterschied.
Meinst du dass dieser Unterscheid zu hoch ist?
OK, ihr meint, dass die Windup Grenze zu eng gesetzt ist... Ich denke
auch, dass dies der Hauptgrund ist...
Ulrich schrieb:> Der> richtige Wert könnte müsste irgendwo bei -600 liegen. Da müsste man also> noch die Grenzen anpassen
Welchen Wert meinst du hier genau?
Falk Brunner schrieb:>> Der Regler regelt die Temperatur auf 15,3°C ein,>>der kleine Offset ergibt sich durch ungenauigkeiten bei der>>Temperaturmessung...>> FALSCH!
Wenn ich einen Sollwert von 15,0° einstelle, der ungenaue Sensor aber
bei 15,3° auf Grund von Ungenauigkeiten 15° misst, dann sind das
Ungenauigkeiten des NTC. Somit regelt der Regler intern zwar auf 15°,
die wirkliche Temperatur ist aber 15,3°... Das meinte ich damit...
Falk Brunner schrieb:> offset sollte um 0 pendeln und der I-Anteil dann konstant bleiben aber> nicht in Sättigung. Vielleicht ist deine Sättigungsgrenze zu klein?
Meinst du hier mit Sättigung die Sättigung des Offset_sum (durch die
Windup-Grenze) oder die Sättigung des Ausgangssignales?
Falk Brunner schrieb:> I-Anteil (max) * Ki >= Ausgangsvariable (max)
Das bedeutet, ich sollte die Windup-Grenze mindestens auf den Wert
einstellen, richtig? Die Ausgangsvariable wird zwischen 0 und 70
begrenzt (duty cycle, siehe code). Ki ist -0,036. Wie sollten nun die
Windupgrenzen eingestellt werden? zwischen 1944 (theoretisch berechnet,
kann auch größer sein) und -1944 oder zwischen 1944 und null??
Ja falk, hab da im code den Offset_sum beim I-Anteil vergessen, ist in
Wirklichkeit aber dabei...
LG
@ Werner13 (Gast)
>> Einem Kp von -41 steht ein Ki von -0.036 gegenüber. Da ist ein Faktor>> 1000 Unterschied.>Meinst du dass dieser Unterscheid zu hoch ist?
Ja.
>Wenn ich einen Sollwert von 15,0° einstelle, der ungenaue Sensor aber>bei 15,3° auf Grund von Ungenauigkeiten 15° misst, dann sind das>Ungenauigkeiten des NTC. Somit regelt der Regler intern zwar auf 15°,>die wirkliche Temperatur ist aber 15,3°... Das meinte ich damit...
Eben, das ist aber was anderes. Sinnvollerweise zeigt man aber den
intern gemessenen Wert im Diagramm an, um zu sehen was dort los ist.
>> offset sollte um 0 pendeln und der I-Anteil dann konstant bleiben aber>> nicht in Sättigung. Vielleicht ist deine Sättigungsgrenze zu klein?>Meinst du hier mit Sättigung die Sättigung des Offset_sum (durch die>Windup-Grenze)
Ja.
> oder die Sättigung des Ausgangssignales?
Kann auch sein. Glaub ich aber eher nicht.
>> I-Anteil (max) * Ki >= Ausgangsvariable (max)>Das bedeutet, ich sollte die Windup-Grenze mindestens auf den Wert>einstellen, richtig?
Ja.
>Die Ausgangsvariable wird zwischen 0 und 70>begrenzt (duty cycle, siehe code). Ki ist -0,036. Wie sollten nun die>Windupgrenzen eingestellt werden? zwischen 1944 (theoretisch berechnet,>kann auch größer sein) und -1944 oder zwischen 1944 und null??
Du hast nur unipolare Signale, also 1944 und null.
>Ja falk, hab da im code den Offset_sum beim I-Anteil vergessen, ist in>Wirklichkeit aber dabei...
Du schreibst jetzt EINHUNDERT Mal.
"Ich werde IMMER Originalcode posten und NIE Fragmente abschreiben!"
Siehe Netiquette.
Mit den -600 meinte ich den Wert der sich für offset_sum in etwa
einstellen sollte, wenn man es lässt. Die Sättigungsgrenzen für das
Anti-Windup sollten entsprechend angepasst werden.
Da die Ausgabe keine negativen Werte Erlaubt, werden auch keine
negativen Werte für das Integral benötigt, zumindest nicht stark
negativ. Eine Sinnvolle Begrenzung wäre etwa 0 bis +1900. Für einen
ersten Test darf man die Grenzen auch etwas weiter fassen und kann dann
die dann Später anpassen - ggf. auch etwas enger und temperaturabhängig.
Alternativ halt den einfacheren und oft besseren Weg über die Sättigung
des Stellgliedes, so wie es oben schon mal war.
Der erste Test für den Regler zeigt noch etwas Überschwingen. Das kann
z.B. von der nichtlinearen Kurve kommen. Der Ks Wert wird dadurch vom
PWM Wert abhängig - bei geringer Leistung ist das Peltierelement
effektiver und entsprechend der Ks-Wert etwas größer (bis etwa Faktor
2).
Ulrich schrieb:> Der Ks Wert wird dadurch vom> PWM Wert abhängig - bei geringer Leistung ist das Peltierelement> effektiver und entsprechend der Ks-Wert etwas größer (bis etwa Faktor> 2).
Ich verstehe noch nicht, wie ich das genau umsetzen / verhinder soll?!
OK, werde die neuen Windup-Grenzen mal testen...
Der Wirkungsgrad des Peltierelements hängt vom Strom ab - je größer der
Strom desto geringer wird er Wirkungsgrad. Beim großen Strom für die
Sprungantwort ist der Wirkungsgrad nur etwa halb so groß wie bei recht
kleinen Strömen. Für die Regelung wird es sogar noch schlimmer, da wird
der differentielle Wirkungsgrad (also um wieviel stärker die Kühlwirkung
wird, wenn man den Strom erhöht) interessant, und der ändert sich noch
stärker (geht gegen 0 wenn der optimale Strom erreicht wird). Das ist
einfach der nichtlineare Zusammenhang zwischen Strom und Kühlwirkung.
Lösen kann man das, indem man den Regler die Leistung berechnen lässt,
und dann den PWM-Wert dazu berechnet. Für kleine Ströme könnte man eine
lineare Näherung nutzen - das wäre dann ein Ks Wert der knapp 2 mal so
groß wäre wie aus der Kurve oben berechnet (einfach weil ein kleiner
Strom einen knapp 2 mal besseren Wirkungsgrad bedeutet). Ein etwas zu
großer Ks Wert und damit zu kleine Kp,Ki sind für einen Regler auch eher
unproblematisch (langsamere Reaktion) als andersherum
(Schwinungsneigung). Etwas Reserve ist in den Formeln für die
Regelparameter drin, aber ein Faktor 2 ist dann ggf. doch etwas viel.
Besser kann man es machen wenn man mehr als die lineare Näherung nutzt.
Wie die Kühlleistung vom Strom abhängt kennt man zumindest im Prinzip:
es gibt irgendwo einen optimalen Strom, wo die Kühlung maximal wird. Wo
dieser optimale Strom im Idealfall (gute Kühlung) liegt steht ggf. im
Datenblatt - mit nicht perfekter Kühlung liegt er etwas niedriger. Den
Strom für die maximale Kühlwirkung sollte man ohnehin kennen für die
Begrenzung des Stromes. Zumindest sollte der maximale Strom nicht höher
liegen.
Neben dem Maximum weiß man auch noch, dass bei 0 Strom keine Kühlwirkung
da ist. Mit den beiden Punkten (0,0) und dem Maximalwert (etwa der
maximale Strom als Näherung) ist die Kurve (Parabel) bereits festgelegt.
Der Zusammenhang ist P = P_max*(1-(x-1)^2) , wobei x der Strom geteilt
durch den optimalen Strom ist. Umgekehrt kriegt man damit x = 1 -
sqrt(1-P/P-max) also Formel für die Umrechnung Leistung nach PWM- Wert.
Eine gewisse Unsicherheit bleibt noch beim Schätzwert für den optimalen
Strom: für die Grenze beim Strom geht man hier besser von einem etwas
kleineren Wert aus - für die Umrechnung Leistung -> PWM besser von einem
größeren.
Habe nun die Windup Grenzen auf -2000 bis +2000 erhöht, den Rest
gleichgelassen. Habe deswegen bipolar gewählt, weil sich die Temperatur
ja theoretisch auch von der anderen Seite nähern könnte...
Ergebnis im Anhang...
Da ist mehr schwingen drauf als vorher, aber der offset_sum ist nicht
mehr dauernd über den grenzen, sondern liegt zum schluss so zwischen
-600 und -800... Ist das nun eine verbesserung oder nicht?
Was soll ich als nächstes ändern, damit ichd as Schwingen loswerde? Eine
Erhöhung des P-Anteils würde die Distanz zwischen Kp und Ki noch weiter
erhöhen...
Danke!
@ Werner13 (Gast)
>mehr dauernd über den grenzen, sondern liegt zum schluss so zwischen>-600 und -800... Ist das nun eine verbesserung oder nicht?
Eine Verbesserung. Wie sieht dein offset aus? Der muss um 0 herum
pendeln.
>Was soll ich als nächstes ändern, damit ichd as Schwingen loswerde?
Reglerparameter optimieren.
> Eine>Erhöhung des P-Anteils würde die Distanz zwischen Kp und Ki noch weiter>erhöhen...
Das ist erstmal egal. Im I-Anteil steckt auch das Verhältnis
Abtastfrequenz zu Reglerzeitkonstante. Und da deine Abtastfrequenz im
Verhältnis zum Zeitkonstante des Systems sehr groß ist, muss der
I-Anteil sehr klein sein. Passt schon.
Der Überschwinger ist schon deutlich. Da wäre eine bessere Anpassung der
Regelparameter angesagt. In der Einfachen Form wohl einfach Ki und Kp um
den gleichen Faktor kleiner zu machen, denn die berechnete Wert sollten
etwas zu groß sein - so wie ich es schon oben erklärt hatte. So schlimm
ist das Nachschwingen nicht, da könnte auch schon ein Faktor von 1,2-1,5
ausreichen statt der knapp 2 auf Grund der Kennlinie.
Alternativ könnte man auch die Linearisierung der Kennlinie des
Peltierelements machen: also Ki und Kp auf die Leistung anpassen (Faktor
75 kleiner) und dann per 80*(1-sqrt(p)) auf den PWM Wert kommen. Für
kleine PWM Werte ist das etwa der Faktor 2 für Ki und Kp. Die
Linearisierung sollte etwas besser sein, bei deutlich tiefere
Solltemperaturen und damit großen PWM werten. Wenn es sehr dicht an die
minimale Temperatur geht müsste man wohl noch mal den Optimalen Strom
(hier PWM Wert 80 angenommen) überprüfen.
Gegen den ersten Überschwinger könnte ggf. die Antiwindup Lösung über
die Sättigung des Stellgliedes besser sein, muss aber nicht.
Alternativ könnt man auch die Grenzen enger legen, indem man ausnutzt
das man weiß, das für diese Temperatur der Integralwert sich irgendwo
bei -600 bis -800 einpendelt. Da könnte man also die Werte auf z.B. -400
bis -1000 einschränken. Aber aufpassen - mit geänderten Regelparametern
und anderer Solltemperatur ändert sich auch das Intervall.
Schließlich gäbe es noch die Möglichkeit einen PID Regler statt PI zu
wählen - der kann besser werden.
Werner13 schrieb:> Ja, der offset pendelt um 0...>> Werde mal versuchen, den Kp zu erhöhen...
Ich weiß., das klingt jetzt doof. Aber
Was meinst du mit erhöhen? Dein Kp ist ja negativ.
Ist erhöhen ein Ändern von -41 auf -35
Oder ist erhöhen ein Ändern von zb -41 auf -56
Ehe du an den Werten rumschraubst, würde ich mal den I-Anteil auf 0
stellen und mir ansehen, was der P-Regler alleine macht. Die 'praktische
Einstellmethode' geht ja so vor, dass der P-Anteil so lange größer
gemacht wird (der Absultwert von Kp), bis die ersten Schwingungen
einsetzen. Von dort dann den Absolut-Wert etwas verringern und erst dann
den I-Anteil mit dazu nehmen.
D.h im Umkehrschluss: würdst du Ki mal auf 0 setzen und einen
Testdurchgang fahren, dann könnte man beurteilen ob dein Kp
betragsmässig schon zu groß ist - wovon ich genauso wie Ulrich
eigentlich ausgehe.
Wichtig: ein P-Regler alleine kann nicht die Solltemperatur erreichen.
D.h. es spielt in dieser Unterschung keine Rolle, auf welchen Wert sich
der Regler einpendelt. Es spielt nur eine Rolle WIE er das tut. Mit
heftigem Schwingen oder ohne.
Hallo!
Ja, hab meine ursprünglichen Plan nun geändert und teste jetz nur mit
dem P-Regler... Mit größer machen meine ich betragsmäßig...
Ich habe den Kp wert nun auf -150 eingestellt und den Ki auf null...
zeig euch dann das ergebnis!
Werner13 schrieb:> Ich habe den Kp wert nun auf -150 eingestellt und den Ki auf null...> zeig euch dann das ergebnis!
Bin schon neugierig.
Vor allem, was die -150 angeht.
Ich hätte jetzt eigentlich erwartet, dass die |-41| schon zu hoch sind
und ein Wert von -38 oder -35 angebracht wäre. Aber, man kann sich
täuschen. Die Praxis zeigt einem dann schon, ob man recht hat oder
nicht.
@ Karl Heinz (kbuchegg) (Moderator)
>Ich weiß., das klingt jetzt doof. Aber>Was meinst du mit erhöhen? Dein Kp ist ja negativ.>Ist erhöhen ein Ändern von -41 auf -35>Oder ist erhöhen ein Ändern von zb -41 auf -56
Schon mal ein Grund, das Vorzeich dort rauszuschmeißen und an eine
andere Stelle der Formeln zu packen. Die Koeffizienten sind eigentlich
immer positiv. Ich würde das negative Vorzeichen in die PWM-Kennlinie
packen.
Hallo!
Bei der Messung nur mit dem Kp Anteil hat das System (ganz leicht) zu
schwingen begonnen bei Kp = -200. Nun hab ich einen Ki von -0.03
dazugegeben und folgendes Ergebnis errreicht (sieh Anhang).. Die
Interferenz zum Schluss war eine Störgröße (Deckel des Behälters wurde
geöffnet)... Abegsehen davon sehe ich ein deutliches Überschwingen und
danach ein leichtes Steigen der Temperatur... Das ist kein gutes
Ergebnis... Was ich noch bem,ekrt hatte, dass der DutyCycle am Anfang in
der oberen Sättigung war (maximaler Wert, ist auch OK, er muss ja so
schnell wie möglich kühlen) und dann bei ersten Unterschwinger war der
DutyCycle in unterer Sättigung (also 0, die Kühlung wurde
abgeschalten)...
Was meint ihr dazu?
@ Werner13 (Gast)
>Bei der Messung nur mit dem Kp Anteil hat das System (ganz leicht) zu>schwingen begonnen bei Kp = -200. Nun hab ich einen Ki von -0.03>dazugegeben und folgendes Ergebnis errreicht (sieh Anhang).. Die>Interferenz zum Schluss war eine Störgröße (Deckel des Behälters wurde>geöffnet)...
Womit die Messung sinnlos wurde.
>Abegsehen davon sehe ich ein deutliches Überschwingen und>danach ein leichtes Steigen der Temperatur... Das ist kein gutes>Ergebnis...
Du hast es erfasst.
>Was meint ihr dazu?
Da ist noch Luft für Verbesserungen. Man sollte vielleicht erstmal noch
einen Test machen. Peltier auf maximale Kühlung für 1-2h, damit sieht
man welche Reaktionzeiten man beim Kühlen hat. Dann Peltier aus für 2h,
dann sieht man, wie das System sich wieder erwärmt. Denn soooo einfach
ist dein Regelkreis nicht, weil die Erwärmung rein passiv über die
Umgebung erfolgt, aktiv per Peltier machst du das ja nicht. Damit hat
man ggf. verschiedene Zeitkonstanten, die man berücksichtigen muss. Der
klassische Regelkreis aus dem Lehrbuch kennt so ein Problem nicht.
Hallo, anbei der test...
Kühlung_ein: System wurde mit voller Leistung gekühlt
Kühlung_aus: Kühlung abgeschalten.
Anbei auch noch ein test, der gerade durchgeführt wurde: Ich habe die
WindupGrenzen wieder auf 1000 und -1000 gesetzt, zum schluss war die
Regelabweichung konstant auf -0.03, die offset summe war jedoch wieder
über der Grenze (konstant -1000).
Was sagt ihr dazu?
Es ist ja halbwegs symetrisch, kühlen von 25 auf 5C dauert ~2h, Erwärmen
auch. Glück gehabt. Damit sollten mit den klassischen Methoden eine gute
Regelung hinkriegen.
OK, und was würdest du als weitere vorgehensweise vorschlagen?
Ich würde nun die Windup-Grenze wieder auf +/- 1500 erhöhen, weil
offset_sum ja zum Schluss konstant auf -1000 war... Aber dies wird
vermutlich die Schwingung wieder erhöhen...
@ Werner13 (Gast)
>Tempregelung2.png>Anbei auch noch ein test, der gerade durchgeführt wurde:
Also das sieht schon recht gut aus. Leichtes Überschwingen und dann
relativ schnell eingeschwungen.
> Ich habe die>WindupGrenzen wieder auf 1000 und -1000 gesetzt, zum schluss war die>Regelabweichung konstant auf -0.03, die offset summe war jedoch wieder>über der Grenze (konstant -1000).
Wie soll das gehen, wenn sie begrenzt wird?
Falk Brunner schrieb:>> Ich habe die>>WindupGrenzen wieder auf 1000 und -1000 gesetzt, zum schluss war die>>Regelabweichung konstant auf -0.03, die offset summe war jedoch wieder>>über der Grenze (konstant -1000).>> Wie soll das gehen, wenn sie begrenzt wird?
Ich meinte damit, dass die Grenze erreicht ist (-1000). Das ist doch
nicht gut, wenn im eingeschwungenen Zustand die offset summe nicht mehr
aus der Begrenzung kommt, oder?
@ Werner13 (Gast)
>Ich meinte damit, dass die Grenze erreicht ist (-1000).
Aha, dann sollte man es auch so formulieren ;-)
>Das ist doch>nicht gut, wenn im eingeschwungenen Zustand die offset summe nicht mehr>aus der Begrenzung kommt, oder?
Nein, das ist nicht gut, aber es zeigt eine Richtung. Wenn der I-Anteil
in der Begrenzung festhängt und der Regler dadurch scheinbar besser
regelt, ist der I-Anteil zu groß. Halbiere mal Ki und schau was
passiert, allerdings mit größeren Grenzen. Das Dumme ist hier nur, dass
du für die Messung immer 2h warten musst :-(
Habe jetz bevor du geantwortet hast dei Windup wieder auf +/- 1500
gesetzt, ohne Ki zu ändern... Nun hab ich wieder ein relativ großes
Schwingen drauf, das konstant bleibt (+/- 1°C).... Hab leider kein
aktuelles Bild dazu...
So sinnlos ist die Messkurve mit der Störung nicht - nur das die Kurve
relativ kurz danach aufhört. Dort hat man das Verhalten nach einer eher
kleinen Störung (ohne Sättigung) - dass wofür der klassische Regler und
die Einstellregeln für die Regelparameter ausgelegt sind.
Das der Regler nach dem voll Kühlen dann noch einmal bis auf 0 zurück
geht ist im Prinzip noch nicht falsch (ein optimaler Regler würde das
vermutlich auch tun), aber doch eher ein Zeichen dafür das der Regler
nicht gut aus der Sättigung herauskommt.
Die Größe des ersten Überschwingers ist ein Kombination aus einer
Anregung bzw. Störung durch den Sättigungszustand und der Fähigkeit des
Reglers sich von der Störung zu erholen. Die Fähigkeiten des Reglers
sieht man daran wie es danach von unten in Richtung Sollwert geht, und
das ist bei einigender Kurven oben gar nicht so schlecht.
Der eine Überschwinger ist bei einem PI Regler nicht zu vermeiden anders
kommt der Integral-anteil nach der Sättigung nicht wieder zurück auf den
richtigen Wert. Die Größe des Überschwingers kann man aber über die eine
bessere Anti Windup Strategie reduzieren, etwa das integrieren
auszusetzen wenn die Sättigung erreicht ist, oder sehr viel enger
gesetzte (und dafür an die Solltemperatur angepasste) Grenzen.
Für einen schnellere Regler, der sich besser von der Störung erholt
müsste man sonst ggf. auf einen PID Regler gehen - da geht es auch ohne
den ersten Unteschwinger.
Ich habe vergessen dazuzusagen, dass ich nun die Sensoren nicht in der
Luft hängen hab, sondern am Metallkörper befestigt hab. Dadurch ist das
System vermutlich um eineiges schneller geworden und daher auch das
schwingen... ich werde keine neue Sprungantwort aufnehmen, sondern den
Ki auf null lassen und Kp so lange erhöhen, bis das system schwingt...
Danach einen kleinen I-Anteil dazu...
Hallo,
Nachdem ich nun den Temperatursensor direkt am Metall angebracht habe,
habe ich auch eine neue regelstrecke...
Hab nun einen test nur mit aktivem P-Anteil (Kp = -50) gemacht, anbei
das Ergebnis... Zeigt ein eindeutiges Schwingen... Also der nächste
Schritt wäre, Kp verringern und nochmal testen, richtig?
Ich habe die Regelung auf 15°C eingestellt, damit ich nicht immer so
lange warten muss... Im richtigen System wird dann aber auf ca 7°C
geregelt, ist das ein Problem? Kann das verglichen werden oder muss ich
auch bei den tests immer auf 6°C regeln?
> Ich habe die Regelung auf 15°C eingestellt, damit ich nicht immer so> lange warten muss... Im richtigen System wird dann aber auf ca 7°C> geregelt, ist das ein Problem? Kann das verglichen werden oder muss ich> auch bei den tests immer auf 6°C regeln?
Wie siehts damit aus, ist das ein Problem? Ich denke, solange der Regler
am Anfang des Tests in Sättigung ist, sollte das kein Problem sein, wie
weit er runter regelt richtig? Oder wird sichd ann bei den Parametern
wieder was ändern, wenn ich danach bis 6°C runter regle?
Hier das Ergbenis mit einem Kp von -30... Die schwingung ist deutlich
geringer! soll ich nun mit Kp noch weiter runter gehn oder kann ich nun
schon einen kleinen Ki Anteil dazugeben?
LG
Hallo,
habe den Kp nochmal auf -25 verringert... hier das ergebnis, ichd enke
ich werde den Kp nun so lassen...
Nun soll ein I-Anteil dazu... Wie soll ich hier vorgehen? Ich welcher
Größenordnung soll der für erste Tests liegen? Wie kann ich dann
erkennen, ob der Ki Wert zu groß bzw zu niedrig gewählt wurde?
Danke!
Hallo,
habe nun einen I-Anteil dazugetan:
Kp wie vorher -25
Ki -0,05
Windup-Grenzen für Ki: -1500 und 1500
Das Ergenis im Anhang, zum schluss war die Regelabweichung konstant bei
0,003 und die Summenabweicheung für den I-Anteil (offset_sum), bei der
die Begrenzung -1500 bis 1500 eingestellt ist, lag bei -466 (auch
ziemlich konstant). Das sieht meiner Meinung nach super aus, oder? Den
kleinen Unterschwinger am Anfang benötige ich ja, sonst komme ich nie
aus der Windup-Grenze zurück. Also bei einem I-Anteil und Windup Grenze
geht das gar nicht anders, richtig?
Danke!
@ Werner13 (Gast)
>Das Ergenis im Anhang, zum schluss war die Regelabweichung konstant bei>0,003
Sollte nicht so sein, kann aber ein Artefakt deiner Fließkommazahlen
sein.
> und die Summenabweicheung für den I-Anteil (offset_sum), bei der>die Begrenzung -1500 bis 1500 eingestellt ist, lag bei -466 (auch>ziemlich konstant). Das sieht meiner Meinung nach super aus, oder?
Sieht gut aus.
>aus der Windup-Grenze zurück. Also bei einem I-Anteil und Windup Grenze>geht das gar nicht anders, richtig?
Keine Ahnung, kann sein. Aber denk dran, du regelst jetzt die Temperatur
an deinem Gehäuse, nicht in der Luft. Ob das gut oder schlecht ist,
musst du wissen.
Sofern der Sollwert bei etwa 16 C liegt, sieht die Kurve schon brauchbar
aus - sonst ist da wohl noch was am Programm (nicht nur die Parameter)
falsch. Viel besser geht ggf. mit einem PI Regler nicht - zumindest
nicht für den reinen Regler. Bei der Anti-windup Lösung könnte man es
noch besser machen und damit den 1. Unterschwinger kleiner bekommen. Mit
der Gewählten Form über die Begrenzung des Integralteils und einen PI
Regler geht es nicht ohne den Unterschwinger - je enger man die Grenze
wählt, desto kleiner wird der Unterschwinger. Da der Wert, der sich
schließlich einstellt von der Temperatur (und den Umgebungsbedingungen)
abhängt, ist das mit der passenden Grenze nicht so ganz einfach. Die
meist bessere (und auch einfacher, weil man die Grenzen nicht schätzen
muss) Lösung ist Antiwindup über die Begrenzung des Stellgliedes: da
kommt man aus der Übersteuerung eher mit einem zu kleinen Integralwert
und nähert sich von oben an. Im Idealfall braucht man aber auch da einen
Schätzwert für den PWM Wert als Funktion der Solltemperatur.
Ein Problem was man aber noch hat, ist dass das Peltierelement
nichtlinear ist. Damit sind die optimalen Regelparameter von der
Temperatur abhängig. Sofern der PWM Wert linear in einen Strom übersetzt
wird, wird zu höheren Strömen bzw. tieferen Temperaturen das Stellglied
weniger wirksam. Damit wird der Regler langsamer (geringere
Schleifenverstärkung), aber immerhin nicht instabil. Schlimm wird es vor
allem wenn man sich der minimal erreichbaren Temperatur annähert.
Bei höheren Temperaturen könnte der Regler noch etwas schneller werden -
aber wohl auch nicht so viel das er instabil wird.
Da der prinzipielle Zusammenhang Strom - Kühlwirkung bekannt ist
(Parabel), ist der Aufwand für die Linearisierung auch relativ gering -
eine nur näherungsweise (weil der optimale Strom nicht genau bekannt
ist) Linearisierung ist immer noch besser als keine. Für die 15 Grad
bringt das noch nicht viel, aber bei den 5 Grad als Zieltemperatur kann
das schon etwa einen Faktor 2 (den hätte man etwa bei der Hälfte des
optimalen Stromes) in den Regelparametern ausmachen.
Hallo!
Der Sollwert liegt nicht bei 16° sondern bei 15... das Problem ist die
Ungenauigkeit des verwendeten NTC +m Ungenauigkeiten beim ADC.
Systemintern liegt die Temperatur also bei 15°C in Wirklichkeit liegt
sie aber bei ca 16... Aber das soll soweit nicht stören, es kann später
ein genauerer NTC eingesetzt werden...
Lurchi schrieb:> Ein Problem was man aber noch hat, ist dass das Peltierelement> nichtlinear ist. Damit sind die optimalen Regelparameter von der> Temperatur abhängig. Sofern der PWM Wert linear in einen Strom übersetzt> wird, wird zu höheren Strömen bzw. tieferen Temperaturen das Stellglied> weniger wirksam. Damit wird der Regler langsamer (geringere> Schleifenverstärkung), aber immerhin nicht instabil. Schlimm wird es vor> allem wenn man sich der minimal erreichbaren Temperatur annähert.> Bei höheren Temperaturen könnte der Regler noch etwas schneller werden -> aber wohl auch nicht so viel das er instabil wird.>> Da der prinzipielle Zusammenhang Strom - Kühlwirkung bekannt ist> (Parabel), ist der Aufwand für die Linearisierung auch relativ gering -> eine nur näherungsweise (weil der optimale Strom nicht genau bekannt> ist) Linearisierung ist immer noch besser als keine. Für die 15 Grad> bringt das noch nicht viel, aber bei den 5 Grad als Zieltemperatur kann> das schon etwa einen Faktor 2 (den hätte man etwa bei der Hälfte des> optimalen Stromes) in den Regelparametern ausmachen.
Ich verstehe das noch immer nicht ganz, Ulrich hat es auch schon
angesprochen... Wie soll ich diese Linearisierung machen bzw. woher
bekomme ich die Parabel?
Die Parabel bekommt man aus dem einfachen üblichen Model eines
Peltier-elements. Es gibt halt einen Strom bei dem das Peltier-element
am meisten kühlt (und erreicht bei dem Strom auch die Tiefste
Temperatur). Wo dieser Optimale Strom liegt, steht üblicherweise im
Datenblatt. In der Regel ist der Strom etwa beim maximalen erlaubten
Strom oder etwas darunter. Was in der Regel nicht dabei steht, ist dass
der optimal Strom etwas kleiner wird, wenn die Kühlung der warmen Seite
nicht perfekt ist. Wenn man es also genau haben will, müsste man den
optimalen Strom experimentell bestimmen - das müsste man auch schon
damit man die Grenze für den PWM-wert optimal wählen kann. Für den
Anfang kann man aber auch einfach den Wert aus dem Datenblatt übernehmen
- das ist etwas ein obere Grenze und die Kurve Leistung -> PWM Wert wird
damit etwas flacher. Das ist nicht perfekt, aber unkritisch. Ein zu
klein geschätzter Optimale Strom wäre schlechter.
Neben dem Maximum gibt es noch einen 2. ausgezeichenten Punkt: nämlich
Srom 0 gibt Leistung 0. Mit dem geschätzten optimalen Strom ist damit
die Parabel bereits festgelegt, bis auf die Skalierung der Leistung, die
kriegt man aus der Messung der Antwortfunktion. Wie man die Leistung
dann in den PWM-Wert umrechnet steht schon einmal oben: Wenn man den
Bruchteil der Leistung etwa A nennt wäre die Umrechnung dann PWM-Wert =
PWM(I_optimal) * (1 - sqrt( 1-A)). Den Wert für A bestimmt der Regler -
A geht im Prinzip von 0 bis 1 , wobei ggf. eine künstliche Grenze bei
etwa A=0,9-0,95 dazu kommt, damit der Strom nicht zu hoch wird (weil
PWM(I_optimal) eher etwas zu groß geschätzt wird).
Den Optimalen Strom könnte man etwa bestimmen indem man ein Programm mit
festen PWM-Werten druchläuft. Etwa in Schritten von 5-10% den Strom
ansteigen lassen und jeweils etwa 5-20 min pro Wert warten, so dass man
die Größe des Temperatursprungs (oder die Änderung in der Steigung -
geht vermutlich schneller) abschätzen kann. Dann die Größe des Sprungs
(Knicks) gegen den PWM Wert auftragen - das sollte in etwa eine Gerade
geben die beim optimalen Strom die 0-Line schneidet.
Hallo Zusammen,
ich will auch für meinen DC-DC Wandler einen PI Regler implementieren.
Wie bei der Temperatur regelung, habe ich keinen Schaltplan der
Regelstrecke.
Durch ansteuern der dutycycle wird regelgröße (d.h. die
Ausgangsspannung) auf einen bestimmten Wert geregelt.
Alles funktioniert ziemlich gut ohne PI-Regler. Aber mit PI-Regler
werden die Ergebnissen viel genauer.
Ich bedanke mich für jede Hilfe.
Viele Grüße
Margo