lzbf 发表于 2025-6-16 09:40

数字PID及其改进算法


星辰伴梦 发表于 2025-6-17 21:40

这个文件看起来是关于数字PID控制器及其改进算法的详细研究,有谁已经看过了吗?可以分享一些关键点吗?

backlugin 发表于 2025-7-2 12:32

数字PID控制及其改进算法是现代控制系统中极为重要的组成部分,尤其是在嵌入式系统、工业自动化和机器人技术等领域。

少女诗篇 发表于 2025-7-3 11:53


可以看看这个 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

不想起床喵星人 发表于 2025-7-3 14:29

这个文件看起来很有料,数字PID及其改进算法是自动化控制领域的经典话题,不知道里面有没有提到模糊PID或者自适应PID算法?
页: [1]
查看完整版本: 数字PID及其改进算法