PI-Regelung einer Heizung Beiwertfrage

OP #2293229
Lesenswert?

Hallo zusammen,

ich habe einen PI-Regler auf einem ATMEGA1280 programmiert. Geregelt 
werden soll ein kleines Heizelement über eine PWM. Der Istwert wird über 
einen Temperatursensor eingelesen.
Die PWM hat einen Wertebereich vom 0 bis 399, währen 399 "Volllast" 
bedeutet.
Der Istwert bewegt sich in einem Bereich von 0 bis 30 Grad. Die 
Sollbgröße wird mit 25 vorgegeben. Zur Zeit gibt es keine 
Nachkommastellen. Ta ist 1sec. Die Funktion also einmal pro sec 
aufgerufen.
Mein Problem ist das Ermitteln von Ki und Kp. Zur Zeit wird die PWM sehr 
schnell auf 399 gesetzt. Erst nachdem die Solltemperatur überschritten 
wurde, wird die PWM langsam wieder runtergesetzt.
Ich wüßte auch gerne wie groß die Begrenzung des I-Anteils gesetzt 
werden sollte. Jetzt ist sie ja -50 bis 50.
Zur Zeit schwankt die Temperatur zwischen 32 Grad und 24 Grad!
Danke für eure Hilfe.
1
int8_t Tempgemessen = 0;
2
int16_t esum = 0;
3
void tempregelung(void)
4
{
5
  #define Kp 15
6
  #define Ki 50
7
  #define Ta 0.5
8
  
9
  int16_t reg_abweichung = 0;
10
  int16_t reg_stellwert = 0;
11
  char buffertempfalsch[12];
12
  
13
  therm_read_temperature1(buffertempfalsch, 2);        //Istwert einlesen
14
  
15
  reg_abweichung = 35 - Tempgemessen;
16
  esum = esum + reg_abweichung;
17
  if (esum < -50) 
18
    esum = -50;                            //Begrenzung I-Anteil
19
  if (esum > 50) 
20
    esum = 50;
21
  
22
  reg_stellwert = Kp * reg_abweichung + Ki * Ta * esum;
23
  if (reg_stellwert < 0) 
24
    reg_stellwert = 0;                    //Begrenzung Stellgröße
25
  if (reg_stellwert > 399) 
26
    reg_stellwert = 399;
27
  OCR1C = reg_stellwert;                    //Übergabe Stellgröße an PWM
28
}
Gast #2293463
Lesenswert?

Hallo zurück, Bene, Du einer :-),

> Mein Problem ist das Ermitteln von Ki und Kp.
Klar. Weil alle drei Werte (Kp, Ki, (Kd für den PID-Regler) und 
Abtastrate) angepasst sein müssen an die Realität von Heizung und dem 
Antwortverhalten des Geheizten.
Banale Weisheit mit anderen Worten: Die Regelung eines Hochrades 
benötigt zwingend andere Werte als die Regelung eines Tretrollers, 
andernfalls gibt's mindestens Schürfwunden.

Die Datei im Anhang soll anregen, mit Ihr wirst Du Deiner Lösung schon 
näher kommen.
Ansonsten suche nach "Autotuning", "Ziegler", "Nichols" und mit den 
Links wirst Du mehr Ansätze zur Lösung Deiner Aufgabe finden, als Du in 
einem Semester auch nur lesen kannst.

Ich bestaune die Regeltechniker, welche die kleinen 
Raumheizungssteuerungen entwickelt haben (z.B. Rhondostat) - denn kleine 
Räume müssen mit anderen Parametern geregelt werden als Turnhallen.
Geschickte und kluge Kollegen hier haben sich damit näher befasst, schau 
mal deren Thread.

Ciao
Wolfgang Horn
Angehängte Dateien:
OP #2293663
Lesenswert?

Ok, ich gucke mir die Ziegler Methode heute Abend mal an, wenn ich nach 
Hause komme. (Bin zur Zeit in Kanada, also wirds erst so 22-23h in 
Deutschland werden)
Gibt es für sowas nicht kostenlose Simulationssoftware? Oder 
Demosoftware. Mit LabVIEW könnte man das ja machen, aber das habe ich 
hier nicht auf meinem Rechner...
Kann man diese Werte wirklich nur empirisch ermitteln?
Gast #2293771
Lesenswert?

Gast #2293776
Lesenswert?

