Forum: Mikrocontroller und Digitale Elektronik Digitaler Regler: Anti-Windup


von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

wir waren grade am Diskutieren über digitale Regler und wie man nun den 
Anti-Windup richtig implementiert.

Nehmen wir mal an, das Stellglied hat eine Sättigung bei +/-5. Dann habe 
ich folgendes geschrieben in Matlab:
1
% i anteil mit trapezregel
2
i = iold + KP / TI * (e + eold) / 2 * T;
3
iold = i; 
4
5
% d anteil
6
d = KP * TD * (e - eold) / T;
7
8
% für den nächsten schritt fehler speichern
9
eold = e;
10
11
% ausgang zum stellglied
12
y = KP * e + i + d;
13
14
% anti windup
15
if (y < -5)
16
  iold = -5 - KP*e - d;
17
elseif (y > 5)
18
  iold = 5 - KP*e - d;
19
end

Die Formel für den Antiwindup habe ich aus dem Bild im Anhang. Warum 
aber soll man das so machen? geht
1
% i anteil mit trapezregel
2
i = iold + KP / TI * (e + eold) / 2 * T;
3
% man beachte: i wird nicht in iold gespeichert
4
5
% d anteil
6
d = KP * TD * (e - eold) / T;
7
8
% für den nächsten schritt fehler speichern
9
eold = e;
10
11
% ausgang zum stellglied
12
y = KP * e + i + d;
13
14
% anti windup
15
% i anteil nur speichern, wenn nicht übersteuert
16
if (y > -5) && (y < 5)
17
  iold = i;
18
end

nicht auch? Meine Überlegung war, dass ich den I-Anteil nur dann weiter 
aufintegriere, wenn das Stellglied nicht am Anschlag ist.

Bin mal gespannt :-)

Gruss

von Karl H. (kbuchegg)


Lesenswert?

Tobias Plüss schrieb:

> nicht auch? Meine Überlegung war, dass ich den I-Anteil nur dann weiter
> aufintegriere, wenn das Stellglied nicht am Anschlag ist.

Du vermischt da jetzt 2 Dinge.

Zum einen hast du eine wie auch immer geartete Begrenzung durch das 
Stellglied. Mehr als auf Anschlag fahren geht nun mal nicht. Wenn ein 
Fenster offen ist, dann ist es offen, egal ob die Steuerung den 
Fensterflügel gerne noch mal um 720° weiter offnen würde.

Das andere ist die Begrenzung des Integralsanteils.
Denn dadurch, dass du das Stellglied begrenzt, kann der Fehler erst mal 
nicht so schnell zurückgehen wie die Regelung das gerne hätte. Durch das 
Aufsummieren des Fehlers wird die Summe aber immer größer und größer. 
Das wäre noch nicht das große Problem, aber: die Summe muss ja auch 
wieder kleiner werden, wenn dann die Wirkung des Stellgliedes zu greifen 
anfängt. Denn die Regelabweichung wird dann ja wieder kleiner. Nur: Die 
Summe der vorhergehenden Regelabweichungen ist immer noch astronomisch 
hoch und diese Summe wird auch nicht wesentlich kleiner, eben weil sie 
so hoch ist. Mit der Folge, dass die Regelung dann enorme Ausschläge in 
die Gegenrichtung macht, damit sie die Summe wieder runterbringt. Was 
dann insofern kontraproduktiv ist, als dann das System in die andere 
Richtung ausbricht.


Beispiel:
Du möchtest eine Kurve fahren. Die Hersteller des Autos haben eine 
Begrenzung des Stellgliedes gemacht. D.h. ab einem bestimmten Winkel 
nimmt der Einschlag der Räder nicht mehr zu. Das ist auch gut so.
Aber sie haben vergessen, den Integralteil der Regelung zu begrenzen. 
Der da wäre: du kannst an deinem Lenkrad 200 Umdrehungen machen, ohne 
gebremst zu werden. Die Räder werden zwar irgendwann nicht mehr 
mitgenommen (weil 'Begrenzung des Stellgliedes') aber drehen am Rad 
darfst du soviel du willst.

Was wird passieren:
Du lenkst in eine Kurve ein. Blöderweise möchtest du die Kurve noch 
enger haben, also drehst du nach links. Die Räder gehen aber nicht mehr 
mit. Du drehst weiter am Lenkrad und weiter und weiter und weiter. Du 
hast schon 100 Umdrehungen am Lenkrad, möchtest die Kurve noch enger 
ziehen, was aber nicht geht, weil die Räder das nun mal nicht mehr 
können.
Soweit so gut. Jetzt wird die Strasse wieder gerade und du musst aus der 
Kurve raus. Die Räder stehen vielleicht nur um 30° verdreht. Aber du 
musst jetzt erst mal die 100 Umdrehungen, die du am Lenkrad gemacht hast 
wieder rückgängig machen, bis du das alles wieder aufgelöst hast und die 
Radanlenkung wieder 'am Lenkrad hängen' hast.

Daher: es reicht nicht, den Radeinschlag zu begrenzen. Du musst auch 
dafür sorgen, dass der INtegralteil nicht über alle Massen wachsen kann. 
Denn das muss ja irgendwann auch alles wieder aufgelöst werden!

von Amateur (Gast)


Lesenswert?

Ich wäre immer vorsichtig, wenn die "else" vor die Tür gesetzt wird.

In Wirklichkeit wirkt:
1
if (y < -5)
2
  iold = -5 - KP*e - d;
3
elseif (y > 5)
4
  iold = 5 - KP*e - d;
5
end
wie:
1
if (y < -5)
2
  iold = -5 - KP*e - d;
3
elseif (y > 5)
4
    iold = 5 - KP*e - d;
5
  else
6
    iold = i; 
7
end
durch die am Anfang stehende Anweisung: "iold = i;"

Bei:
1
if (y > -5) && (y < 5)
2
  iold = i;
3
end
bleibt iold im Zweifelsfalle undefiniert sonst iold=iold.

Große Korrekturwerte sind insbesondere beim Einschalten bzw. Start 
"normal". iold bleibt in diesem Falle beim Initialwert - was auch immer 
das ist.

: Bearbeitet durch User
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.