pid — Controler proporțional-integral-derivativ¶
Modulul pid oferă o clasă simplă de controler proporțional-integral-derivativ (PID) cu filtrare trece-jos a termenului derivativ și limitare a saturației integratorului (windup).
Exemplu:
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)¶
Construiește un controler PID.
peste amplificarea (gain) proporțională (Kp).ieste amplificarea (gain) integrală (Ki).deste amplificarea (gain) derivativă (Kd).imaxeste valoarea maximă absolută la care este limitat termenul integrator (limita anti-windup). Ieșirea integratorului este mărginită la intervalul[-abs(imax), +abs(imax)].
Termenul derivativ este filtrat de un filtru trece-jos fix de ordinul întâi cu o frecvență de tăiere de 20 Hz.
- get_pid(error: float, scaler: float) float¶
Calculează și returnează ieșirea controlerului PID pentru
errordat.erroreste eroarea curentă (de obiceitarget - measurement).scalereste un factor de scalare multiplicativ aplicat sumei proporțional + derivativ și incrementului integratorului.
Diferența de timp dintre apeluri succesive este măsurată intern folosind
time.ticks_ms(). Dacă între apeluri trec mai mult de 1000 ms (sau la primul apel), integratorul este resetat prinPID.reset_I(), iar diferența de timp este considerată zero pentru acel pas.Returnează ieșirea PID sub formă de
float.
- reset_I() None¶
Resetează starea integratorului. Anulează termenul integral acumulat la zero și șterge valoarea derivativă memorată în cache (setată la
NaN), astfel încât următorul apel laPID.get_pid()să reinițializeze filtrul derivativ.