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.

  • p este amplificarea (gain) proporțională (Kp).

  • i este amplificarea (gain) integrală (Ki).

  • d este amplificarea (gain) derivativă (Kd).

  • imax este 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 error dat.

  • error este eroarea curentă (de obicei target - measurement).

  • scaler este 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 prin PID.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 la PID.get_pid() să reinițializeze filtrul derivativ.