Forum: Mikrocontroller und Digitale Elektronik Wertebereich für einen PID-Regler/P-Regler


von Seppi (Gast)


Lesenswert?

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.

von spontan (Gast)


Lesenswert?

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.

von nochwas (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

> 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
von Seppi (Gast)


Lesenswert?

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?

von Lass droehnen (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von ich (Gast)


Lesenswert?

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

von nein? (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von nein? (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.