Forum: Mikrocontroller und Digitale Elektronik PID controller


von Carsten M. (ccp1con)


Lesenswert?

Hallo Leute,

Ich habe gelesen, dass der integralwirkende Regler den Vorteil hat, die 
Abweichung vollständig zu eliminieren, wenn auch langsam.
Bei meinem Regler passiert es aber andersherum. Will sagen, mit integral 
Anteil bleibt immer ein Abweichung.
Wenn ich den Code richtig deute ist das auch logisch. Denn wenn Soll = 
Ist dann Abweichung gleich null und Abweichung_Sum bleibt gleich.
Wie kann dann die Abweichung (Stellgröße) zu null werden?

Oder habe ich das Prinzip im Code nicht richtig umgesetzt?

1
        // Regelabweichung bestimmen
2
        PID_controller_X.Abweichung = PID_controller_X.Winkel_soll -PID_controller_X.Winkel_ist;
3
        // Regelabweichung aufsummieren (integrieren)
4
        PID_controller_X.Abweichung_Sum += PID_controller_X.Abweichung;
5
        // PI and D controller
6
        PID_controller_X.Stellgroesse = Kp_XYZ *PID_controller_X.Abweichung\
7
                                    +Ki_XYZ *PID_controller_X.Abweichung_Sum *dt\
8
                                    +Kd_XYZ*(PID_controller_X.Abweichung -PID_controller_X.Abweichung_Alt)/dt;
9
        // 
10
        PID_controller_X.Abweichung_Alt = PID_controller_X.Abweichung;

Danke schon mal für Eure Erleuchtungen.

von Karl H. (kbuchegg)


Lesenswert?

Carsten M. schrieb:
> Hallo Leute,
>

> Bei meinem Regler passiert es aber andersherum. Will sagen, mit integral
> Anteil bleibt immer ein Abweichung.

Das war Aussage 1


> Wenn ich den Code richtig deute ist das auch logisch. Denn wenn Soll =
> Ist dann Abweichung gleich null

Das ist Aussage 2.
Hier sagst du, die Abweichung wäre 0. In der vorhergehenden Aussage, 
sagtest du aber, du hättest eine Abweichung ungleich 0. Da kann also was 
nicht stimmen. Solange du eine Abweichung hast, tut sich auch was im 
Regler.

> und Abweichung_Sum bleibt gleich.
> Wie kann dann die Abweichung (Stellgröße) zu null werden?

Die Abweichung kann durchaus 0 sein. Aber kein Mensch sagt, dass im 
ausgeregelten Zustand die Summe (das Integral) 0 sein muss. Ganz im 
Gegenteil, die kann nicht 0 sein. Denn letzten Endes ist es diese Summe, 
die dir den Stellwert ungleich 0 erzeugt.

Ich denke dein Problem besteht darin, dass du der Summe (dem Integral) 
eine falsche Bedeutung zumisst. Ausgeregelt bedeutet nicht, dass die 
Summe aller jemals aufgetretenenn Regelabweichungen 0 sein muss. 
Genausowenig wie 'am Ziel angekommen' auch nicht bedeutet, dass das 
Integral aller vergangenen Geschwindigkeiten 0 sein muss. Denn das 
Integral über alle vergangenen Geschwindigkeiten ist der zurückgelegte 
Weg und hat damit, dass du am Ziel angelangt sinnvollerweise wieder auf 
0 Geschwindigkeit zurückschaltest physikalisch nicht viel zu tun.

von Carsten M. (ccp1con)


Lesenswert?

>Will sagen, mit integral Anteil bleibt immer eine Abweichung.

Muß richtig heißen - bleibt immer eine Stellgröße ungleich null.

von Steel (Gast)


Lesenswert?

Stell Dir vor du sitzt im Auto und willst gleichmäßig 100km/h fahren. 
Nimmst du dann den Fuß vom Gas (=Stellgröße auf 0) sobald die 100km/h 
erreicht sind? Nein, und genauso ist es bei deinem Regler.

von Steel (Gast)


Lesenswert?

