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
  Problem mit SD Card Library BennIY 4 186 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Fehler beim Kompilieren binderj1 5 292 03.10.2016 21:27
Letzter Beitrag: hotsystems
  Fehler beim Speichern von Projekten Manni66 16 683 23.08.2016 10:05
Letzter Beitrag: hotsystems
  Problem mit SD.remove Eichner 6 210 22.08.2016 19:42
Letzter Beitrag: Eichner
  Arduino hängt beim Upload deranda 11 496 12.08.2016 21:27
Letzter Beitrag: hotsystems
  4x16 Tastermatrix Problem Michel 16 842 14.07.2016 10:02
Letzter Beitrag: StephanBuerger
  Problem mit Delay und Millis funnyzocker 1 454 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Problem mit ESP8266 und EMail senden torsten_156 1 595 13.06.2016 21:14
Letzter Beitrag: torsten_156
  Adafruit SD-master / logger shield: Fehler beim 2. Kompilieren kl-ing 3 331 06.06.2016 16:07
Letzter Beitrag: Bitklopfer
  Hilfe beim Arduino Shield reimundko 6 454 05.06.2016 11:28
Letzter Beitrag: rpt007

Gehe zu:


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