pid --- 比例-积分-微分控制器¶
pid 模块提供了一个简单的比例-积分-微分(PID)控制器类,支持微分项低通滤波和积分项饱和(windup)限幅。
示例:
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)¶
构造一个 PID 控制器。
p是比例增益(Kp)。i是积分增益(Ki)。d是微分增益(Kd)。imax是积分项被限幅到的绝对最大值(抗饱和限制)。积分输出被限制在[-abs(imax), +abs(imax)]范围内。
微分项由一个截止频率为 20 Hz 的固定一阶低通滤波器进行滤波。
- get_pid(error: float, scaler: float) float¶
针对给定的
error计算并返回 PID 控制器的输出。error是当前误差(通常为target - measurement)。scaler是应用于比例项 + 微分项之和以及积分增量的乘性比例因子。
连续两次调用之间的时间差是在内部使用
time.ticks_ms()测量的。如果两次调用之间间隔超过 1000 ms(或者是第一次调用),则通过PID.reset_I()重置积分器,并将该步的时间差视为零。以
float形式返回 PID 输出。
- reset_I() None¶
重置积分器状态。将累积的积分项清零,并清除缓存的微分值(设为
NaN),以便下次调用PID.get_pid()时重新初始化微分滤波器。