class IncrementalPID:
def __init__(self, Kp, Ki, Kd, setpoint, min_output=20, max_output=360):
self.Kp = Kp
self.Ki = Ki
self.Kd = Kd
self.setpoint = setpoint
self.min_output = min_output
self.max_output = max_output
self.last_error = 0
self.integral = 0
def update(self, measured_value):
error = self.setpoint - measured_value
P = self.Kp * error
I = self.Ki * self.integral
D = self.Kd * (error - self.last_error)
# 增量计算
delta_u = P + I + D
# 积分项更新
self.integral += error
# 控制量更新
control_output = self.last_error + delta_u
# 控制量限制
control_output = max(min(control_output, self.max_output), self.min_output)
# 更新误差供下次使用
self.last_error = control_output
return control_output
pid = IncrementalPID(Kp=2, Ki=4, Kd=3, setpoint=40)
# 初始设定值为40,纯比例控制稳定时的控制量为37
initial_setpoint = 40
initial_control_value = 37
# t0时刻,设定值由40变化到65,并做PID控制运行
t0_setpoint = 65
pid.setpoint = t0_setpoint
t0_measured_value = None # t0时刻的测量值未知,但不影响控制量的计算
t0_control_value = pid.update(measured_value=t0_measured_value if t0_measured_value is not None else initial_control_value)
# t1时刻,测量值为38
t1_measured_value = 38
t1_control_value = pid.update(measured_value=t1_measured_value)
# t2时刻,测量值为43
t2_measured_value = 43
t2_control_value = pid.update(measured_value=t2_measured_value)
# 结果
print(f"t0时刻对应的控制量: {t0_control_value}")
print(f"t1时刻对应的控制量: {t1_control_value}")
print(f"t2时刻对应的控制量: {t2_control_value}")
一段增量式PID控制程序
于 2024-05-10 10:45:06 首次发布