mh wie wärs mit nem einfachen Zweipunkt Regler mit Hysterese? Ist total einfach programmiert und kann auch sehr schön experimentell ermittelt werden.
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.
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
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:
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.Code: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); }
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 ...
Hi Geimel,
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). Dazu nehme ich beispielsweise ne Reihe Messdaten und die Reglerwerte auf, um sie mir in Diagrammen anzusehen. Die Beurteilung dieser Diagramme hilft - jedenfalls bei mir. Im verlinkten Posting ist auch mein aktueller Code für einen Motor eingeklinkt.Zitat von Besserwessi
Vermutlich kennst Du dieses hübsche und ergiebige Tutorial. Danach habe ich meine Regelung geschrieben. Dort steht auch ein guter Abschnitt über die Dimensionierung durch Probieren oder durch Einstellregeln. 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. 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
Ciao sagt der JoeamBerg
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
Lesezeichen