位式控制算法
流程图
特点:
- 位式控制算法输出信号只有H/L两种状态
- 算法输出信号out的依据:
- Pv < Sv ==> H
- Pv >=Sv ==> L
- 只考察控制对象当前的状态值
PID控制算法
流程图
Sv: 用户设定值——目标值
Pv: 控制对象的当前值
PID算法分析
-
从开机以来,传感器的所有采样数据序列
- X1, X2, … , Xk-1, Xk
-
分析采样点的数据序列:可挖掘三方面信息
-
P算法
Ek = Sv - Xk
- >0 : 当前未达标
-
=0 : 正好达标
- <0 : 当前已达标
POUT = Kp · Ek + OUTo ——比例控制
Kp : 比例系数
OUTo : 常量
考虑当前值
-
I 算法
历史偏差序列:E1, E2, … , Ek-1, Ek
Sk = E1 + E2 + … + Ek-1 + Ek
- >0:过去大部分时间未达标
- =0:
- <0:过去大部分时间已超标
IOUT = Ki · Sk + OUT0 ——积分算法
Ki:积分系数
OUT0:常量
考虑过去值
-
D算法
最近两次偏差相减:Dk = Ek - Ek-1
- >0 : 偏差增大趋势
- =0 :
- <0 : 偏差减小趋势
DOUT = Kd · Dk + OUT0 ——微分控制
Kd : 微分系数
OUT0 : 常量
考虑预测值
-
PID算法的数学模型
PIDout = Pout + Iout + Dout
= (Kp·Ek + OUTo)+(Kp·Sk + OUTo)+(Kp·Dk + OUTo)
= Kp · (Ek + Sk + Dk) + OUTo
PID算法的参数处理
基于单片机控制
PIDout = Pout + Iout + Dout
- S k S_k Sk 的处理
S k = 1 T i × ∑ k = 0 n E k × T S_k = \frac{1}{T_i} \times \sum_{k=0}^{n}{E_k} \times T Sk=Ti1×k=0∑nEk×T
T : 采用周期(计算周期)
T i T_i Ti : 积分常数(积分时间)
采样周期一般要大于输出到负载的信号处理时间(比如一个脉冲周期以上),否则在一个脉冲信号未结束pid算法已经又运算出新的输出导致输出信号不停的改变。
积分分离: 一般工程上一开始,第一次到达目标之前,会取 T i T_i Ti 无穷大,相当于积分项不起作用,防止累积太多正向误差;当当前值与误差值的相差一般达到70%~80%时才把积分项加进去( T i T_i Ti取适当值)
- D k D_k Dk 的处理
D k = T d × E k − E k − 1 T D_k = T_d \times \frac {E_k - E_{k-1}}{T} Dk=Td×TEk−Ek−1
T d T_d Td : 微分常数
T : 相当于
dt
,采样周期不能太大否则变化率不明显
单片机中的PID算法表达式——位置式PID
O U T = K p E k + K p T T i ∑ k = 0 n E k + K p T d T ( E k − E k − 1 ) + O U T 0 OUT = K_p E_k + K_p \frac{T}{T_i} \sum_{k=0}^n{E_k} + K_p \frac{T_d}{T} (E_k - E_{k-1}) + OUT_0 OUT=KpEk+KpTiTk=0∑nEk+KpTTd(Ek−Ek−1)+OUT0
需要确定的参数: K p , T i , T d , T K_p , T_i,T_d,T Kp,Ti,Td,T
E k , E k − 1 E_k,E_{k-1} Ek,Ek−1可以通过计算得到
增量式PID
计算出的是控制量的增加值
O U T k = K p E k + K p T T i ∑ k = 0 n E k + K p T d T ( E k − E k − 1 ) + O U T 0 OUT_k = K_p E_k +K_p \frac{T}{T_i} \sum_{k=0}^n{E_k} + K_p \frac{T_d}{T} (E_k - E_{k-1}) + OUT_0 OUTk=KpEk+KpTiTk=0∑nEk+KpTTd(Ek−Ek−1)+OUT0
O U T k − 1 = K p E k − 1 + K p T T i ∑ k = 0 n − 1 E k + K p T d T ( E k − 1 − E k − 2 ) + O U T 0 OUT_{k-1} = K_p E_{k-1} +K_p \frac{T}{T_i} \sum_{k=0}^{n-1}{E_k} + K_p \frac{T_d}{T} (E_{k-1} - E_{k-2}) + OUT_0 OUTk−1=KpEk−1+KpTiTk=0∑n−1Ek+KpTTd(Ek−1−Ek−2)+OUT0
Δ O U T = O U T k − O U T k − 1 \Delta OUT = OUT_k - OUT_{k-1} ΔOUT=OUTk−OUTk−1
Δ O U T = 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 ) \Delta OUT = K_p (E_k-E_{k-1}) +K_p \frac{T}{T_i} E_k + K_p \frac{T_d}{T} (E_k - 2E_{k-1} + E_{k-2}) ΔOUT=Kp(Ek−Ek−1)+KpTiTEk+KpTTd(Ek−2Ek−1+Ek−2)
E k E_k Ek: 当前(本次)偏差值
E k − 1 E_{k-1} Ek−1: 上次偏差值
E k − 2 E_{k-2} Ek−2: 上上次偏差值