Hallo Alle!
Für eine Heizungssteuerung (Bauteile auf Kühlkörper, Stellwert ist eine
PWM, Temperatur wird mit einem NTC ermittelt, Temperatur muss konstant
gehalten werden), habe ich folgenden primitiven Regler geschrieben
(Pseudo-Code):
.................
Temp_Ist = GetADC(2); // messe Temperatur am Kühlkörper mit dem NTC
if (Temp_Ist > T_Soll) Duty_Cycle --; // wenn zu heiss, Leistung
reduzieren
if (Temp_Ist < T_Soll) Duty_Cycle ++; // wenn zu warm, Leistung erhöhen
.................
Das Ganze wird jede Sekunde aufgerufen.
Natürlich checke ich auch auf, dass das Tastverhältnis nicht aus dem
Einstellbereich des Timers läuft.
Dieser "digitaler Regler" scheint für meine Zwecke auch recht gut zu
funktionieren, die Temperatur wird schön konstant gehalten.
Nun habe ich Schwierigkeiten, den einer Gruppe zuzuordnen. OK, das
System ist sehr träge (grosser KK), daher hat sie bereits einen
I-Anteil. Aber was habe ich hier mit diesen 3 Zeilen gemacht? Ist das
ein P-Regler???
Bitte um Hilfe, ich will wirklich die theoretische Grundlage wissen!
(und ja, ich kenne die Gleichungen vom digitalen PI- oder PID-Regler,
habe sie bereits ausprobiert, doch ohne präzise Ermittlung von den
Koeffizienten schwingen oder übersteuern sie (und ich habe nun keine
Zeit mehr, um die Koeffizienten zu ermitteln). Das oben, hingegen, läuft
recht stabil.
Danke für Eure Hilfe!
hm wie das genau heißt was du gebaut hast weiß ich nicht, aber für sowas
werden normalerweise integralregler verwendet. sprich die messen die
ist-temperatur nicht nur absolut, sondern achten auf ihre veränderung
zwischen zwei messpunkten. manche regler sollen sogar lernfähig sein,
daß sie sich etwa merken wie träge der ist-wert reagiert und welches
"power-level" für die haltung notwendig ist. gebastelt hab ich sowas
aber noch nicht.
Du musst die Charakteristik deiner Regelstrecke kennen, sonst ist das
Glaskugel. Die kann ja irgendwas wie Kelvin je %PWM wärmer oder kälter
werden. Die beiden Werte sind meistens unterschiedlich. Wenn du also
jede Sekunde misst und die Strecke ist träger wie du sagst, dann wirst
du mit der Logik oben wohl den Regler jedes Mal verstellen. Ich könnte
mir gut vorstellen, dass PWM ständig zwischen 0 und 100% schwingt und
das gute Ergebnis nur Zufall ist. Außerdem braucht es wohl dann auch
noch eine kleine Hysterese.
Das wäre ein I-Regler:
>Temp_Ist = GetADC(2); // messe Temperatur am Kühlkörper mit dem NTC>Regeldiff=Temp_Ist > T_Soll; // Regeldifferenz bilden>IAnteil=Regeldiff //Nur IRegler>Duty_Cycle+=IAnteil; // wenn zu heiss, Leistung reduzieren, wenn zu warm,
Leistung erhöhen
Du hast aber das programmiert: (Ich habs etwas "umformuliert")
>Temp_Ist = GetADC(2); // messe Temperatur am Kühlkörper mit dem NTC>Regeldiff=Temp_Ist > T_Soll; // Regeldifferenz bilden>IAnteil=Regeldiff //Nur IRegler>if (IAnteil>0) IAnteil = 1;>if (IAntei<0) IAnteil = -1;>Duty_Cycle+=IAnteil; // wenn zu heiss, Leistung reduzieren, wenn zu warm,
Leistung erhöhen
Der Unterschied zwischen deinem Regler und nem I-Regler sind also die
Zeilen:
>if (IAnteil>0) IAnteil = 1;>if (IAntei<0) IAnteil = -1;
Das kann man auch sehen als sehr sehr grobe Quantisierung, ähnlich einem
1-Bit ADC.
Dein Regler ist also ein I-Regler mit ner nichtlinearität im Regler.
pq
ichglaubsnet schrieb:
> Du musst die Charakteristik deiner Regelstrecke kennen, sonst ist das> Glaskugel. Die kann ja irgendwas wie Kelvin je %PWM wärmer oder kälter> werden. Die beiden Werte sind meistens unterschiedlich. Wenn du also> jede Sekunde misst und die Strecke ist träger wie du sagst, dann wirst> du mit der Logik oben wohl den Regler jedes Mal verstellen. Ich könnte> mir gut vorstellen, dass PWM ständig zwischen 0 und 100% schwingt und> das gute Ergebnis nur Zufall ist. Außerdem braucht es wohl dann auch> noch eine kleine Hysterese.
This^^
Deine "Regelung" ist im Mom nen Teil dass jede Sekunde den Regelwert
erhoeht/verringert wenns noch nicht stimmt.. das wird ziemlich fix immer
gegen die Max/Min Werte deines "Duty_Cycle" fahren.
Im Prinzip integral.
Ohne wenigstens grobe Daten zur Regelstrecke kann man da nix ordentlich
machen.
Du muesstest die mal 100% aussteuern und schauen wie lang die Temp (oder
was auch immer du regeln willst) braucht um auf ihren Max-Wert zu
steigen.
Das Verfahren nennt sich Sprungantwort. Aus dem Anstiegsverlauf des zu
regelnden Wertes kann man die Zeitkonstante der Strecke ermitteln (denk
an nen Kondensator der ploetzlich an xV geklemmt wird und seine
Ladekurve).
Damit kannst du dann nen Regler designen/einstellen...
Der TO fragte in seinem Eröffnungsthread nach der Typenbezeichnung des
von ihm programmierten Reglers. Nun, sie lautet Dreipunkt-Regler. Und
aufgrund des inkrementalen Verhaltens des Reglerausgangs ist es, um
genau zu sein, ein Dreipunkt-Schritt-Regler.
Dieser Reglertyp wird häufig zur einfachen Temperaturregelung
eingesetzt.
fat.wombat schrieb:
>Dieser "digitaler Regler" scheint für meine Zwecke auch recht gut zu>funktionieren, die Temperatur wird schön konstant gehalten.
Offensichtlich ist der Dreipunktregler doch für die gestellte
Anforderung ausreichend. Warum also einen anderen Regler nehmen?
MFG
Verzeihung, ich muß mich gerade selbst berichtigen:
Da nur durch Aufheizen aktiv die Temperatur geändert werden kann ist es
natürlich nur ein Zweipunkt, bzw. Zweipunkt-Schritt-Regler. Bei einem
Dreipunktregler könnte man ggf. noch aktiv Kühlen.
MFG
TB
Hallo Alle!
Wow, das nenne ich ein aktives Forum ;-)
Danke für die Postings!
@Joan:
ja, das klassische Verfahren mit Sprungantwort und Bestimmung von
PID-Koeffizienten kenne ich, komme im dem Fall aus verschiedenen Gründen
aber nur schwer dazu.
Du sagtest:
"Deine "Regelung" ist im Mom nen Teil dass jede Sekunde den Regelwert
erhoeht/verringert wenns noch nicht stimmt.. das wird ziemlich fix immer
gegen die Max/Min Werte deines "Duty_Cycle" fahren."
Nun, genau das ist der Trick, die 1sec scheint sehr gut zu dieser
Regelstrecke (zu Ihrer eigenen Trägheit) zu passen, die PWM läuft dann
nicht weg, sondern bleibt wunderbar ruhig und schwankt lediglich um +-
2-4 Schritte im ausgeregelten Zustand.
@pq:
ja, genau so eine theoretische Überlegung habe ich mir auch gewünscht.
Den I-Regler kenne ich so:
error = TempIst - TempSoll; //Fehler berechnen
esum = esum + error; //Fehler Integrieren
DutyCycle = Ki Ta esum; //Stellwert allein mit I-Anteil
OK, wenn Ki = 1 und Ta = 1, kommen wir zu:
DutyCycle = esum;
Soweit klar, genau hier scheitere ich aber. Darf ich jetzt die obere
Zeile so umschreiben (weil esum = esum + error):
DutyCycle += error;
Dann kämme ich dort, wo Du bist, nämmlich zu einem "nichtlinearen"
I_Regler, hm.... Hm...
Du sagtest:
"Das kann man auch sehen als sehr sehr grobe Quantisierung, ähnlich
einem
1-Bit ADC.
Dein Regler ist also ein I-Regler mit ner nichtlinearität im Regler."
Genau deswegen habe ich gestern den ganzen Tag nach den "sukzessiven
ADC-Wandlern" gegoogelt, sie nähern sich ja sukzessive dem demessenen
Wert. Das kommt mir sehr ähnlich vor, ein "sukzessiver" Regler? - Gibt's
denn so eine Regler-Abartung? ;-)
@TurboBusen
Yep, die Überlegung mit dem 2-Punkte-Regler habe ich auch lange Zeit
gehabt. Was mich gestört hat, ist, dass er nur zwei Zustände am Ausgang
hat, Ein und Aus und ich habe hier doch mehrere ???
Vom "Zwei-Punkte-Schrittregler" höre ich zum ersten Mal, aber vielen
Dank, der Tipp scheint heiss zu sein!
Den gibt es offensichtlich tatsächlich, habe mal kurz gegoogelt, aber
noch keine wirklich passende Beschreibung gefunden.
Darf ein "Zwei-Punkt-Schrittregler" mehrere Zustände am Ausgang haben?
Wie wird er beschrieben? Bitte um kurze Info (Hinweis), wenn Du welche
hättest.
Generell würde ich meinen:
dieser selbstgebastelte "Regler" scheint zu meinen Regelzwecken sehr gut
zu passen und ist so einfach und platzsparend, dass es nicht mehr geht.
Dieser Regler hält die Spannung am NTC-Widerstand (aka
"Kühlkörper-Temperatur") auf +-0.01V genau, was will man mehr???... Und
das alles, ohne dass ich eine Sekunde gespendet habe, die
Regelstrecken-Parameter (ausser Abtastzeit) zu ermitteln. Das wäre
wahrschinlich noch ein Hinweis Richtung "2-Punkt-Regler", oder?
Ich habe ihn bereits mit einem klassischen PI-Regler verglichen, er
braucht ca. 3x mehr Speicherplatz, ganz zu schweigen von der
Rechenleistung und läuft - ohne dass man die Ki und Kp präzise ermittelt
-echt unsauber.
Wenn wir jetzt dieses Ding oben als "Zwei-Punkt-Schrittregler"
definieren dürfen, dann darf ich doch sicher sein, dass er - wie jeder
2-Punkte-Regler - inherent stabil ist und nicht zum Schwingen neigt,
seht Ihr das auch so?
Nochmals vielen Dank zu den Hinweisen, ohne Euch würde ich nicht so weit
kommen!