pid — Controlador proporcional-integral-derivativo

El módulo pid proporciona una clase sencilla de controlador proporcional-integral-derivativo (PID) con filtrado paso bajo del término derivativo y limitación del efecto windup del integrador.

Ejemplo:

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)

Construye un controlador PID.

  • p es la ganancia proporcional (Kp).

  • i es la ganancia integral (Ki).

  • d es la ganancia derivativa (Kd).

  • imax es el valor máximo absoluto al que se limita el término integrador (límite anti-windup). La salida del integrador queda acotada al rango [-abs(imax), +abs(imax)].

El término derivativo se filtra mediante un filtro paso bajo fijo de primer orden con una frecuencia de corte de 20 Hz.

get_pid(error: float, scaler: float) float

Calcula y devuelve la salida del controlador PID para el error dado.

  • error es el error actual (normalmente target - measurement).

  • scaler es un factor de escala multiplicativo aplicado a la suma proporcional + derivativa y al incremento del integrador.

El intervalo de tiempo entre llamadas sucesivas se mide internamente usando time.ticks_ms(). Si transcurren más de 1000 ms entre llamadas (o en la primera llamada), el integrador se reinicia mediante PID.reset_I() y el intervalo de tiempo se trata como cero para ese paso.

Devuelve la salida del PID como un float.

reset_I() None

Reinicia el estado del integrador. Pone a cero el término integral acumulado y borra el valor derivativo en caché (lo establece en NaN) de modo que la siguiente llamada a PID.get_pid() reinicialice el filtro derivativo.