pid — Proportional-Integral-Derivativ-Regler

Das Modul pid stellt eine einfache Klasse für einen Proportional-Integral-Derivativ-Regler (PID) mit Tiefpassfilterung des Differenzialterms und Begrenzung des Integrator-Windups bereit.

Beispiel:

from pid import PID

pid1 = PID(p=0.07, i=0, imax=90)
while True:
    error = 50  # error should be calculated as: target - measure
    output = pid1.get_pid(error, 1)
    # control value with output

class PID

class pid.PID(p: float = 0, i: float = 0, d: float = 0, imax: float = 0)

Erstellt einen PID-Regler.

  • p ist die Proportionalverstärkung (Kp).

  • i ist die Integralverstärkung (Ki).

  • d ist die Differenzialverstärkung (Kd).

  • imax ist der absolute Maximalwert, auf den der Integratorterm begrenzt wird (Anti-Windup-Grenze). Die Integratorausgabe wird auf den Bereich [-abs(imax), +abs(imax)] beschränkt.

Der Differenzialterm wird durch einen festen Tiefpassfilter erster Ordnung mit einer Grenzfrequenz von 20 Hz gefiltert.

get_pid(error: float, scaler: float) float

Berechnet die Ausgabe des PID-Reglers für den angegebenen error und gibt sie zurück.

  • error ist der aktuelle Fehler (typischerweise target - measurement).

  • scaler ist ein multiplikativer Skalierungsfaktor, der auf die Summe aus Proportional- und Differenzialanteil sowie auf das Integrator-Inkrement angewendet wird.

Die Zeitdifferenz zwischen aufeinanderfolgenden Aufrufen wird intern mit time.ticks_ms() gemessen. Wenn zwischen zwei Aufrufen mehr als 1000 ms vergehen (oder beim ersten Aufruf), wird der Integrator über PID.reset_I() zurückgesetzt, und die Zeitdifferenz wird für diesen Schritt als null behandelt.

Gibt die PID-Ausgabe als float zurück.

reset_I() None

Setzt den Integratorzustand zurück. Löscht den akkumulierten Integralterm auf null und löscht den zwischengespeicherten Differenzialwert (auf NaN gesetzt), sodass der nächste Aufruf von PID.get_pid() den Differenzialfilter neu initialisiert.