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
Korrektur: >Regeldiff=Temp_Ist > T_Soll; // Regeldifferenz bilden muss sein: >Regeldiff=Temp_Soll - T_Ist; // Regeldifferenz bilden
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.