Carsten M. schrieb:
>>Will sagen, mit integral Anteil bleibt immer eine Abweichung.
>
> Muß richtig heißen - bleibt immer eine Stellgröße ungleich null

Die Abweichung soll doch 0 werden, nicht die Stellgröße. Das ist also 
richtig!

von Karl H. (kbuchegg)


Lesenswert?

Carsten M. schrieb:
>>Will sagen, mit integral Anteil bleibt immer eine Abweichung.
>
> Muß richtig heißen - bleibt immer eine Stellgröße ungleich null.

Und was stört dich jetzt daran? Wenn diese Stellgröße notwendig ist, 
damit das System den ausgeregelten Zustand halten kann, dann passt das 
doch.
Wenn du mit dem Auto unterwegs bist und die vorgegebenen 100km/h 
erreicht hast, kannst du ja auch nicht das Gas komplett wegnehmen und 
dann 2 Stunden lang mit 100km/h dahinbrausen. Du wirst ein wenig Gas 
geben müssen, um den Luftwiderstand zu überwinden, der dich bremsen 
will.

Irgendwo in deinem System wird es wahrscheinlich so sein, dass etwas 
Energie verloren geht und daher die Stellgröße eben nicht 0 sein darf, 
damit das System ausgeregelt bleibt. Auch beim bestisolierten Ofen muss 
man ein wenig heizen, um die 180°C halten zu können.

von Carsten M. (ccp1con)


Lesenswert?

Ich versuche eine Neigung (Winkel) zu regeln.
Wenn Winkel null - Abweichung gleich Null - Stellgröße auch null.

Aber Abweichung_Sum ist dann nicht null und bewirkt ein Offset auf die 
Stellgröße!?

von Steel (Gast)


Lesenswert?

Wenn es einen "Offset" gibt, dann kann die Abweichung ja nicht mehr 0 
sein... Dann müsste der Integralanteil abintegriert werden und ggf. in 
die andere "Richtung" regeln.

Beschreib mal den Aufbau genauer und was ist deine Stelleinrichtung, ein 
Motor?

von Stephan (Gast)


Lesenswert?

Carsten M. schrieb:
> Aber Abweichung_Sum ist dann nicht null und bewirkt ein Offset auf die
> Stellgröße!?

Richtig.
Weil der Regler "gelernt" hat, mit welcher Stellgröße er den Winkel 
halten kann.

von Carsten M. (ccp1con)


Lesenswert?

>Wenn es einen "Offset" gibt, dann kann die Abweichung ja nicht mehr 0
sein...

Weiß nicht ... die Stellgröße geht ja erst einmal nicht in die 
Berechnung der Abweichung ein Abweichung = Soll - Ist (ok später, wenn 
sie gewirkt hat, und den Ist verändert hat, wenn!)

>Beschreib mal den Aufbau genauer und was ist deine Stelleinrichtung, ein
Motor?

Es ist (soll mal werden) ein Quattrokopter. Also sind zwei Motoren meine 
Stelleinrichtung (eine Achse).

von Power (Gast)


Lesenswert?

Carsten M. schrieb:
> Es ist (soll mal werden) ein Quattrokopter. Also sind zwei Motoren meine
> Stelleinrichtung (eine Achse).

Und wenn dein Quattrokopter den richtigen Winkel erreicht hat, dann 
möchtest du die Motore einfach abschalten?

von Horst H. (horha)


Lesenswert?

Hallo,

@Carsten M.:
Wie kbuchegg in Beitrag "Re: PID controller" 
schon geschrieben hat, es im ausgeregeltem Zustand allein der 
Integralanteil für Stellgröße verantwortlich, Proportional- und 
Differentialanteil sind dann nämlich zu 0 geworden.
Es könnte jetzt natürlich sein, dass Dein Ki_XYZ zu klein ist und die 
Summe ewig lange gebildet werden muss.

von Carsten M. (ccp1con)


Lesenswert?

@Power:
Natürlich nicht! Aber dann können die Drehzahlen konstant bleiben.
Also Stellgröße null!

von Carsten M. (ccp1con)


Lesenswert?

Hallo Horst,

