PID 算法 (温控为例子)

一:位式控制:

位式控制算法输出信号一般只有高低两种状态。

算法输出信号out的依据 PV < SP => H; PV >= SP => L

对于系统惯性,会导致系统震荡

  1. PID算法 (基于位式控制,做了很多优化)

SP: Set Point

PV: Process Value

  1. PID算法分析:

采样的温度系列: X_{1}, X_{2}, X_{3}, ......, X_{k-2}, X^{_{k-1}}, X_{k}

1). 当前偏差: E_{k} = SP - X_{k} 

      >0: 当前未达标; =0; 正好达标; <0: 当前超标

P_{Out}= K_{p} * E_{k} + Out_{0}  ---比例控制 (只考虑现在偏差,偏差越大,输出PWM越大)

因为如果 E_{k} 为0表述没有PWM输出了,为了维持系统温度, 需要有一个维持的默认常数输出值Out_{0}这样可以保证系统能温度在目标温度SP (根据不同系统,调试得到具体值。) 

 2). 历史的偏差系列: E_{1}, E_{2}, E_{3}, ......, E_{k-2}, E^{_{k-1}}, E_{k}

S_{k} =  E_{1}+ E_{2} + E_{3}+ ...... + E_{k-2} + E^{_{k-1}} + E_{k}

    >0: 表示过去这段时间,大多数情况下未达标; =0: 总体可以; <0: 表示过去这段时间,大多数情况下超标;

I_{Out} =  K_{p} * S_{k} + Out_{0}  ---积分算法控制(只考虑历史偏差,缺点很大)

因为如果 E_{k} 为0表述没有PWM输出了,为了维持系统温度, 需要有一个维持的默认常数输出值Out_{0}这样可以保证系统能温度在目标温度SP (根据不同系统,调试得到具体值。)

 3). 最近两次的偏差相减: 

 D_{k} = E_{k} -  E^{_{k-1}} ---偏差变化率,变化趋势

D_{Out} = K_{p} * D_{k} + Out_{0}  ---微分算法控制(只考最近两次的变化率,预测下一次的走势(可以适当通过系数增大变化率,这样可以提前控制未来的变化))

 >0: 表示偏差有增大趋势; =0: 表示偏差趋势没有改变; <0: 表示偏差有减小趋势;

因为如果 E_{k} 为0表述没有PWM输出了,为了维持系统温度, 需要有一个维持的默认常数输出值Out_{0}这样可以保证系统能温度在目标温度SP (根据不同系统,调试得到具体值。)

二:PID算法的数学模型: 

PID_{}^{_{Out}} =  P_{Out} + I_{Out} + D_{Out} 

            =  (K_{p} * E_{k} + Out_{0}) + (K_{p} * S_{k} + Out_{0}) + (K_{p} * D_{k} + Out_{0})

            =  K_{p} * ( E_{k} +  S_{k} +  D_{k}) + Out_{0} 

 S_{k} 的处理:

 S_{k}  =  \frac{1 }{T i}* \sum_{k=0}^{n}E_{k} * T

T: 采样周期(PID计算周期)

T_{i} : 积分常数(积分时间)越大影响越弱 (不能太大也不能太小)

 第一次达到目标温度SP之前,会产生错误,导致超调,过冲。为了避免超调, 可以做积分分离处理,可以在第一次达到目标温度SP之前,可以设置T_{i}为一个很大的值,把  S_{k} 忽略掉。

 积分项一般是在积分项在比例项失效时再起作用,用历史经验继续来控制。

两个关键因素的选择:T 和 T_{i} 

 D_{k} 的处理: 

  D_{k} = T_{d} * (( E_{k} -  E^{_{k-1}} ) / T)

T_{d}: 微分常数 

三:位置式PID 算法表达式:

OUT = (K_{p} * E_{k}) + (K_{p} * T/T_{i} * \sum_{k=0}^{n}E_{k})  + ( K_{p} * T_{d}/T *  ( E_{k} -  E^{_{k-1}} )) + OUT_{0} 

四: K_{p} K_{i} 和 K_{d}的关系:

 K_{p} 

 K_{i} = K_{p} * T/T_{i} 

 K_{d} = K_{p} * T_{d}/T

五:增量式PID (输出是一个增量,计算出控制量的增加值):

\Delta^{_{Out}} = OUT^{_{k}} - OUT^{_{k-1}}

 OUT^{_{k}} = (K_{p} * E_{k}) + (K_{p} * T/T_{i} * \sum_{k=0}^{n}E_{k})  + ( K_{p} * T_{d}/T *  ( E_{k} -  E^{_{k-1}} )) + Out_{0} 

  OUT^{_{k-1}} = (K_{p} * E^{_{k-1}}) + (K_{p} * T/T_{i} * \sum_{k=0}^{n-1}E_{k})  + ( K_{p} * T_{d}/T *  ( E^{_{k-1}} -  E^{_{k-2}} )) + Out_{0} 

 \Delta^{_{Out}} =  (K_{p} * ( E_{k} - E^{_{k-1}}))  +  K_{p} *  T/T_{i} *  E_{k} + K_{p} * T_{d}/T * (  E_{k} -  2 * E^{_{k-1}} + E^{_{k-2}})

  E_{k} : 当前本次偏差值

  E^{_{k-1}} :上次偏差值

  E^{_{k-2}} :上上次偏差值

  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自适应PID(比例-积分-微分)控制算法是一种常用的控制方法,用于实现温度控制。以下是一个简单的自适应PID算法控制温度的示例: ```python # 导入所需的库 import time # 定义PID参数 Kp = 0.5 # 比例系数 Ki = 0.2 # 积分系数 Kd = 0.1 # 微分系数 # 初始化变量 setpoint = 40.0 # 设定温度 integral = 0.0 # 积分项 last_error = 0.0 # 上次误差 # 模拟温度传感器读取当前温度的函数 def read_temperature(): # 这里使用随机数来模拟实际的温度读取 return 35 + (random.random() * 10) # 模拟控制器输出控制信号的函数 def send_control_signal(output): # 在这里实现发送控制信号的操作,例如控制电磁阀或加热器 pass # 主循环 while True: # 读取当前温度 temperature = read_temperature() # 计算误差 error = setpoint - temperature # 计算积分项 integral = integral + error # 计算微分项 derivative = error - last_error # 计算PID控制输出 output = (Kp * error) + (Ki * integral) + (Kd * derivative) # 发送控制信号 send_control_signal(output) # 更新上次误差 last_error = error # 等待一段时间(例如1秒),进行下一次循环 time.sleep(1) ``` 在上述示例中,我们首先定义了PID的比例、积分和微分系数(Kp,Ki和Kd)。然后,我们初始化一些变量,如设定温度(setpoint)、积分项(integral)和上次误差(last_error)。 在主循环中,我们首先读取当前温度,并计算误差。然后,我们分别计算积分项和微分项。接下来,我们使用PID控制公式来计算输出。最后,我们发送控制信号,并更新上次误差。 请注意,实际的温度读取、控制信号发送和循环时间间隔等操作可能需要根据实际情况进行调整和修改。此示例仅提供了一个基本的框架,供您参考和进一步开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值