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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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)
:
Bearbeitet durch User
Ja. solange das Stellglied im Anschlag ist, muss der Integrator nicht laufen. Das macht man ueblicherwise auch so.
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.