可以看看这个 Python 代码,做个参考
class PIDController:
def __init__(self, kp, ki, kd, setpoint, sample_time, integral_limit=None):
# 初始化PID参数
self.kp = kp
self.ki = ki
self.kd = kd
self.setpoint = setpoint
self.sample_time = sample_time
self.integral_limit = integral_limit
# 初始化内部状态
self.error_sum = 0
self.last_error = 0
self.last_output = 0
def compute(self, process_variable):
# 计算当前误差
error = self.setpoint - process_variable
# 计算PID各项
p_term = self.kp * error
# 积分项计算与限制
self.error_sum += error * self.sample_time
if self.integral_limit is not None:
self.error_sum = max(min(self.error_sum, self.integral_limit), -self.integral_limit)
i_term = self.ki * self.error_sum
# 微分项计算
d_term = self.kd * (error - self.last_error) / self.sample_time
self.last_error = error
# 计算PID输出
output = p_term + i_term + d_term
self.last_output = output
return output
# 积分分离PID控制器(继承自基础PID)
class SeparatedIntegralPID(PIDController):
def __init__(self, kp, ki, kd, setpoint, sample_time, integral_threshold, integral_limit=None):
super().__init__(kp, ki, kd, setpoint, sample_time, integral_limit)
self.integral_threshold = integral_threshold
def compute(self, process_variable):
# 计算当前误差
error = self.setpoint - process_variable
# 积分分离逻辑:当误差较大时取消积分作用
if abs(error) > self.integral_threshold:
temp_ki = 0 # 暂时禁用积分
else:
temp_ki = self.ki
# 计算PID各项
p_term = self.kp * error
# 使用临时ki计算积分项
self.error_sum += error * self.sample_time
if self.integral_limit is not None:
self.error_sum = max(min(self.error_sum, self.integral_limit), -self.integral_limit)
i_term = temp_ki * self.error_sum
# 微分项计算
d_term = self.kd * (error - self.last_error) / self.sample_time
self.last_error = error
# 计算PID输出
output = p_term + i_term + d_term
self.last_output = output
return output |