Archiv verlassen und diese Seite im Standarddesign anzeigen : Regelalgorythmus zur Temperaturregelung
Hallo, ich habe folgendes Problem:
Hardware ist fertig und funktioniert:
mit einem AVR wird ein Wert von 0..255 gesetzt dementsprechend eine Spannung von ca 2-12V folgt. Diese liegt an einem Peltierelement an das einseitig an einem Kühler montiert ist. Auf der anderen Seite ist ein Temperatursensor angebracht der die Temperatur digital an den AVR übergibt.
Erhöht man nun den Digitalwert 0..255 kühlt das Peltierelement.
Mir fehlt nun ein vernünftiger Regelalgorythmus, der mir die variable Solltemperatur(wird vorher eingestellt von ca 0-20°C) am Peltierelement einregelt.
Größen wären also: tsoll, tmess, und Ausgangsgröße y
Ich habe es schon mit einem PID Regler versucht, allering kriege ich den nicht stabil
eingestelle Reglerparameter sind Kp,Ki,Kd,Ta,Überläufe sind abgefangen.
e = tsoll - tmess;
esum = esum + e;
y = Kp*e + Ki*Ta*esum + Kd/Ta*(e – ealt);
ealt = e;
Hat jemand soetwas schoneinmal auf nem Atmel realisiert und Beispielcode?
Für Anregungen wäre ich dankbar.
the_Ghost666
22.09.2009, 22:08
mh wie wärs mit nem einfachen Zweipunkt Regler mit Hysterese? Ist total einfach programmiert und kann auch sehr schön experimentell ermittelt werden.
ich werd morgen mal probieren, danke
Besserwessi
22.09.2009, 22:23
Der PID Code sieht schon mal nicht so falsch aus. Ein Problem könnte aber ein zu schneller Durchlauf der Schleife sein. Das Differentialglied wird dadurch ziehmlich verrauscht und könnte Probleme machen, wenn man irgendwo an die Grenzen stößt oder das System nichtlinear ist.
Die eigentliche Schwieriegkeit bei einem PID Regler ist ja auch das bestimmen der Parameter. Dafür gibt es einige Anleitungen. Mit raten geht das oft nicht so einfach.
Damit der Regler auch über einen größeren Wertebereich mit den gleichen Parametern funktioniert, sollte man das System wenigstens grob lineariesieren. Man sollte also für eine lineare Funktion sorgen von Steuergröße auf Heiz/Kühlleistung des Peltierelements.
Ich hab nen Tiny2313 mit zwei Temperatursensoren in meinem Rechner die Lüfter regeln, dort arbeitet ein modifizierter Integrator.
Die Abweichung/der integrierte/addierte Wert ist dabei auf eine kleine Konstante fixiert, ferner wird die Regelung nur relativ langsam durchgeführt, da der Regelkreis recht träge ist.
Ab einer Abweichung vom Zielwert über/unter eine gewisse Grenze wird die Regelgröße in die entsprechende Gegenrichtung verändert.
Im folgenden Mal der "Kern" der Regelung:
int16_t target_temp_low_offset; // Zwischen Null und diesem Wert wird die Leistung heruntergeregelt
int16_6 target_temp_high_offset; // Definiert die Breite des "neutralen" Bereichs zwischen TARGET_TEMP_LOW_OFFSET und diesem Wert
uint16_t temp1_value; // Temperatur 1 bzw. Messwert
uint16_t temp2_value; // Temperatur 2 bzw. Zieltemperatur
uint8_t integrator; // Die Integrationsvariable
void doSpeedControl(void) {
int16_t delta = temp1_value - temp2_value + target_temp_low_offset;
if (delta > 0) {
delta += target_temp_high_offset;
if (delta > 0) {
if (integrator != 0xFF) {
integrator++;
}
}
} else {
asm volatile (
"subi %[integrator], 0x01" "\n\t"
"brcc end_%=" "\n\t"
"ldi %[integrator], 0x00" "\n\t"
"end_%=:"
: /* Output */
[integrator] "+d" (integrator)
);
}
setFanSpeed(integrator);
}
Meine Regelung arbeitet auf eine Zieldifferenz zwischen den beiden Werten temp1_value und temp2_value hin. Um das ganze zu einer normalen Temperaturregelung zu adaptieren, musst du temp2_value als Zielwert und temp1_value als Messwert verwenden.
Zu den beiden Offset-Variablen:
target_temp_low_offset ist typischerweise kleiner als Null und bestimmt die Schwelle, ab der die Regelung die Regelvariable reduzieren soll.
target_temp_high_offset ist typischerweise größer als Null und bestimmt die Schwelle, ab der die Regelung die Regelvariable erhöhen soll.
Damit ergibt sich folgendes Bild:
-- ] temp2_value + target_temp_low_offset | temp2_value | temp2_value + target_temp_high_offset [ ++
Außerhalb des Bereichs rund um temp2_value wird die Regelvariable angepasst, innerhalb wird sie nicht verändert.
Die Regelgeschwindigkeit kann über die Aufruffrequenz beeinflusst werden, ist sie zu hoch, fährt der Ausgangswert Achterbahn.
mfG
Markus
Edit: Ich rufe bei meiner Steuerung die Funktion ungefähr alle 20 Sekunden einmal auf ...
oberallgeier
22.09.2009, 23:14
Hi Geimel,
... Code ... nicht so falsch ... Problem könnte aber ... zu schneller Durchlauf ... sein ...Der PID-Regler ist schon gut - aber die Einstellung ist auch vertrackt. Ich mühe mich derzeit damit, um bei meiner PID-Geschwindigkeitsregelung von zwei unabhängigen Motoren, Regelfrequenz rund 100 Hz, noch die allerletzten Feinheiten raus- neee reinzukriegen (siehe hier eine alte Testfahrt). (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=450795&sid=137eb2114f58f3a7816e209bd1bd7d05#450795) Dazu nehme ich beispielsweise ne Reihe Messdaten und die Reglerwerte auf, um sie mir in Diagrammen anzusehen. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=457587&sid=cc835517efe2f816c05ab8087204f40f#457587) Die Beurteilung dieser Diagramme hilft - jedenfalls bei mir. Im verlinkten Posting ist auch mein aktueller Code für einen Motor eingeklinkt.
Vermutlich kennst Du dieses hübsche und ergiebige Tutorial. (http://www.rn-wissen.de/index.php/Regelungstechnik) Danach habe ich meine Regelung geschrieben. Dort steht auch ein guter Abschnitt über die Dimensionierung durch Probieren oder durch Einstellregeln. (http://www.rn-wissen.de/index.php/Regelungstechnik#Dimensionierung_durch_Probieren_. 28Empirisches_Einstellen.29) Natürlich muss man dazu die Reglerverstärkung "irgendwie" messen, dazu die Verzögerungszeiten und die systemeigene Zeitkonstante und auch eine Sprungfunktion aufnehmen - hatte ich auch gemacht. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=440157&sid=cc835517efe2f816c05ab8087204f40f#440157) Vermutlich hast Du das aber auch schon alles hinter Dir? Die Sprungfunktion ist bei einem Thermofühler ja einfach bereitzustellen: erst in kochendes Wasser - danach in ein volles Wasserglas mit 50% Eiswürfel ( ok, das gibt NICHT die allerletzten Mikroprozente an Genauigkeit *ggg* ).
Dass bei einer so trägen Sache wie einer Heiz-/Kühlregelung ein 2-Punkt-Regler ausreichend funktioniert - hätte ich auch als erstes geraten . . .
Viel Erfolg
2 Punkt Regler ist sehr ungenau, der Überschwingt ständig, Frequenz ca 0,1Hz. Das Problem wird warscheinlich sein, das ich je nach solltemperatur beide seiten des peltieelementes messen muss und schoneinma eine vorsteuerung nach peltierelementkurve vornehmen muss.
Prost Mahlzeit, das gibt einen Mist :-)
hoi,
bestimm doch mal die sprungantwort des peltierelements. schätz mal, des wird irgendwas pt1 mäßiges sein. sensor denke ich mal, ist deutlich schneller als das peltierelement und abtastzeit, kann man dann wahrscheinlich vernachlässigen.
ich denke, da reicht sogar schon ein einfacher pi regler aus, um das vernünftig hin zu kriegen. und denk dran, du kannst nicht genauer regeln, als du messen kannst, kenn jetzt die auflösung von deinem sensor nicht.
mfg jeffrey
Danke ersteinmal für eure Anworten
Auflösung ist etwa 0,1°C, regeln würde ich auf ca +-1°C genau.
Momentan sind es 2,5Grad.
Ich versuche ersteinmal den Sensor noch besser an das Peltierelement zu koppeln (thermisch).
Das Problem was ich habe, ist ja das ich eine gewisse Grundspannung drauf geben muss, damit eine Temperatur gehalten wird. Wenn ich die aus der Peltierkurve errechne müsste das ganze doch schon wesentlich besser werden oder nicht? Ich würde dann quasi die Feineinstellung um die Grundspannung reglen.
hoi,
ne vorsteuerung kann helfen die regelung zu verbessern. allerdings musst du dann wieder die rückseitentemperatur des peletierelements messen, was den messaufwand erhöht. probier ews doch einfach aus.
mfg jeffrey
Besserwessi
23.09.2009, 17:52
Wie wird denn das Peltierelement angesteuert (Strom, Spannung, PWM) ?
Beim Peltierelement ist die Kühl/Heizleistung nicht linear vom Strom abhängig. Wenn man über den optimalen Strom geht, kreigt man dann auch noch weniger Kühlleistung bei mehr Strom. Da kann so einen Regeler völlig aus dem Konzept bringen. So aufwendig sollte es nicht sein die Steuerung erst mal zu linearisieren. Die Leistung am Pletierelememt folgt näherungsweise der Formel: a * I + b* I²
mit Konstanten a und b ( = R/2).
ja, ich will die messwerte aufnehmen, dh. bei wieviel spannung welche temperaturdifferenz eintritt und damit vorsteuern.
Spannung wird gesteuert, keine pwm
Besserwessi
23.09.2009, 21:02
Das "vorsteuern" ist bei einem PID Regler nur nötig, wenn man ein Temperaturprogram fahren will, und keine konstante Temperatur.
Wichtiger wäre es wenn man das Ergebnis der Regelung für die Leistung, und nicht direkt für die Spannung nutzt. Sonst hängen die richtigen Regelparameter von der Spannung ab.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.