Hallo,
ich möchte (zum ersten Mal für mich) einen Regler mit einem
Mikrocontroller aufbauen. Ich habe schon eine "Vermutung" wie es geht,
es wäre aber nett, wenn jemand mit Erfahrung mir bestätigen könnte, ob
meine Annahmen o.k. sind.
Zur Regelstrecke:
Es handelt sich um einen PWM-geregelten Lüfter welcher in einem Rohr
ist. In dem Rohr befindet sich ein Luftmassenmesser, dessen
(Analog-)Signal ich messe.
Die Aufgabe:
Es soll ein Soll-Massenstrom durch den Lüfter bewegt werden. Mit äußeren
Störgrößen ist nicht zu rechnen.
Mein Lösungsansatz:
Ich habe mir die Sprungantwort des Systems angeschaut (siehe Anhang). Es
handelt sich scheinbar um ein PT1-System mit Totzeit (0,8s).
Meiner Ansicht nach ist ein PID-Regler geeignet für das System.
Aus der Sprungantwort entnehme ich:
Nach Chien/Hrones/Reswick:
Im Code würde ich dann eine Funktion mit einer Abtastzeit von Ta = 100ms
(reicht das???) aufrufen, die folgendes macht:
Und y gibt mir dann (in %) das neu einzustellende PWM-Verhältnis an.
Ist das richtig?
Verbesserungsvorschläge?
Über "Feedback" (Anglizismus) würde ich mich sehr freuen.
Viele Grüße,
Alex
Ja das geht so.
Worauf Du achten solltest ist, das Deine gemessenen Werte einigermassen
"glatt" sind bevor Du sie dem PID Algo fuetterst.
Sonst regelt sich Dein Regler tot und Du machst Dir Gedanken warum Du
vorher gerechnet hast.
Wenn Du die Analogwerte per uC ADC misst, dann benutze die ISR des ADC
und einen schnellen Algo um den (moeglichst gleitenden) Mittelwert zu
berechnen.
Ju
Alex Bürgel schrieb:> Mit äußeren> Störgrößen ist nicht zu rechnen.
wozu willst du dann einen Regler programmieren.
Ohne Störungen kannst du ja auch jedem Massestrom fest ein
Tastverhältnis zuordnen.
Das ist ein Argument, vielleicht sollte man die Formulierung ändern in:
"Mit gewaltigen äußeren Störgrößen ist nicht zu rechnen".
Außerdem: Wenn ich feste Tastverhältnisse einprogrammieren wollte, so
müsste ich diese erstmal messen. Das könnte mehr Aufwand sein, als einen
Regler zu erstellen. Zumal es interessanter ist :-)
Gruß,
Alex
@Jup:
Alles klar, werde einen gleitenden Mittelwert für die ADC-Messungen
verwenden.
Hallo Alex,
bei deinem Integrator in der Zeile esum=esum+e solltest du noch eine
Begrenzung einführen. Wenn es zu einem Variablenüberlauf kommt, kann das
in einer Regelschleife fatale Folgen haben.
Gruß,
Alexander
Zu der begrenzung des Integrators:
Die Begrenzung ist nicht nur wegen eines Variablenüberlaufs sinnvoll. Da
deine Stellgröße begrenzt ist solltest du den maximalwert deines
I-Anteils dahingehend begrenzen. Wenn der Regler am Anschlag der
Stellgröße ist und die Regeldifferenz immer noch positiv ist steigt der
I-Anteil weiter. Fällt dann die Regeldifferenz muss dieser I-Anteil erst
wieder abgebaut werden bevor der Ausgang reagieren kann.
Christian schrieb:> Die Begrenzung ist nicht nur wegen eines Variablenüberlaufs sinnvoll.
[...]
> Wenn der Regler am Anschlag der> Stellgröße ist und die Regeldifferenz immer noch positiv ist steigt der> I-Anteil weiter.
Da habe ich nur so rein interessehalber mal eine Verständnisfrage zu:
Ein I-Regler zeichnet sich ja dadurch aus, dass er keine bleibende
Regeldifferenz hat. Bei korrekter Dimensionierung (und einem
BIBO-stabilen System) dürften doch keine Werte "durch die Decke" gehen,
oder?
Abgesehen davon würde ich natürlich auch eine Begrenzung einfügen.
Kostet nix und man ist auf der sicheren Seite. ;)
Markus J. schrieb:> Da habe ich nur so rein interessehalber mal eine Verständnisfrage zu:> Ein I-Regler zeichnet sich ja dadurch aus, dass er keine bleibende> Regeldifferenz hat. Bei korrekter Dimensionierung (und einem> BIBO-stabilen System) dürften doch keine Werte "durch die Decke" gehen,> oder?
Im eingeschwungenen Zustand sollte das so sein. Es gibt aber auch die
Zeit nach dem Einschalten, wenn Soll- und Istwerte evtl. weit
auseinander liegen, Sollgrößensprünge oder größere Änderungen der
Störgröße, auf die man keinen Einfluss hat. In diesen Fällen kann der
Integrator an den Anschlag laufen, und das sollte verhindert werden.
Gruß,
Alexander
Markus J. schrieb:> Da habe ich nur so rein interessehalber mal eine Verständnisfrage zu:> Ein I-Regler zeichnet sich ja dadurch aus, dass er keine bleibende> Regeldifferenz hat. Bei korrekter Dimensionierung (und einem> BIBO-stabilen System) dürften doch keine Werte "durch die Decke" gehen,> oder?
Das nicht.
Aber wenn dein mechanisches System auf einen Anschlag fährt, kann der
Regler ausregeln so viel er will, er wird den Fehler nicht mehr kleiner
kriegen. (Ein Verfahrweg der auf 100mm limitiert ist und der Regler will
an die Position 150 verfahren). Mit dem Effekt, dass der aufsummierte
Fehlerwert in kürzester Zeit durch die Decke geht.
Hm, das stellt mich noch nicht ganz zufrieden. ;)
@Alexander: Weit auseinanderliegende Soll-/Istwerte sollte doch der
D-Anteil des Reglers schnell ausgleichen, bevor der I-Teil zu lange
herumintegriert.
@Karl Heinz: Wenn mein Regler an die Position 150 fahren will, obwohl
nur 100 geht, habe ich doch entweder eine falsche Führungsgröße oder die
Dämpfung ist zu klein und das System schwingt zu stark.
Also in beiden Fällen eigentlich falsch dimensioniert, oder?
(Eigentlich hatte ich mir geschworen, nie wieder über Regelungstechnik
nachzudenken, nachdem ich 3x durch die Klausur gefallen bin und erst in
der mündlichen Nachprüfung bestanden habe. Praktische Erfahrungen habe
ich auch nicht. Aber aus irgendeinem Grund finde ich das gerade
interessant. Sollten meine Einwände/Fragen zu blöd sein, dann sagt mir
bitte Bescheid. ;) )
Markus J. schrieb:> @Alexander: Weit auseinanderliegende Soll-/Istwerte sollte doch der> D-Anteil des Reglers schnell ausgleichen, bevor der I-Teil zu lange> herumintegriert.
da hast du die Rechnung ohne die Regelstrecke gemacht :-) Stelle dir
vor, du hast eine Regelung für einen Lötofen, die 300 °C konstant halten
soll. Nach dem Einschalten hat der Ofen Raumtemperatur und braucht eine
Weile, bis die Ofentemperatur in die Nähe des Sollwerts kommt. In dieser
Zeit wird der Integrator in die Begrenzung laufen, da die Heizleistung
begrenzt ist.
Gruß,
Alexander
Markus J. schrieb:> @Karl Heinz: Wenn mein Regler an die Position 150 fahren will, obwohl> nur 100 geht, habe ich doch entweder eine falsche Führungsgröße oder die> Dämpfung ist zu klein und das System schwingt zu stark.
Oder du hast eine Störgröße, die dir das System durcheinanderbringt.
Wenn, um bei diesem Beispiel zu bleiben, die Regelstrecke darin besteht
einen Stab zu balanzieren und die Tür aufgeht, woraufhin ein enormer
Luftzug deinen Stab zum Kippen bringen will und der Regeler
'beschliesst' in einem Rutsch erst mal enorm gegenzusteuern und dabei
den Schlitten mit dem Stab an den mechanischen Anschlag zu fahren, dann
passiert sowas schon mal.
Ein guter Regler kommt auch dann noch zurecht, wenn unvorhergesehene
Dinge passieren.
Das Beispiel von kbuchegg mit dem Stab und dem Schlitten ist was fuer
Machatronik Freaks. Da spielt wirklich ein grosser Teil der Auslegung
der Mechanik und Antriebe eine Rolle. Reglungstechnisch ist es genau wie
jeder andere Regler.
Das mit dem Loetofen finde ich didaktisch besser.
und dazu als Erweiterung, das Problem des Originalposters mit dem
Luefter.
Hier hat man ganz klar den Fall eines langsamen und eines schnellen
Reglers.
Was klar eine Dimensionierungsfrage ist.
Immer aber ist mein Stellglied irgendwie begrenzt und ich kann es nicht
weiter "auf|zu machen" als sein Stellbereich ist.
Wenn mein Stellglied beim Loetofen, nun "ZU" ist weil ich 0 Grad Celsius
vorgegeben habe und immer noch eine Differenz da ist, weil der Ofen
nicht so schnell abkuehlt, was wird mein I Teil wohl machen?
Er wird weiter zu machen wollen als geht. Somit summiert sich der I Teil
auf, doch mehr Zu als Zu geht nicht.
Und ganau hier muss ich begrenzen.
Das Problem stellt sich extrem beim Problem des Originalposters. Hier
soll per PWM ein Luefter den Lufstrom regeln.
Benutze ich einen uint8_t fuer die PWM und sein Wert ist sagen wir 20.
Nun soll der Regler auf null regeln. er wird (vereinfacht) -20 fordern.
In der Naechsten Runde bewegt sich die Luft aber immer noch weil der
Luefter noch nachlauft.
Also gibt er nochmal zBsp. -10 dazu, meine PWM Variable ist auf 0 weil
in der Letzten Runde 20 - 20 vorgegeben wurde.
Nun kommt 0 - 10 dazu, durch den Ueberlauf des uint8_t lauft mein
Luefter jetzt wieder hoch.
Das sollte ganz klar "begrenzt" werden.
Jup
Hallo @all!
Also, der Regler läuft jetzt und funktioniert auch tatsächlich! Ich habe
die zuvor berechneten Parameter jedoch noch etwas angepasst. Ich habe
auch, wie vorgeschlagen, eine gleitende Mittelung über jeweils 8
eingelesene AD-Werte implementiert.
Was nicht geklappt hat:
Ich hatte zunächst die Abtastzeit des Reglers auf 100ms eingestellt. Die
Totzeit des Systems liegt, wie gesagt, bei ca. 0,8s. Mit den
eingestellten 100ms geriet das System teilweise ins schwingen.
Woran könnte (ich weiß - Glaskugelfrage) das liegen?
Nun habe ich die Abtastzeit auf 1s eingestellt und es funktioniert
(stabil).
Morgen muss ich "nur noch" vom Massenstrom-Signal des Luftmassenmessers
auf den Volumenstrom umrechnen, der eigentlich gefordert ist... inkl.
Temperatur-Anpassung... (was ja dann doch, anders als ich eingangs
schrieb, einer Störgröße entspricht, oder?).
Viele Grüße & nochmal Danke an alle soweit,
Alex
Ach so: Begrenzung des I-Anteils ist auch eingebaut und war auch
definitiv nötig! Vielleicht rührt daher auch das Schwingen bei Ta =
100ms, da ich die Begrenzung erst später eingebaut hatte...
Markus J. schrieb:> Hm, das stellt mich noch nicht ganz zufrieden. ;)
Jetzt hab's ich's begriffen. War da wohl etwas merkbefreit. Und im
nachhinein ist mir meine Frage etwas peinlich. Aber ich danke euch, dass
ihr mir das trotzdem so gut erklärt habt. ;)
Alex Bürgel schrieb:> Ach so: Begrenzung des I-Anteils ist auch eingebaut und war auch> definitiv nötig! Vielleicht rührt daher auch das Schwingen bei Ta => 100ms, da ich die Begrenzung erst später eingebaut hatte...
Diese Vermutung ist durchaus wahrscheinlich.
Eine Abtastzeit die deutlich größer ist als die Zeitkonstanten des
Systems kann eigentlich nicht gut funktionieren. Insofern waren 0,1s bei
Totzeit von 0,8s und 0,4s für das PT1 Verhalten schon recht gut.
Hallo zusammen!
Nochmal vielen Dank für eure Tipps!
Im Anhang noch für diejenigen, die es interessiert, ein Bild wie der
Regler nun auf einen Sollwert-Sprung reagiert.
Es dauert ca. 10s bis der neue Wert stabil eingestellt ist.
Etwas kniffelig war es, da ich die PWM in hundertstel Prozent verändern
musste, um die geforderte Volumenstrom-Auflösung zu realisieren...
Viele Grüße,
Alex