aber wie kann sich die Summe verändern, wenn die Abweichung null ist.
Also ich beziehe mich immer auf meinen Code von oben (vielleicht kann ja 
mal jemand bestätigen, dass der prinzipiell richtig ist?)
Wenn Abweichung null ist bleibt Summe immer gleich und der integrale 
Teil kann nie verschwinden. (so verstehe ich das zumindest im Moment)

Danke für Eure Gedult

von Carsten M. (ccp1con)


Lesenswert?

sorry doppelt

von lowlevel (Gast)


Lesenswert?

Hi,

ich würd mal langsam machen, ein kleines almodisches Flussdiagramm 
zeichnen und online stellen damit wir mal alle vom gleichen Regelkreis 
und von den gleichen Größen reden.

Carsten M. schrieb:
> @Power:
> Natürlich nicht! Aber dann können die Drehzahlen konstant bleiben.
> Also Stellgröße null!

Das stimmt im Allgemeinen nicht. Die Stellgröße muss im ausgeregelten 
(das heißt Soll = Ist) Zustand nicht Null sein. Insbesondere der 
I-Anteil eines Reglers auch beim PID-Regler wie du ihn hast, ist nie 
Null da alle Abweichungen (also Soll - Ist) aufsummiert werden und dann 
die Stellgröße bilden. Gerade das mach den I-Anteil aus.

Also ich beziehe mich immer auf meinen Code von oben (vielleicht kann ja
mal jemand bestätigen, dass der prinzipiell richtig ist?)

Normalerweise wirkt sich bei einem PID-Regler die Verstärkung Kp auf 
alle drei Anteile aus, das ist bei dir nicht der Fall. Ansonsten handelt 
es sich um die ÜF eines PID-Reglers.

Gruß lowlevel

von lowlevel (Gast)


Lesenswert?

lowlevel schrieb:
> Also ich beziehe mich immer auf meinen Code von oben (vielleicht kann ja
> mal jemand bestätigen, dass der prinzipiell richtig ist?)

Sorry das wollte ich zitieren.

von Horst H. (horha)


Lesenswert?

Hallo,

dass ist doch das Wunder des Integralanteiles ;-)
Wie oben mit dem 100 km/h Auto beschrieben, muß man für die Überwindung 
der Fahrtwiderstände ein wenig Gas geben.Ein Tempomat würde jetzt bei 
Eerreichen der Zielgeschwindigkeit eben genau passend Gas geben und dass 
nur durch den Integralanteil.
Auch der Quadrokopter soll ja nicht abstürzen der Integralanteil 
gewährleistet den Schwebeflug.

von Carsten M. (ccp1con)


Lesenswert?

Ok mir schwant Schlimmes ... :-) Vielleicht ist ja mein Ansatz falsch.

Das System ist im Moment so aufgebaut, dass die Veränderungen der 
Motordrehzahlen die Stellgrößen sind.
Deswegen benötige und erwarte ich im ausgeregeltem Zustand eine null als 
Stellgröße.
D.h. wenn Winkel null Drehzahlen konstant.

Aber im Moment haut mir der I Anteil da immer dazwischen.
(Nur als PD-Regler scheint es besser zu gehen.)

von Power (Gast)


Lesenswert?

Carsten M. schrieb:
> @Power:
> Natürlich nicht! Aber dann können die Drehzahlen konstant bleiben.
> Also Stellgröße null!

Kommt natürlich auf deinen genauen Aufbau an (den du hier anscheinend 
nicht veröffentlichen möchtest).
Aber wie schon weiter oben mit dem Autobeispiel gezeigt: wenn du 
Drehzahl willst (schreibst du ja: "Drehzahlen konstant", aber nicht 
Null), dann musst du natürlich "Gas geben" (also Stellgröße > 0!).

Genau dafür hast du ja deinen I-Anteil! Wenn du den nicht hättest, dann 
würde dir dein PD-Regler die Motoren abstellen (Stellgröße = 0), sobald 
die Abweichung Null ist (was du ja nicht willst).

von lowlevel (Gast)


Lesenswert?

Carsten M. schrieb:
> Das System ist im Moment so aufgebaut, dass die Veränderungen der
> Motordrehzahlen die Stellgrößen sind.

