Forum: Mikrocontroller und Digitale Elektronik Was für einen digitalen Regler habe ich nun geschrieben?


von fat.wombat (Gast)


Lesenswert?

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!

von Ben (Gast)


Lesenswert?

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.

von ichglaubsnet (Gast)


Lesenswert?

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.

von pq (Gast)


Lesenswert?

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

von pq (Gast)


Lesenswert?

Korrektur:
>Regeldiff=Temp_Ist > T_Soll; // Regeldifferenz bilden
muss sein:
>Regeldiff=Temp_Soll - T_Ist; // Regeldifferenz bilden

von Joan P. (joan)


Lesenswert?

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...

von TurboBusen (Gast)


Lesenswert?

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

von TurboBusen (Gast)


Lesenswert?

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

von fat.wombat (Gast)


Lesenswert?

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!

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.