Forum: Compiler & IDEs PI-Regelung einer Heizung Beiwertfrage


von Bene J. (terfagter)


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
}

von Wolfgang Horn (Gast)


Angehängte Dateien:

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

von 900ss (900ss)


Lesenswert?

Wolfgang Horn schrieb:
> schau
> mal deren Thread.

Würd ich auch gerne mal reinschauen. Hast du einen Link dahin?
Danke.

von Bene J. (terfagter)


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?

von Wolfgang Horn (Gast)


Lesenswert?


von Wolfgang Horn (Gast)


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

von 900ss (900ss)


Lesenswert?

Wolfgang Horn schrieb:
> Ach Du liebes Lieschen.

Danke. Ich hatte es nicht so verstanden dass du dich mit "deren Thread" 
auf dieses Forum bezogen hast. Deshalb meine Frage nach einem Link.

von Bene J. (terfagter)


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?!

von Wolfgang Horn (Gast)


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

von citb (Gast)


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

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.