Hi, Bene,

> Gibt es für sowas nicht kostenlose Simulationssoftware? Oder
> Demosoftware. Mit LabVIEW könnte man das ja machen, aber das habe ich
> hier nicht auf meinem Rechner...
> Kann man diese Werte wirklich nur empirisch ermitteln?

Für meine bescheidenen Zwecke hat mir die Zweipunktregelung bisher 
genügt.
Ich mag nicht schwindeln - für Deine weiteren Fragen bitte ich die 
Könner in dieser Sache hier um Rat.

Ciao
Wolfgang Horn
OP #2294383
Lesenswert?

Bei meiner Regelung habe ich auch noch folgendes Problem:
Ich habe zwei int8_t Variablen, die mir die Temeratur liefern, jetzt mal 
egal wo die herkommen.
Die erste Variable enthält die Zahlen vor dem Komma und die zweite 
Variable 4 Nachkommastellen. Wie bekomme ich jetzt aus zb. 20 und 2521 
den Wert 202521 raus? Das wären dann quasi meine "milli Grad Celsius"
Oder soll ich da anders vorgehen? Lieber mit Kommastelle und float 
rechnen?!
Gast #2294426
Lesenswert?

Hi, Bene,

> Die erste Variable enthält die Zahlen vor dem Komma und die zweite
> Variable 4 Nachkommastellen. Wie bekomme ich jetzt aus zb. 20 und 2521
> den Wert 202521 raus?

Guckst Du hier: Beitrag "Re: Alarme und Positionsvariablen durchlaufen lassen"

> Das wären dann quasi meine "milli Grad Celsius"
Ja. Diese Änderungen über die Zeit brauchst Du aber nicht wesentlich 
schneller ausgeben, als der Mensch gucken kann ;-).

> Oder...Lieber mit Kommastelle und float rechnen?!

Ich hasse das Bevormunden. Ich hasse die Abhängigkeit vom Bevormunder, 
in die gerät, wer das Selberdenken der Bequemlichkeit opfert.
Beide Wege sind machbar.
„Die Natur wählt den kürzesten möglichen Weg.“(Aristoteles)
Welcher ermöglicht letzten Endes ein Minimum an Kosten? Welcher ist 
einfacher, schneller geschrieben, dokumentiert und getestet, hat sich 
der Wartungstechniker schneller eingelesen?

Ciao
Nachteule
Gast #2294428
Lesenswert?

Bene Jan schrieb:
> Die erste Variable enthält die Zahlen vor dem Komma und die zweite
> Variable 4 Nachkommastellen.

Tu Dir selbst einen gefallen und platziere in eine Variable den Wert in 
z.B.
Zehntelcelsius. Das ist ohnehin schon genauer, als Du messen kansst und 
sicher vollkommen ausreichend.

citb
#2294677
Lesenswert?

Bene Jan schrieb:
> Bei meiner Regelung habe ich auch noch folgendes Problem:
> Ich habe zwei int8_t Variablen, die mir die Temeratur liefern, jetzt mal
> egal wo die herkommen.
> Die erste Variable enthält die Zahlen vor dem Komma und die zweite
> Variable 4 Nachkommastellen. Wie bekomme ich jetzt aus zb. 20 und 2521
> den Wert 202521 raus? Das wären dann quasi meine "milli Grad Celsius"
> Oder soll ich da anders vorgehen? Lieber mit Kommastelle und float
> rechnen?!

citeb hat grundsätzlich recht.

Aber um auf das Problem zurückzukommen:

Wenn du in 2 Variablen ein Gewicht gespeichert hast, in der einen zb 5 
Tonnen und in der anderen 674 Kilogramm, wie errechnet sich dann das 
Gesamtgewicht in Kilogramm?

Deine 'Basiseinheit' ist nicht Kilogramm, sondern Milligrad Celsius. In 
der einen Variablen ist die Tausendereinheit (als das was beim Gewicht 
die Tonnen waren, quasi die Kilo-Milligrad) und in der anderen die 
Basiseinheit, also die Kilogramm, bei dir eben Milligrad.
Wie errechnet sich dann aus diesen beiden Angaben die Gesamtzahl der 
Milligrad Celsius?


Ist schon erstaunlich, dass die Leute alles was sie in der Grundschule 
gelernt haben vergessen, sobald sie es programmieren sollen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren