INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Windup-Problem beim Arduino-PID
08.12.2014, 22:23
Beitrag #1
Windup-Problem beim Arduino-PID
Bei der Peltier-Regelung mit dem Arduino-PID tritt das Integral-windup auf. Aber in der Library steht doch if(ITerm > outMax) ITerm = outMin;HuhHuhHuhHuh
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2014, 10:55
Beitrag #2
RE: Windup-Problem beim Arduino-PID
Hallo Cray,

guck mal hier: http://www.maelabs.ucsd.edu/mae156alib/c...rdunio.pdf auf Seite2 . Da steht im Abschnitt integral term:
Zitat:The scheme shown in the code above is to “zero out” the integral term unless the error is sufficiently small.
Siehe dann auch den Code darüber:
Code:
if (abs(Error) < IntThresh){ // prevent integral 'windup'
Integral = Integral + Error; // accumulate the error integral
} else {Integral=0;} // zero it if out of bounds
Da sollte doch dein Problem betreffen ?
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2014, 10:58 (Dieser Beitrag wurde zuletzt bearbeitet: 09.12.2014 11:49 von Cray-1.)
Beitrag #3
RE: Windup-Problem beim Arduino-PID
(09.12.2014 10:55)rkuehle schrieb:  Hallo Cray,

guck mal hier: http://www.maelabs.ucsd.edu/mae156alib/c...rdunio.pdf auf Seite2 . Da steht im Abschnitt integral term:
Zitat:The scheme shown in the code above is to “zero out” the integral term unless the error is sufficiently small.
Siehe dann auch den Code darüber:
Code:
if (abs(Error) < IntThresh){ // prevent integral 'windup'
Integral = Integral + Error; // accumulate the error integral
} else {Integral=0;} // zero it if out of bounds
Da sollte doch dein Problem betreffen ?
Grüße Ricardo
Schon klar,
aber wieso ist das nicht im PID von Arduino?
Das sind die Zeilen aus der Library:
ITerm+= (ki * error);
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
double dInput = (input - lastInput);

Gruß
Cray-1

Ich check das nit. Laut einigen Quellen im Internet hat er das in der Library:

void PID::SetOutputLimits(double Min, double Max)
{
if(Min >= Max) return;
outMin = Min;
outMax = Max;

if(inAuto)
{
if(*myOutput > outMax) *myOutput = outMax;
else if(*myOutput < outMin) *myOutput = outMin;

if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
}
}

Vielleicht ist es ja kein Windup-Problem: Wenn ich zuerst 30 Grad fahre dann höher auf 80, alles funktioniert. Gehe ich dann aber auf Null und von da aus auf 20 läuft er einfach hoch auf 30.

Gruß
Cray-1
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2014, 11:51
Beitrag #4
RE: Windup-Problem beim Arduino-PID
Die Unterschiede zwischen dem Code aus der PDf und
Code:
ITerm+= (ki * error);
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
würde ich so interpretieren:
1. IntThresh im PDF-Dokument ist nicht outMin bzw. outMax, sondern ein Testwert den man selbst festlegen muss, der noch innerhalb der Grenzen zwischen outMin / outMax liegt.
2. Ist die aktuelle Abweichung im PDF größer als der Testwert IntThresh, wird das Integral auf 0 gesetzt, ansonsten aufaddiert. Hier wird also die aktuelle Abweichung bewertet und das Integral gesetzt.
Im Lib-Auszug wird jedoch das Integral bei überschreiten der Grenzen auf den positiven / negativen Grenzwert gesetzt. Hier wird also das Integral bewertet und dann gesetzt.
Grüße RK
PS: Ich habe aber nicht wirklich Ahnung vons ganze, sorry. Huh

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2014, 11:55
Beitrag #5
RE: Windup-Problem beim Arduino-PID
(09.12.2014 11:51)rkuehle schrieb:  Die Unterschiede zwischen dem Code aus der PDf und
Code:
ITerm+= (ki * error);
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
würde ich so interpretieren:
1. IntThresh im PDF-Dokument ist nicht outMin bzw. outMax, sondern ein Testwert den man selbst festlegen muss, der noch innerhalb der Grenzen zwischen outMin / outMax liegt.
2. Ist die aktuelle Abweichung im PDF größer als der Testwert IntThresh, wird das Integral auf 0 gesetzt, ansonsten aufaddiert. Hier wird also die aktuelle Abweichung bewertet und das Integral gesetzt.
Im Lib-Auszug wird jedoch das Integral bei überschreiten der Grenzen auf den positiven / negativen Grenzwert gesetzt. Hier wird also das Integral bewertet und dann gesetzt.
Grüße RK
PS: Ich habe aber nicht wirklich Ahnung vons ganze, sorry. Huh
Danke,
könntest Du mir bei der Programmierung der Zustände noch helfen?

Gruß
Cray-1
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2014, 12:17
Beitrag #6
RE: Windup-Problem beim Arduino-PID
Hi RK,
ich habe ein bisschen praktische Erfahrung mit PID-Reglern, da ich meine Vorlauftemperatur so steuere.
Das hier ist das korrekte Coding für Anti-Windup:
(09.12.2014 11:51)rkuehle schrieb:  
Code:
ITerm+= (ki * error);
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;

Das mit dem IntThresh ist meiner Meinung nach was anderes: Wenn man ein langsames System hat und eine Änderung des Sollwerts (oder sprunghafte Änderung des Istwerts), dann hat man erstmal einen großen Unterschied von Soll und Ist. Ein PID-Regler reagiert hier mit einem großen Ausschlag, wenn aber das System langsam ist (wie bei einer Heizung), dann dauert es trotzdem seine Zeit, bis der Istwert sich wirklich ändert. Dadurch geht der I-Wert auch immer weiter hoch. Wenn dann Ist und Sollwert wieder nah beieinander sind, dann ist der I-Wert zu hoch (d.h. das System würde immer noch heizen), was zum Überschwingen führt.
Das wird durch das mit dem IntThresh meiner Meinung nach abgefangen.
Allerdings ist das Vorgehen nicht ganz richtig: Ich würde das Integral nicht auf Null setzen, sonder einfach bei zu großen Abweichungen nicht mehr aufaddieren. (Dabei muss man natürlich davon ausgehen, dass der P-Wert alleine es schafft, die Regelabweichung in genügendem Maße auszugleichen.)

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2014, 17:21
Beitrag #7
RE: Windup-Problem beim Arduino-PID
Hallo Thorsten,
danke für die (für mich als unwissenden) nachvollziehbare Erklärung.
Im PDF ist auch eher die Rede von einer sehr großen Abweichung beim Start des Systems.
Die Frage bleibt: Warum hat Cray dann solche Probleme?
Man könnte sie wohl beantworten wenn man genau wüsste was er an Code hat und (ich glaube das ist ist auch wichtig) ob es ein langsames System (im Sinne deiner Auführung) ist,wie schnell sich der Sollwert ändern kann und wie schnell der Istwert an den Sollwert herangebracht werden muss. Oder liege ich da völlig daneben Huh
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 590 29.04.2017 14:29
Letzter Beitrag: hotsystems
Question Problem beim Hochladen auf AtTiny45. Hilfe -.- Jonas Lindenblatt 17 798 16.04.2017 12:58
Letzter Beitrag: Jonas Lindenblatt
  ESP8622 - 01 sendet UDP - Problem WLan Kriskind 37 2.939 14.03.2017 19:49
Letzter Beitrag: Tommy56
  Interrupt beim ESP8266 dost0011 9 687 08.03.2017 14:32
Letzter Beitrag: Tommy56
  Smart Home Webserver Basic Authentication Problem Osotastic 21 761 20.02.2017 18:00
Letzter Beitrag: Tommy56
  Problem mit Sketch senden an Uno feuerwehr 5 586 31.01.2017 20:41
Letzter Beitrag: Tommy56
  Arduino hängt beim Upload deranda 14 1.061 20.01.2017 16:14
Letzter Beitrag: renid55
  Led Impuls beim Taster betätigen clemens5555 11 555 17.01.2017 20:00
Letzter Beitrag: renid55
  Beim Hochladen USB Problem Nils 10 906 29.12.2016 21:05
Letzter Beitrag: renid55
  Fehler beim Hochladen steyr 24 1.184 16.12.2016 07:52
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste