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”
errorindicato.errorè l’errore corrente (tipicamentetarget - 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 tramitePID.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 aPID.get_pid()reinizializzi il filtro derivativo.