Hallo Sven,
dein Code
if (ist_temp < soll_temp)
heizen = 1;
else heizen = 0;
ist kein Zweipunktregler, bzw, wenn es einer sein soll, dann hat er
keine Hysterese.
Mit Hysterese schaut das so aus:
if (ist_temp < (soll_temp - hysterese)) heizen = 1;
else if (ist_temp > (soll_temp + hysterese)) heizen = 0;
Für Heizungssteurungen ist ein PI Regler üblich, das benötigt aber eine
analoge Strecke, d.h. kein Ein-Aus-Verhalten der Heizung. Die
Heizleistung sollte prozentual einstellbar sein.
PI-Regler:
float heizen, ist_temp, soll_temp, Errorintegral, Kp, Ki;
#define negIntegralsaturation 100
#define posIntegralsaturation 100
Errorintegral += (ist_temp - soll_temp);
if (Errorintegral > posIntegralsaturation) Errorintegral =
posIntegralsaturation;
if (Errorintegral < negIntegralsaturation) Errorintegral =
negIntegralsaturation;
heizen = Kp * (ist_temp - soll_temp);
heizen += Ki * Errorintegral;
if (heizen > 1) heizen = 1;
if (heizen < 0) heizen = 0;
Am Anfang vom Programm müssen alle Variablen auf 0 initialisiert werden.
Die meisten C-Compiler machen das, sollte man aber trotzdem prüfen.
heizen ist jetzt ein Ausgangswert im Gleitkommaformat von 0.0 (nicht
heizen) bis 1.0 (volle Heizleistung). Kp und Ki sind die Regelparameter,
einstellbar z.B. nach einer heuristischen Methode.
Mit diedem Regler ist sowohl eine Schwingneigung sowie ein Überschwingen
vermeidbar.
Wichtig ist, dass die Routine immer gleich oft in gleichen
Zeitabschnitten ausgeführt wird -> Timer verwenden.
Viele Grüße,
Peter