pid — Controllore proporzionale-integrale-derivativo

Il modulo pid fornisce una semplice classe di controllore proporzionale-integrale-derivativo (PID) con filtraggio passa-basso del termine derivativo e limitazione del windup dell’integratore.

Esempio:

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)

Costruisce un controllore PID.

  • p è il guadagno proporzionale (Kp).

  • i è il guadagno integrale (Ki).

  • d è il guadagno derivativo (Kd).

  • imax è il valore massimo assoluto a cui viene limitato il termine integratore (limite anti-windup). L’uscita dell’integratore è vincolata all’intervallo [-abs(imax), +abs(imax)].

Il termine derivativo viene filtrato da un filtro passa-basso del primo ordine fisso con una frequenza di taglio di 20 Hz.

get_pid(error: float, scaler: float) float

Calcola e restituisce l’uscita del controllore PID per l”error indicato.

  • error è l’errore corrente (tipicamente target - measurement).

  • scaler è un fattore di scala moltiplicativo applicato alla somma proporzionale + derivativa e all’incremento dell’integratore.

Il delta temporale tra chiamate successive viene misurato internamente usando time.ticks_ms(). Se tra una chiamata e l’altra trascorrono più di 1000 ms (o alla prima chiamata), l’integratore viene azzerato tramite PID.reset_I() e il delta temporale viene considerato nullo per quel passo.

Restituisce l’uscita del PID come float.

reset_I() None

Azzera lo stato dell’integratore. Cancella il termine integrale accumulato portandolo a zero e cancella il valore derivativo memorizzato (impostandolo a NaN) in modo che la chiamata successiva a PID.get_pid() reinizializzi il filtro derivativo.