Ich versuche gerade einen PID-Regler zu erstellen bzw.
zu verstehen, wie er funktioniert.
Vorsicht: Blutiger Anfänger!!!
Dabei fand ich z.B. die folgende Seite sehr hilfreich:
http://www.rn-wissen.de/index.php/Regelungstechnik
Beim PID-Regler benutze ich folgende Formeln:
esum = esum + e
y = Kp * e + Ki * (Ta) * esum + Kd * (e - ealt) / (Ta)
Zusätzlich eine Beschränkung von y im Wertebereich,
wie es auch auf der Seite angegeben ist, zwischen -255 und +255.
Um es am Anfang einfacher zu machen, nehme ich Ki=0 und Kd=0,
wodurch der PID-Regler zum P-Regler wird:
y = Kp * e
Kp z.B. den Wert 61 (auch aus einem Beispiel der Seite).
Wie muss ich denn den Wert e in den Regler geben?
Es ist soweit ich verstanden habe:
e = Sollwert - Istwert
Gibt es da irgendeinen Bereich z.B. [-x;+x], symmetrisch um Nullpunkt,
oder kann ich z.B. auch [-12345;12345] nehmen?
Ist es ratsam, den Bereich vorher auf [-1;+1] umzurechnen?
Kann man da Integer verwenden oder sind Festkommazahlen ratsam?
Vor allem auch in Bezug auf Größe der Variablen, ob jetzt
z.B. 16 oder 32 Bit Variablen.
Wie kommt denn x in Deinen µC?
Da gibt es doch schon eine Beschränkung der Werte.
y willkürlich beschränken ist richtiger Blödsinn. y ist der Ausgabewert,
der geht über irgendeinen Weg wieder aus dem µC raus.
Der Weg beschränkt automatisch den Wertbereich.
Man nimmt natuerlich Integer, auf keinen Fall Float. Ohne etwas
einzuschraenken nimmt man 32 bit signed. Dann kann man mit 24Bit ADCs
auch rechnen. Aber 16 bit signed ist auch moeglich.
Ich rechne jeweils alles mit 32bit signed und skaliere am Schluss wieder
runter auf den benoetigten Ausgabebereich
> Wie muss ich denn den Wert e in den Regler geben?> Es ist soweit ich verstanden habe:> e = Sollwert - Istwert> Gibt es da irgendeinen Bereich z.B. [-x;+x], symmetrisch um Nullpunkt,> oder kann ich z.B. auch [-12345;12345] nehmen?
Du hängst zu sehr daran, dass dir irgendwer irgendwelche Zahlen vorgibt.
Du nimmst das, was du hast.
Wenn du eine Temperatur regeln willst, dann ist dein Sollwert vielleicht
65°C und die gemessene Temperatur sei 28°C. Dann ist dein Fehlerwert e
gleich
1
e = Sollwert - Istwert
2
3
e = 65 - 28
4
5
e = 37
Misst du die Temperatur zb, mit dem ADC und misst du mit dem ADC einen
Wert von 354 und ist dein Sollwert 756 (weil du dir die Solltemperatur
in ADC Einheiten umgerechnet hast, dann ist dein e eben
1
e = 756 - 354
2
e = 402
Genauso in der anderen Richtung.
Aus besagtem Temperaturregler kriegst du einen y Wert raus. Was auch
immer der sein mag. Das mag vielleicht die PWM-Steuerung einer Heizdecke
sein, der du Werte von 0 bis 100 (weil das Prozent der Heizleistung
sind) übergibst und die dann entsprechend stark heizt. Vielleicht ist
das aber auch ein Wert von 0 bis 255, weil du da einen 8 Bit PWM Wert
direkt vorgibst. Möglicherweise ist das auch nur ein Wert von 0 bis 3,
weil die Heizdecke nur 4 Heizstufen hat.
Du nimmst was du hast.
Das eine (den Input bzw. das was sich daraus ergibt) in das zu
überführen, was dann letzten Endes wieder raus geht, diese Umrechnung
steckt im Kp drinnen. Daher ist es auch Blödsinn zu sagen: ich nehm 61,
weil ich das so gelesen habe. Das Kp wird an DEIN System angepasst, und
das was reinkommt bzw. rausgeht.
Tut mir leid, wenn dir diese Antwort nicht gefällt.
Aber ein PID Regler ist kein Modul, dass man einfach so vom Projekt A
zum Projekt B übernimmt und dann arbeitet der in der neuen Umgebung auf
Anhieb optimal. Die 'Güte' eines PID-Reglers steckt in den Kp, Ki, Kd
Werten (sowie den Anti-Windup Grenzen) und die sind vom konkreten System
abhängig. Sowohl von den Zahlenbereichen dieses konkreten Systems als
auch dessen Verhalten.
Erst einmal vielen Dank für all eure Antworten!
Mein Eingangsignal Soll und Ist haben jeweils 32 Bit
(jedoch nur 18 - 22 Bits benutzt).
e=Soll-Ist
liegt auch im Bereich von 18 - 22 Bits.
Ausgangssignal ist 16 Bits.
Daher müsste Kp so im Bereich (nur ganz grobe Angabe)
1/(2^6) liegen, dass ich die Eingabe 22 Bits
auf die Ausgabe mit 16 Bits bekomme?
Wie komme ich da um float herum?
Kp (als Integer) auf 1/64 geht nicht, da dann 0.
Alles vorher um 6 Bits (oder noch mehr) schieben,
damit Kp in der Rechung ganzzahlig wird?
Oder macht man dies anders?
Man sollte sich von kp und solchem Zeug loesen. Nimm eine konstante
Variable, im 32 bit bereich. Der Fehler wird damit multipliziert und
nachher wieder geschoben so dass es passt. Die konstante Variable ist
insofern variabel, dass man sie per UART oder so veraendern kann.
Seppi schrieb:> Daher müsste Kp so im Bereich (nur ganz grobe Angabe)> 1/(2^6) liegen, dass ich die Eingabe 22 Bits> auf die Ausgabe mit 16 Bits bekomme?
Es spricht nichts dagegen, dass du den Wert für Kp zb immer mit einem
Faktor 256 zu groß eingibst, und dann im PID Regler in der Ausgangsstufe
grundsätzlich noch durch 256 dividierst.
Auch kann man sich fragen, wie sinnvoll die Eingangswerte bzw. ein
Fehler in der Größenordnung von 22 Bit sind/ist. Was repräsentieren denn
diese Werte physikalisch? Immerhin ist das so genau, dass eine Änderung
von 1 an diesem Wert einem Fehler von 1mm auf der Strecke Wien-Salzburg
entspricht. Wenn man das einem Positionsregler als 'sehr großer Fehler'
verkauft und erst bei einem Fehler unter 10 Meter auf die tatsächlichen
Fehlerwerte übergeht (und damit drastisch reduzierter Bitzahl), dann
wird der nicht besser/schlechter die Position auf der Autobahn finden
bzw. halten, als wie wenn man mit dem tatsächlichen Fehlerwert arbeitet.
Lass droehnen schrieb:> Man sollte sich von kp und solchem Zeug loesen. Nimm eine konstante> Variable, im 32 bit bereich.
...die man dann z.B. "kp" nennt.
Aber wozu "kp" und solches Zeugs. Reglerparameter braucht doch kein
Mensch, erst recht das blöde "ki" und "kd" nicht. Wer sich sowas
ausgedacht hat, nee nee.
;-)
Der Vorteil von zu grossen Werten ist, dass ein Integrator dann langsam
weiterlaeuft, waehrend er bei abgesaegten Bits eben Null hat und nicht
mehr weiterlaeuft.
nein? schrieb:> Der Vorteil von zu grossen Werten ist, dass ein Integrator dann langsam> weiterlaeuft, waehrend er bei abgesaegten Bits eben Null hat und nicht> mehr weiterlaeuft.
Die Frage ist, ob du bei derartig großen Fehlerwerten den Integrator
überhaupt aufsummieren lassen willst. Denn diese Aufsummierung muss
irgendwann ja auch wieder rückgängig gemacht werden, damit der Regler
eingeschwungen ist.
Um beim Beispiel zu bleiben:
Den Regler in meinem autonomen Auto interessiert es nicht weiter, ob ich
in Wien 1mm näher oder weiter entfernt von der Zielposition im 250km
entfernten Salzburg bin. Denn mehr als Vollgas kann er sowieso nicht
geben. Die Entfernung wird erst dann interessant, wenn ich mich bis auf
1000m dem Ziel genähert habe. Bis dahin kann ich so tun, als ob ich
ständig 1001m vom Ziel entfernt wäre (alles größer als 1001 wird zu
1001) und den Regler machen lassen. Denn auch bei 1000m Entfernung gibt
er bereits Vollgas, weil die Abweichung so groß ist, dass der P-Anteil
volle Pulle Gas gibt.
So gesehen schenkt sich das nichts. Aber: ich hab es plötzlich mit
kleineren Zahlen in den Fehlertermen zu tun.
(alle Zahlen sind Hausnummern. Es geht um die prinzipielle Überlegung)