Python PID Regler

Regelungen werden überall benötigt, wo Werte kontrolliert und angepasst werden müssen. Es gibt einfache Min Max Regler. Ein etwas komplexerer Regler ist der PID Regler. Dieser wird unter Anderem in der Temperaturregelung von Brausteuerung oder 3D-Druckern verwender, sowie bei der Lagekorrektur von Quadcoptern. Ich will und kann hier keine tiefergehende Erklärung für den PID geben. In diesem Artikel wollte ich nur eine kleine Testsofware dafür bereitstellen.
Prinzipiell ist es so, dass in gleichenZeitabständen eine Messung gemacht wird und damit der Ist-Wert bestimmt wird. Davon wird die Abweichung zum Soll-Wert bestimmt, der Fehler bezeichnet wird. Auf diesen fehler reagieren nun die drei Teile des PID Reglers. Das erste Regelungsglied P ist der Proportional Regler. Dieser reagiert direkt auf den Fehler. Je höher die Abweichung ist, desto grösser die Regelung. Dieser alleine neigt nun sehr stark zum Überschwingen und erreicht nie ganz den eigentlich Sollwert.
Dazu gesellt sich das D, Differential-Glied. Dies regelt danach, wie schnell sich der Fehler ändert und damit die Stärke der Abweichung und regelt dementsprechend stärker dagegen. Das Gedächtnis des Reglers ist das I, Integrations-Glied. Dies ist ein Aufsummierung der Fehler aus der Vergangenheit innerhalb eines Zeitintervalls. Die Summe aller P, I und D ergibt die Stellgrösse.

In der Besipielkurve soll ausgehend vom Wert 20 der Wert 0 erreicht werden.

Mit Hilfe des Pyhon Codes unten kann das Verhalten des PID Wertes verfolgt werden. Die Gewichte der einzelnen Regeler wird über kp, kd und ki bestimmt. Je kleiner diese sidn, desto langsamer wird der Soll-Wert erreicht, je kleiner, desto genauer.

#!/usr/bin/python3
#------------------------------------------------------------------------------
# Python 3.4.3
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# includes
#------------------------------------------------------------------------------
import os
import sys
#------------------------------------------------------------------------------
class myPID :
  dt  = 0.0
  max = 0.0
  min = 0.0
  kp  = 0.0
  kd  = 0.0
  ki  = 0.0
  err = 0.0
  int = 0.0
  def __init__(self, dt, max, min, kp, kd, ki) :
    self.dt  = dt
    self.max = max
    self.min = min
    self.kp  = kp
    self.kd  = kd
    self.ki  = ki
  def run(self,set,act) :
    error = set - act;

    P = self.kp * error;

    self.int += error * self.dt;
    I = self.ki * self.int;

    D = self.kd * (error - self.err) / self.dt;

    output = P + I + D;

    if output > self.max :
        output = self.max
    elif output < self.min :
        output = self.min

    self.err = error;
    return(output);

#------------------------------------------------------------------------------
def main() :
  pid = myPID(0.1, 100, -100, 0.1, 0.01, 0.5)

  val = 20;
  for i in range(100) :
    inc = pid.run(0, val)
    print('val:','{:7.3f}'.format(val),' inc:','{:7.3f}'.format(inc) )
    val += inc
#------------------------------------------------------------------------------
main()
#------------------------------------------------------------------------------

Links:
https://www.mikrocontroller.net/topic/217792

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.