pid — Пропорционально-интегрально-дифференциальный регулятор

Модуль pid предоставляет простой класс пропорционально-интегрально-дифференциального (ПИД) регулятора с низкочастотной фильтрацией дифференциальной составляющей и ограничением накопления интегратора.

Пример:

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)

Создаёт ПИД-регулятор.

  • p — пропорциональное усиление (Kp).

  • i — интегральное усиление (Ki).

  • d — дифференциальное усиление (Kd).

  • imax — абсолютное максимальное значение, которым ограничивается интегральная составляющая (предел против накопления). Выход интегратора ограничен диапазоном [-abs(imax), +abs(imax)].

Дифференциальная составляющая фильтруется фиксированным фильтром нижних частот первого порядка с частотой среза 20 Гц.

get_pid(error: float, scaler: float) float

Вычисляет и возвращает выход ПИД-регулятора для заданной ошибки error.

  • error — текущая ошибка (обычно target - measurement).

  • scaler — мультипликативный масштабный коэффициент, применяемый к сумме пропорциональной и дифференциальной составляющих, а также к приращению интегратора.

Интервал времени между последовательными вызовами измеряется внутренне с помощью time.ticks_ms(). Если между вызовами проходит более 1000 мс (или при первом вызове), интегратор сбрасывается через PID.reset_I(), а интервал времени для этого шага считается равным нулю.

Возвращает выход ПИД-регулятора как float.

reset_I() None

Сбрасывает состояние интегратора. Обнуляет накопленную интегральную составляющую и очищает кэшированное значение дифференциальной составляющей (устанавливая NaN), так что следующий вызов PID.get_pid() повторно инициализирует дифференциальный фильтр.