Muss das sein. Du könntest dem PID-Regler ein D-Glied nachschalten. 
Inwieweit dein System dann aber noch regelt: ???

von Power (Gast)


Lesenswert?

Carsten M. schrieb:
> Das System ist im Moment so aufgebaut, dass die Veränderungen der
> Motordrehzahlen die Stellgrößen sind.
> Deswegen benötige und erwarte ich im ausgeregeltem Zustand eine null als
> Stellgröße.

Dann ist dein Aufbau eigentlich schon ein Integrator (z.B. IT1?). Wenn 
du jetzt im Regler auch noch einen Integrator hast, dann ergibt das 
einen Doppelintegrator --> ganz schlecht.

von Christian G. (christian_g83)


Lesenswert?

Carsten M. schrieb:

> Aber dann können die Drehzahlen konstant bleiben.
> Also Stellgröße null!

Das hört sich so an, als hätte die zu regelende (offene) Strecke bereits 
integrierenden Charakter. In so einem Fall reicht ein P-Regler aus, um 
eine bleibende Regelabweichung auszugleichen. Der geschlossene 
Regelkreis verhält sich dann wie eine Verzögerung 1. Ordnung (PT1).

Christian

von Karl H. (kbuchegg)


Lesenswert?

Carsten M. schrieb:
> Ok mir schwant Schlimmes ... :-) Vielleicht ist ja mein Ansatz falsch.
>
> Das System ist im Moment so aufgebaut, dass die Veränderungen der
> Motordrehzahlen die Stellgrößen sind.
> Deswegen benötige und erwarte ich im ausgeregeltem Zustand eine null als
> Stellgröße.
>
> Aber im Moment haut mir der I Anteil da immer dazwischen.

Dann stimmen aber deine Konstanten nicht.

Denn wenn deine Stellgröße nicht 0 ist, bedeutet das ja bei dir, das der 
Kopter sich um die Längsachse drehen wird. Dadurch kriegst du erst mal 
wieder eine Abweichung zustande, die die Summe in Richtung 0 treiben 
wird. Der Regler wird dann die Stellgröße etwas unterschreiten, worauf 
hin sich dein Kopter etwas in die andere Richtung neigt und die jetzt 
negative Summe wieder in positive Richtung verändert.
Die Kunst besteht jetzt darin, die Konstanten so zu finden, dass diese 
Schwingungen so winzig werden, dass man sie nicht mehr bemerkt bzw. die 
Amplitude der Schwingungen immer weiter abnimmt, bis sie de facto 0 
sind.

Ich hatte auch mal einen Regler, mit dem ich nicht klar gekommen bin, 
bis ich bemerkt habe, dass das Vorzeichen des I-Anteils genau falsch rum 
war. Anstatt die Regelabweichung zu korrigieren, hat der I-Anteil dann 
dafür gesorgt, dass sie wieder größer wurde.


> D.h. wenn Winkel null Drehzahlen konstant.

Wenn ich das richtig interpretiere, dann steckt da aber versteckt noch 
ein Integrator drinnen. Denn eigentlich müsste die Aussage heißen:
Wenn Winkel 0, dann soll der rechte Motor dieselbe Drehzahl haben wie 
der linke. Es geht also nicht um Drehzahl konstant oder nicht, sondern 
darum, dass beide Motoren dieselbe Drehzahl haben. Welche auch immer das 
dann sein mag. (Eigentlichg auch das nicht. Es geht darum, dass beide 
Motoren denselben Schub erzeugen. Dazu müssen sie nicht notwendigerweise 
gleich schnell drehen. Und schon gar nicht bedeutet das, dass beide vom 
Fahrtregler dieselbe Spannung zugeschanzt bekommen. 2 Motoren + 2 
Luftschrauben sind nie in allen Paramtern exakt gleich)



Wie genau ist dein System aufgebaut? Wie geht es nach dem PID Regler 
weiter? Worauf wirkt der Regler?

von Karl H. (kbuchegg)


Lesenswert?

Und auch nicht zu vergessen:

Wie zuverlässig ist deine Winkelermittlung?
Arbeitet deine Inertial Unit auch dann zuverlässig, wenn das System 
beschleunigt wird?

