Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Reglerdimensionierung Temperaturregler


von Werner13 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Werner13 schrieb:

> Welchen Reglertyp würdet ihr hier prinzipiell auswählen?

Ich persönlich?

Bei +-1° erlaubter Abweichung: 2 Punkt Regler
1
  wenn zu warm
2
    Peltier ein
3
  else
4
    Peltier aus

von Ulrich (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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.

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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!

von Ulrich (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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/Regler

http://de.wikipedia.org/wiki/Faustformelverfahren_%28Automatisierungstechnik%29

von Werner13 (Gast)


Lesenswert?

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

von Sebastian S. (sebastian_s50)


Lesenswert?

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

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

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 :)

von Ulrich (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

Koennen wir mal ein Foto vom aufbau haben?

von Werner13 (Gast)


Lesenswert?

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
 typedef struct
2
{
3
  U16 Ta;    // sampling time in s
4
  U16 Kp;           // P part
5
  float Ki;    // I part
6
  U16 Kd;           // D part
7
  float offset;  // control deviation
8
  float offset_sum;  // sum of offsets
9
  float old_offset;  // offset of the last sampling
10
  U8 duty_cycle;  // controlled variable
11
  U8 trigger_threshold; // within this value around the nominal value nothing happens
12
}st_PID_settings;
13
14
st_PID_settings ControlTec0 = {
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
U8 PID_control(float actual_value, float nominal_value, st_PID_settings* PID)          // actual value: Istwert; nominal_value: Sollwert
2
{
3
  PID -> offset = nominal_value - actual_value;                        // calculate control error
4
  
5
  if ((PID->offset > PID->trigger_threshold) || (PID->offset < (PID->trigger_threshold * (-1))))  // trigger threshold exceeded?
6
  {
7
    
8
    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
  return PID->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?

von Werner13 (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von oszi40 (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Werner13 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Werner13 (Gast)


Lesenswert?

Hallo Karl Heinz!
Danke für die Hilfe!
1
if( Summe < SummenMaximum && Summe > SummenMinimum )
2
    Summe += Fehler

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!

von Karl H. (kbuchegg)


Lesenswert?

Werner13 schrieb:
> Hallo Karl Heinz!
> Danke für die Hilfe!
>
1
> if( Summe < SummenMaximum && Summe > SummenMinimum )
2
>     Summe += Fehler
3
>
>
> 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 :-)
1
  NeueSumme = Summe + Fehler;
2
  if( NeueSumme < SummenMaximum && NeueSumme > SummenMinimum )
3
     Summe = NeueSumme;

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)

: Bearbeitet durch User
von Ulrich (Gast)


Lesenswert?

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.

von eProfi (Gast)


Lesenswert?

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"

von eProfi (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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.

von Werner13 (Gast)


Lesenswert?

@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!

von Werner13 (Gast)


Lesenswert?

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

von Werner13 (Gast)


Lesenswert?

Hallo!

Habe nun folgenden Regler implementiert:
1
S32 controlled_variable = 0;
2
S32 Kp = -41;
3
double Ki = -0.036;
4
double Kd = 0;
5
double offset = 0;
6
double offset_sum = 0;
7
double old_offset = 0;
8
  
9
10
Regler:
11
offset = nominal_value - actual_value;        
12
offset_sum += offset;  
13
if(offset_sum <=-250)
14
{
15
      offset_sum = -250;
16
}
17
if(offset_sum >=250)
18
{
19
  offset_sum = 250;
20
}
21
    
22
    
23
controlled_variable = Kp * offset + Ki * Ta *  + Kd * (offset -old_offset) / Ta;      
24
old_offset = offset;    
25
    
26
if(controlled_variable > 70)
27
{
28
  duty_cycle = 70;
29
}
30
if(controlled_variable <= 0)
31
{
32
  duty_cycle = 0;
33
}
34
if((controlled_variable < 70) && (controlled_variable > 0))
35
{
36
         duty_cycle = (U8)controlled_variable;
37
}

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?

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

Anhang vergessen...

von Karl H. (kbuchegg)


Lesenswert?

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
1
controlled_variable = Kp * offset + Ki * Ta *  + Kd * (offset -old_offset) / Ta;

mal in die Einzelteile
1
  pPart = Kp * offset;
2
  iPart = Ki * Ta * offset_sum;
3
  dPart = Kd * (offset -old_offset) / Ta;
4
5
  controlled_variable = pPart + iPart + dPart;

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.

: Bearbeitet durch User
von Werner13 (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Ulrich (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von Werner13 (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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

von Werner13 (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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.

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Falk B. (falk)


Lesenswert?

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

von Werner13 (Gast)


Lesenswert?

Ja, der offset pendelt um 0...

Werde mal versuchen, den Kp zu erhöhen...

von Ulrich (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Werner13 (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Werner13 (Gast)


Lesenswert?

Ach ja: die windup grenzen für die offset summe sind mit -2000 und 2000 
eingestellt!

von Falk B. (falk)


Lesenswert?

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

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

Kühlung aus...

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

Kühlung ein...

von Falk B. (falk)


Lesenswert?

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.

von Werner13 (Gast)


Lesenswert?

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

von oszi40 (Gast)


Lesenswert?

Est mal praktische Messwerte sammeln und dann die Feinjustage.

von Falk B. (falk)


Lesenswert?

@ 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?

von Werner13 (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ 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 :-(

von Werner13 (Gast)


Lesenswert?

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

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

Nun hab ich Ki gedrittelt, auf -0.01, Kp ist weiter auf -200. Das System 
schwingt wieder, siehe Anhang

von Lurchi (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

http://de.wikipedia.org/wiki/Faustformelverfahren_%28Automatisierungstechnik%29#Empirische_Dimensionierung

Also P runternehmen und schauen.

Tempregelung3.png sieht schon ganz gut aus, weil dort der I-Anteil nicht 
in die Sättigung geht, das vereinfacht einiges.

von Werner13 (Gast)


Lesenswert?

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

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

Das ist nur Kp?

Dann ist |Kp| etwas zu groß.
Kp = -30
sollte die Schwingneigung verringern.

von Werner13 (Gast)


Lesenswert?

Jap das ist nur Kp. Genau, das habe ich auch geplant, werde den Kp mal 
auf -30 setzen...

von Werner13 (Gast)


Lesenswert?

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

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

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

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Werner13 (Gast)


Lesenswert?

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!

von Werner13 (Gast)


Angehängte Dateien:

Lesenswert?

Wieder mal anhang vergessen...

von Falk B. (falk)


Lesenswert?

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

von Lurchi (Gast)


Lesenswert?

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.

von Werner13 (Gast)


Lesenswert?

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?

von Ulrich (Gast)


Lesenswert?

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.

von Margo M. (Firma: student) (yoma)


Lesenswert?

ujkulkjkjkkjkjk

von Margo M. (Firma: student) (yoma)


Lesenswert?

kjkjkj

von Margo M. (Firma: student) (yoma)


Lesenswert?

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

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.