2015-11-16 1 views
6

Ich bin mir nicht ganz sicher, ob dies der richtige Ort ist, um das zu fragen. Nun, es ist ein Programmierproblem nehme ich an.Warum bewirkt ein niedrigeres Delta, dass sich mein PID-Regler mit geringerer Genauigkeit anpasst?


Ich versuche, eine einfache PID-Controller-Simulation in Java zu erstellen.

Kurz gesagt, gibt es einen Zielwert und einen aktuellen Wert. Der aktuelle Wert wird durch eine Zahl geändert. Sie geben dem PID-Regler den aktuellen Wert und er wird versuchen, eine Zahl in der Hoffnung zurückzugeben, dass eine solche Zahl den aktuellen Wert dem Sollwert annähern wird. Überstunden, je mehr Sie den PID-Regler verwenden, wird er "lernen" (unter Verwendung von Integralen und Ableitungen) und wird schließlich immer genauere Werte zurückgeben. Dies ist zum Beispiel nützlich, um das Gleichgewicht eines Bootes durch Steuern der Radbewegung aufrechtzuerhalten.

Die von einem PID-Regler verwendete Formel ist ziemlich allgemein und ziemlich geradlinig - oder so dachte ich. Im folgenden Beispiel wird der vom PID-Controller zurückgegebene Wert einfach zum aktuellen Wert hinzugefügt. Ich gehe davon aus, dass es mit komplexeren Anwendungen (Multiplikation oder Division usw.) funktionieren würde. Das ist mein Programm:

public class PID { 

    private static double Kp = 0.1; 
    private static double Kd = 0.01; 
    private static double Ki = 0.005; 

    private static double targetValue = 100.0; 
    private static double currentValue = 1.0; 

    private static double integral = 0.0; 
    private static double previousError = 0.0; 

    private static double dt = 0.5; 

    private static double max = 5; 
    private static double min = -5; 

    public static void main(String[] args) throws Exception { 
     while (true) { 
      Thread.sleep((long) (1000.0 * dt)); 
      double error  = targetValue - currentValue; 
      double derivative = 0.0; 
      double output  = 0.0; 
      integral = integral + error * dt; 
      derivative   = (error - previousError)/dt; 
      output    = Kp * error + Ki * integral + Kd * derivative; 
      previousError   = error; 
      if (output > max) output = max; 
      if (output < min) output = min; 

      // Apply the output to the current value: 
      System.out.println(currentValue + " + " + output + " = " + (currentValue + output)); 
      currentValue += output; 
     } 
    } 

} 

Wenn Sie dies ausführen, werden Sie sehen, dass der PID-Regler steuert schließlich der aktuelle Wert zu verursachen sehr, sehr nahen Wert auf das Ziel zu sein.

Es ist ziemlich cool. Jetzt wollte ich meine Ergebnisse ein wenig schneller sehen (weil ich eine Art interaktives Diagramm erstellen möchte), also entschied ich mich, das Delta dt zu 0.1 zu ändern.

Leider ist der resultierende Wert nicht mehr in der Nähe von 100! Jetzt scheint es zu erreichen 105 und dann, sehr langsam, verringern auf 100. Das ist nicht gut!

Stellen Sie sich nun vor, Sie hätten dt unter 0.01! Jetzt ist es extrem langsam, 102 zu erreichen, und jetzt geht es nicht mehr auf 100 zurück, jetzt wächst es einfach weiter!

Also meine Frage ist: Warum verursacht ein niedrigeres Delta dies?

Mein Code basiert auf this PDF document und sie verwenden 0.01 ganz gut.

+0

Ich denke, Ihre Fragen passen zu dieser [Website] (http://math.stackexchange.com/search?q= [Steuerelement-Theorie] + PID + Controller) mehr. – user3707125

Antwort

1

es ist sehr einfach, Sie erhalten eine integrale windup.

See, „integral“ wird in wachsen nicht beschränkt, sondern Sie begrenzen die Wirkung des Ausgangs in Reichweite sein [-5, 5]

Es gibt viele Lösung, mein Dump fix zwischen integral zu begrenzen min und max.

mit dieser fix Es gibt kein überschritt größer als eine Stelle mit einer Schleifenzeit von 0,5, 0,1 und 0,01 (aber auch Begrenzungs Derivat)

Limiting Derivat fix sein kann, den gleichen Trick verwendet, um „Derivat zu verhindern, kick ": Verwenden Sie den Unterschied zwischen Präzedenzwert und Istwert anstelle des Unterschieds zwischen Fehler. Achten Sie darauf, dass Sie auch das Zeichen invertieren müssen

Aber wenn Sie eine PID mit dt eines beliebigen Wertes so schnell wie möglich simulieren müssen, kommentieren Sie einfach den Schlaf!

+0

Wenn ich den Wert von 'Integral' zwischen -5 und 5 begrenze, wird der Controller nur '5.0' und dann '-4.9999 ... 'ausgeben, wodurch der Wert zwischen' 100 'und' 95 ' – Voldemort

+1

wechselt bitte an den Code? Was verwendest du? – Lesto

+0

'dt = 0.01' und ich fügte nach der Einstellung des Integrals einfach 'if (Integral> Max) Integral = Max;' und 'if (Integral Voldemort

0

Wenn Sie Ihr Delta (dt) ändern, ändern Sie nur die Abtastung des Systems. Es sollte die Verhaltensweise nicht zu sehr für ein langsames System ändern, aber Ihre Systemantwortsimulation ist für eine sehr schnelle (die Ausgabe geht sofort zur Eingabe, während es im wirklichen Leben Verzögerungen gibt). Die Abtastfrequenz (oder Delta-Zeit) stört also das Verhalten der PID, weil das System auch schneller antwortet.

Achten Sie auch, dass die Gleichung

currentValue +=output 

Ihr System macht verhalten sich als integrativer ein, die nicht das Verhalten eines Bootes steuern Rad ist, zum Beispiel. Das ist der Grund, warum es lange dauert, das Überschwingen wiederherzustellen.

Wirkliche Leben PIDs haben einige andere wichtige Behandlungen, wie Anti-Windup, Derivat-Filter usw. Ich denke auch, dass die Seriengleichung einfacher zu verstehen und manuell zu tunen ist. Die Seriengleichung ist auch der ISA-Standard und die am häufigsten verwendete Gleichung in kommerziellen Geräten.

Verwandte Themen