von Zacc (Gast)


Lesenswert?

Aeh... Stellgroesse null bedeutet die Motoren laufen nicht.

von Carsten M. (ccp1con)


Lesenswert?

>Genau dafür hast du ja deinen I-Anteil! Wenn du den nicht hättest, dann
>würde dir dein PD-Regler die Motoren abstellen (Stellgröße = 0), sobald
>die Abweichung Null ist (was du ja nicht willst).
Das deckt sich mit meinen Tests. Und ist genau was ich will - Abweichung 
null - Stellgröße (Drehzahländerung) null

>Dann ist dein Aufbau eigentlich schon ein Integrator
Ja das ist mir so gar nicht bewusst gewesen - ich lass den Integrator 
einfach weg.

>Muss das sein.
Nichts muss ... hat sich aber so ergeben! ;-)

>Normalerweise wirkt sich bei einem PID-Regler die Verstärkung Kp auf
>alle drei Anteile aus,
Also auch, wenn ich nur einen PD Regler habe?

>(den du hier anscheinend nicht veröffentlichen möchtest).
Wenn ich was zu Papier gebracht habe kann ich es gerne noch anhängen.
Aber im Moment ist alles nur im Kopf.

>Wie genau ist dein System aufgebaut? Wie geht es nach dem PID Regler
>weiter? Worauf wirkt der Regler?
Ich sammle Winkelgeschwindigkeit und Beschleunigung von allen drei 
Achsen (zwei sind jetzt nur von Interesse). Die errechneten Winkel jage 
ich durch einen komplementär Filter dann vergleicht der Regler Soll- und 
Ist und schickt ein Delta RPM zu den Motorkontrollern. Auf einer Seite 
eine positive und auf der anderen Seite die gleiche negative Änderung.

Ein Problem was ich im Moment auch nicht überschaue ist, dass ich vier 
verschiedene Motoren aufgebaut habe (hat sich halt so ergeben ;-).
Das sollte dem Regler doch eigentlich egal sein? Der müsste 
registrieren, dass der eine Motor aus Delta RPM mehr Schub erzeugt als 
ein anderer und müßte das ausgleichen. Hoffe ich.

Bin aber bereit noch drei andere zu kaufen, damit wird es einfacher.

>Aeh... Stellgroesse null bedeutet die Motoren laufen nicht.
Nee bedeutet Drehzahl konstant.

von Karl H. (kbuchegg)


Lesenswert?

Carsten M. schrieb:

> Ist und schickt ein Delta RPM zu den Motorkontrollern. Auf einer Seite
> eine positive und auf der anderen Seite die gleiche negative Änderung.

Das halte ich ehrlich gesagt für keine so gute Idee.
Das Problem ist nämlich, dass du davon ausgehst, dass alle Motoren, alle 
Luftschrauben, alle Motorsteller absolut gleich sind.

Was ich tun würde:
Ich würde einen Motor als den Master definieren. Dessen Drehzahl wird 
direkt vom Benutzer vorgegeben. Der Regler hat jetzt die Aufgabe, das 
Signal für einen 2.ten Motor zu generieren (bzw. so auszuregeln), dass 
sich ein bestimmter Flug-Winkel ergibt.

Vorteil: Die Motoren müssen nicht 100%-gen Gleichlauf haben. Der Regler 
gleicht das aus. Ist ein Motor ein wenig schwächer, dann gibt ihm der 
Regler ein bischen mehr Gas, so dass das gesamte Gefährt insgesamt 
wieder einen 0-Winkel behält. Der Regler hat also die technologischen 
Unterschiede der Antriebskomponenten ausgeglichen.

> Das sollte dem Regler doch eigentlich egal sein? Der müsste
> registrieren, dass der eine Motor aus Delta RPM mehr Schub erzeugt als
> ein anderer und müßte das ausgleichen. Hoffe ich.

Wie soll er das denn tun, wenn dein Stellsignal für den einen Motor 
einen Aufschlag und für den anderen Motor einen Abschlag bedeutet?
Bei deinem Konzept lautet die Grundannahme: Wenn ich in der waagrechten 
bin und beide Motorkontroller mit identischem Signal ansteuere, dann 
bleibe ich auch in der Waagrechten. Stellsignal 0 == waagrecht.
Das kann so sein, muss aber nicht.

>>Aeh... Stellgroesse null bedeutet die Motoren laufen nicht.
> Nee bedeutet Drehzahl konstant.

Was hast du nur immer damit.
Entweder versteh ich nicht, was du da wie verschalten willst. Aber 
Stellgröße 0 kann nicht bedeuten, dass die Drehzahl konstant sein soll. 
Denn der Regler weiß nicht, wie hoch die Drehzahl eigentlich wirklich 
ist. Was er aber weiß ist: Bei einem 0 Winkel will ich von beiden 
Motoren den gleichen Schub haben. Stellgröße 0 kann daher bei dir nicht 
Drehzahl konstant heißen sondern 'beide Motoren auf gleicher Drehzahl'

Aber wie schon ausgeführt, würde ich das nicht so machen. Ich würde die 
Stellgröße definieren als: Drehzahl vom Motor B. Der Regler hat dann die 
Aufgabe die so anzupassen, dass sich eine waagrechte Fluglage ergibt, 
wenn ich mit Motor A das Teil in die Höhe ziehe.

von Simon K. (simon) Benutzerseite


Lesenswert?

Die Übliche Vorgehensweise bei Quadrokoptern ist, dass der Ausgang der 
Lageregler auf einen Mischer gegeben wird. Sodass aus 
Nick/Rollwinkel/Yaw und Gas das Signal auf vier einzelne (absolute) 
Motorwerte aufgeteilt wird.

von Simon K. (simon) Benutzerseite


Lesenswert?

Hier z.B. aus meinen eigenen Quellen:
1
gVars.Mixer.MotorFront = Throttle - Nick - Yaw;
2
gVars.Mixer.MotorRear = Throttle + Nick - Yaw;
3
gVars.Mixer.MotorLeft = Throttle - Roll + Yaw;
4
gVars.Mixer.MotorRight = Throttle + Roll + Yaw;

Throttle ist der Gaswert vom Knüppel,
Nick, Roll und Yaw sind die Ausgänge der Regler.

EDIT: Das ändert natürlich nichts am Problem. Auch bei mir sind die 
Stellwerte für Nick, Yaw und Roll nicht 0, wenn der Quadrokopter in 
Schwebe war. Das konnte mich mittels BTM222 feststellen.

von Carsten M. (ccp1con)


Lesenswert?

>Stellgröße 0 kann nicht bedeuten, dass die Drehzahl konstant sein soll.
>Denn der Regler weiß nicht, wie hoch die Drehzahl eigentlich wirklich
>ist.

Bestimmt übersehe ich was ...

Aber Stellgröße null bedeutet Ist-Winkel = Soll. Also kein Grund zu 
regeln - egal welche Drehzahlen die Motoren haben!? Deswegen kein delta 
RPM.

Eigentlich kümmere ich mich gar nicht um Drehzahlen.
Es heißt bloss mehr oder weniger Schub (links oder rechts).

von Carsten M. (ccp1con)


Lesenswert?

@Simon
Für mich sieht es so aus, als ob Du damit nur Steigen und Sinken kannst.
Wie leitest Du denn fliegen nach links oder rechts ein?
Ich dachte das geht über einen Anstellwinkel?
Oder ist der geforderte Winkel schon in den Reglerwerten enthalten?

von Simon K. (simon) Benutzerseite


Lesenswert?

Carsten M. schrieb:
> @Simon
> Für mich sieht es so aus, als ob Du damit nur Steigen und Sinken kannst.
> Wie leitest Du denn fliegen nach links oder rechts ein?
> Ich dachte das geht über einen Anstellwinkel?
> Oder ist der geforderte Winkel schon in den Reglerwerten enthalten?

Der geforderte Winkel geht zusammen mit der Regelabweichung der IMU 
(Inertial Measurement Unit) in den Lageregler ein. Der Ausgang 
(Stellgröße) geht dann auf den Mixer.

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.