Temperaturregelung mehrstufig (Arduino?)

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

duese
Beiträge: 6094
Registriert: So 11. Aug 2013, 17:56

Re: Temperaturregelung mehrstufig (Arduino?)

Beitrag von duese »

Einen Regler diskret zu programmieren ist gar nicht so schwer. Viele Ansätze sind hier schon beschrieben worden.
Davon trennen kann man noch die Geschichte mit den Rampen und die eigentliche Leistungssteuerung. Damit hat man dann drei Blöcke und es wird übersichtlicher.

Erstmal der Regler. Der einfachste Fall ist ein Proportionalregler (P-Regler):
Das ist Pseudocode. In Realität würde ich das in eine von einem Timer getriggerte Schleife packen und nicht per wait machen.

Code: Alles auswählen

:Start
  Regelabweichung = Sollwert - Istwert
  P_Anteil = Regelabweichung * kP
  Reglerausgang = P_Anteil
  wait Zykluszeit
  goto Start
Hierbei ist kP der Verstärkungsfaktor. Wenn man Beispielsweise möchte, dass der Regler bei 5K Abweichung vom Sollwert die Heizung voll aufgerissen hat, würde man den hier zu 0,2 wählen (5K*0,2=1= 100%).
Je größer kP ist, desto schneller wird auf die Temperatur hin gesteuert, desto größer wird aber auch der Überschwinger und wenn er zu groß ist, dann schwingt die Kiste dauerhaft.

Mit einem P-Regler wird man aber nie genau die Solltemperatur erreichen. Vielleicht reicht das hier aber auch schon.

Wenn nicht, dann kann man auch noch einen I-Anteil dazu bauen und kriegt einen PI-Regler:

Code: Alles auswählen

:Start
  Regelabweichung = Sollwert - Istwert
  P_Anteil = Regelabweichung * kP
  I_Anteil = I_Anteil + (Regelabweichung * kI)
  Reglerausgang = P_Anteil + I_Anteil
  wait Zykluszeit
  goto Start
kI ist wie kP für den I-Anteil.

Wenn man schnell auf Störgrößen von außen reagieren muss, könnte man noch einen Differentialanteil dazubauen und hätte einen PID-Regler. Das wird bei einem Brennofen aber ziemlich sicher nicht der Fall sein. Das sähe dann so aus:

Code: Alles auswählen

:Start
  Regelabweichung = Sollwert - Istwert
  Istwert_alt = Istwert
  P_Anteil = Regelabweichung * kP
  I_Anteil = I_Anteil + (Regelabweichung * kI)
  D_Anteil = (Istwert_alt - Istwert) * kD
  Reglerausgang = P_Anteil + I_Anteil + D_Anteil
  wait Zykluszeit
  goto Start
Zum Ermitteln der Parameter würde ich mit einem reinen P-Regler anfangen (sprich kI und kD sind 0). Dann den kP so lange erhöhen bis man ein brauchbares Regelverhalten hat (Überschwinger und so). Wenn dann noch benötigt kI vorsichtig erhöhen.

I-Anteile haben den Nachteil, dass wenn der Sollwert lange nicht erreicht wird, sich der I_Anteil auf sehr große Werte aufsummiert, die dann stören, wenn der Sollwert erreicht wird. Da kann man dann noch einen Anti-Windup einbauen, sprich den Wert von I_Anteil auf z.B. 0,1 begrenzen. Das gibt allerdings eine Nichtlinearität, die einem andere Probleme machen kann. (War bei mir noch nicht der Fall.) Und es ist die Frage, ob es den I-Anteil hier überhaupt braucht.

Zum Regler optimieren wäre es ganz gut, wenn man auf jeden Fall die Temperatur und wenn möglich auch die einzelnen Anteile und den Reglerausgang in ein Diagramm plotten könnte. Das hilft (zumindest mir) sehr beim Verständnis und dabei ein Gefühl für die Geschichte zu bekommen.

Dem Regler ist es erstmal egal, ob der einen konstanten oder einen veränderlichen Sollwert bekommt.
Sprich, man kann die Temperaturprofilgeschichte getrennt vom Regler betrachten.

