PID控制算法
1 位式控制算法
1.1 位式控制算法框图
首先,用户可以通过按键、滑动电阻或者其他方式输入一个控制信号Sv给控制算法, 然后控制算法会结合输入信号Sv和输出采集回来的信号Pv来计算输出量out,然后由out信号控制执行部件,最后由执行部件作用到具体的控制对象上。最后我们要从被控制对象上采集需要控制的变量(可以是温度、湿度等等)反馈给控制算法做修正。
我们以一个水温控制系统为例来说明位式控制算法的原理。
用户设置部分输入一个温度值,比如我们希望控制水温为80℃,则Sv = 80;执行部件可以是一个继电器控制的加热丝,控制对象就是水箱里的水,传感器是一个温度传感器。
1.2 位式控制算法的特点
- 位式控制算法输出信号只有H、L两种状态。
- 算法输出信号out的依据(二位式):
当 Pv > Sv ==> out = L (关断继电器,停止加热)
当Pv ≤ Sv ==>out = H (打开继电器,开始加热) - 控制简单,只是判断当前系统值和设定值的差值来调节。仅仅考虑了控制对象当前的状态值。
- 误差较大,因为被控制对象具有惯性,永远不可能有被控制对象状态值等于设定值这种情况。举例来说:由于热惯性的存在,当我们检测到温度达到设定温度时,关闭继电器,停止加热。虽然此时,加热丝不工作,但是由于热惯性的存在,导致温度还会继续上升;在开启加热时,也会出现类似的情况,虽然已经开启了加热,但是由于热惯性的存在,温度会继续下降一定范围,然后再开始升温。
2 PID算法
2.1 PID算法框图
Sv:用户设置值,目标值。
Pv:控制对象的当前值。
我们假设,从开机以来传感器所有采样点的数据序列如下:x1,x2,x3 ... xk-2, xk-1,xk
分析采样点的数据序列,可以挖掘出如下方面的信息:
2.2 比例控制
Ek = Sv - Xk
- >0:当前未达标
- =0:正好达标
- <0:当前已超标
此时的POUT = Kp * Ek + OUT0,这就是比例控制。我们需要注意,此时的输出已经不是二位式控制方式的输出,而是PWM波的输出。另外,也需要注意到比例控制是在有误差的时候才控制,没误差的时候不参与控制。虽然,在最后加上了控制常数OUT0,但是这样做在某些情况下可能会取得适得其反的效果。
2.3 积分控制
我们可以计算出历史上每一个采样点的偏差,历史偏差序列如下:E1、E2、E3 ... Ek-2、Ek-1、Ek
我们可以把历史上所有的偏差都给累计起来:
Sk = E1+E2+E3 +... +Ek-2+Ek-1+Ek
Sk可能有如下三种值:
- >0:过去这段时间大多数时间未达标。
- =0:过于这段时间大多数已达标。
- <0:过于这段时间大多数已超标。
积分算法的公式如下:
IOUT = Kp*Sk + OUT0,我们可以看出来积分算法过于依赖于过于的值。
2.4 微分控制
将近两次的偏差相减:
Dk = Ek - Ek-1
Dk的值可能有如下三种情况:
- >0:偏差有增大趋势
- =0:偏差无变化
- <0:偏差有减小趋势
DOUT = Kp * Dk + OUT0,我们称之为微分控制。我们可以看出来,微分控制只有在偏差变化趋势比较大的时候才有控制,因此单独的微分控制是没法使用的。