Auch die Leistungsstellung ist unabhängig vom Regler, wie man die ausführt.
Wenn man einen Reglerausgang von 0,2 hat, könnte man:
- 2 Sekunden an, 8 Sekunden aus
- 1 Netzperiode an, 4 aus
- Phasenanschnitt mit Stellgrad, dass 20% Leistung rauskommen
- eines von fünf Heizregistern an
- oder verschiedene andere Leistungsstellvarianten machen
Das ist wiederum dem Regler egal.

Damit hat man drei übersichtlichere Funktionsblöcke und die Aufgabe wird vielleicht etwas weniger abschreckend...
Zuletzt geändert von duese am Mi 18. Jul 2018, 07:11, insgesamt 2-mal geändert.
Benutzeravatar
RMK
Beiträge: 5409
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Temperaturregelung mehrstufig (Arduino?)

Beitrag von RMK »

puh. danke, ich wollte schon "Aufhören" brüllen .... (hey, ich hab noch nichtmal einen AN/AUS realisiert bis jetzt... :-) )

aber es hilft sehr beim Gedanken machen. grossartige Störgrößen muss ich glaube ich nicht beachten, wenn jemand
die Brennofentür aufreisst gibts was von Frauchen aufs Auge...

Im Moment verhält sich der Ofen (mit der eingebauten Steuerung) so, dass er heizt und regelmässig Pause macht.
die genaue Frezquenz bzw. "Pulsweite" habe ich noch nicht rausgemessen, das kommt noch, ich weiss nur dass er
ziemlich genau 15min braucht um eine neu eingestellte Temperatur zu erreichen (bei kleinen Schritte, hier
beispielsweise 65° Erhöhung, ergibt sich eine zuerst schnell, dann langsamere Anpassung "von unten", wenn man die
Temperatureinstellung stark ändert schwingt er auch mal (leicht) drüber... )

ich würde halt mal die Einschaltzeiten bei gegebener Solltemperatur aufzeichnen, und zwar für verschiedene
Temperaturen, und auch die Abkühlung mal Temperatur/Zeit mitplotten - wobei das ziemlich sicher eine
Badewannenkurve gibt...

ich gehe davon aus dass sich das Ganze dann auch einigermassen einfach (womöglich ohne Änderung der Parameter) auch
auf einen (noch zu beschaffenden...) großen Ofen übertragen lässt. Aber das finde ich dann raus. :)
Benutzeravatar
RMK
Beiträge: 5409
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Temperaturregelung mehrstufig (Arduino?)

Beitrag von RMK »

ach, und weil ich den grade gefunden habe, hier ist im Moment ziemlich genau *so* ein Teil im Betrieb
(okay, meiner ist aussenrum orange, aber sonst identisch):

https://www.al-dental.de/geraete/vorwae ... cl-v-11001
IPv6
Beiträge: 2210
Registriert: Fr 17. Mär 2017, 22:05

Re: Temperaturregelung mehrstufig (Arduino?)

Beitrag von IPv6 »

@duese:
Haben sich da vielleicht ein paar kleine Fehler eingeschlichen?

Code: Alles auswählen

I_Anteil = I_Anteil * Regelabweichung * kI
Das sollte doch "I_Anteil = I_Anteil + Regelabweichung * kI" heißen, oder?

Und:
...sprich den Wert von kI auf z.B. 0,1 begrenzen
Da ist wohl der Wert von "I_Anteil" gemeint und nicht von kI?

Nur, falls jetzt jemand auf die Idee kommt das so direkt zu programmieren :D
duese
Beiträge: 6094
Registriert: So 11. Aug 2013, 17:56

Re: Temperaturregelung mehrstufig (Arduino?)

Beitrag von duese »

@IPv6: Danke fürs mitdenken, Du hast natürlich völlig, habs korrigiert. Die Erkältung schlägt offensichtlich auf die Denkfähigkeit.

@RMK: Nur die Pulsmuster zu replizieren wäre eine Steuerung, keine Regelung. Für gleiche Beladung könnte das hinkommen. Wenn aber mehr oder weniger drin ist, nicht mehr. Das ist ja genau die Aufgabe des Reglers das auszugleichen. Da man aber aus so einer Aufzeichnung Rückschlüsse auf den Bestehenden Regler, seine Strategie und Reglerkonstanten schließen kann, ist es eine gute Idee das aufzuzeichnen...
Antworten