PID控制算法

半世苍凉 提交于 2020-03-01 01:27:45

PID控制算是应用非常广泛的控制算法了。小到控制一个元件的温度,大到控制无人机的飞行姿态和飞行速度,智能车的电机舵机输出等。

一、案例
偏差 = 目标值 - 真实值。假如,我现在开始对加热器进行加热,我的目标温度是100度,但是此时从温度传感器传回来的实际温度值是20度,此时的偏差就是80度。如何通过控制算法来解决这个问题呢?往下看。

二、位式控制算法
在这里插入图片描述 在传统的位式控制算法中,输出信号只有2种状态:高电平或低电平。针对上述例子,温度传感器返回来的真实值与目标值之间有80度的误差之大,经过位式控制算法后必然会输出一个高电平作用在加热器负载上。然后经过位式控制算法的调节,温度一定会达到目标值100度。当温度达到100度时,系统输出低电平对负载停止加热。但是,由于负载电器具有一定的惯性,它仍然会加热一段时间。经试验得出此误差会在二三十度,也就是实际温度会达到120-130度。这是一个很大的误差!位式控制算法无法解决,于是引入了PID控制算法。

三、PID控制算法
在这里插入图片描述
在这里插入图片描述
1、简介PID
PID控制算法与位式控制算法不同的是,PID不再是只有两种输出状态(高电平或低电平),而是引入了PWM脉宽,按脉宽比例精确输出(输出范围在0-1之间)。

P:proportion(比例),就是对偏差E乘以一个常数。
I:Integral(积分), 就是对偏差E进行积分运算。
D:Derivative(微分),就是对偏差E进行微分运算。

2、公式推导
①.最近一次偏差(比例控制P)
Ek = Sv - Xk (>0未达标,=0,<0超标)
Pout = Kp * Ek + OUT0(加入OUT0防止Ek=0时系统失控)

②.历史的偏差和(积分控制I)
Sk = E1 + E2 + E3+…+Ek-2 + Ek-1 + Ek(>0 过去这段时间大多数时间未达标;=0;<0 过去这段时间大多数时间超标)
Iout = Ki * Sk +OUT0(加入OUT0防止Sk=0时系统失控)

③.最近两次误差之差(微分控制D)
E = Ek - Ek-1
Dout = Kd * E

④最后的PWM输出 = Pout + Iout + Dout (必须大于0且小于PWM的预设周期)
在这里插入图片描述在这里插入图片描述

3、对PID应用的理解
①比例控制算法:
举例:假设我有一个水缸,我想把里面的水位控制在1。刚开始水缸里的水位是0.2米,那么此刻的真实水位和目标水位之间是存在一个0.8米error的误差。假设我通过往水缸里加水来控制水位。如果单纯的用比例控制算法,就是指加入的水量u和误差error是成正比的。即 u=Kp * error。假设Kp取0.5 。 那么t=1时(表示第一次加水,也就是第一次对系统施加控制),那么u=0.5 * 0.8=0.4,所以这一次加入的水量会使水位在0.2的基础上上升0.4,达到0.6 。接着,t=2时,当前水位是0.6,所以error是0.4 。u=0.5 * 0.4=0.2 ,会使水位再次上升0.2,达到0.8 。如此这么循环下去,就是比例控制算法的运行方法。最终水位会达到我们需要的1米。但是,单单的比例控制存在一些不足,其中一点就是稳态误差。
像上述例子,根据Kp取值的不同,最终都会达到1米,不会有稳态误差,但是,考虑另外一种情况,假设这个水缸在加水的过程中,存在漏水的情况,假设每次加水的过程,都会漏掉0.1米高度的水。假设仍然Kp取0.5,那么会存在着某种情况,假设经过几次加水,水缸中的水位到0.8时,水位将不会再变换。因为,水位为0.8,则误差error为0.2,所以每次往水缸中加水的量u=0.5 * 0.2=0.1 。同时,每次水缸里又会流出去0.1米的水。加入的水和流出去的水相抵消,水位将不再变化。也就是说,我的目标是1米,但是最后系统达到0.8米的水位就不再变化了,且系统已经达到稳定。由此产生的误差就是稳态误差了。
在实际情况中,这种类似水缸漏水的情况往往更加常见,比如控制汽车运动,摩擦阻力就相当于是“漏水”,控制机械臂、无人机的飞行,各类阻力和消耗都可以理解为本例中的“漏水”。所以,单独的比例控制,在很多时候并不能满足要求。

②积分控制算法
如果仅仅用比例,可以发现存在稳态误差,最后的水位就卡在了0.8米。于是,在控制中,我们再引入一个分量,该分量和误差的积分是正比关系。所以,比例+积分控制算法为:u = Kp * error + Ki * ∫error 。还是用上面的例子,第一次的误差error是0.8,第二次的误差是0.4,至此,误差的积分(离散情况下积分其实就是做累加),∫error = 0.8+0.4=1.2 。这个时候的控制量,除了比例的那一部分,还有一部分就是一个一个系数Ki乘以这个积分项。由于这个积分项会将前面若干次的误差进行累计,所以可以很好的消除稳态误差(假设在仅有比例项的情况下,系统卡在了稳态误差了,即上例中的0.8米,由于加入了积分项的存在,会让输出增大,从而使得水缸的水位可以大于0.8米,渐渐到达目标的1米),这就是积分项的作用。

③微分控制算法
换一个另外的例子,考虑刹车情况。平稳的驾驶车辆,当发现前面有红灯时,为了使得行车平稳,基本上提前几十米就放松油门并踩刹车了。当车辆离停车线非常近的时候,则使劲踩刹车,使车辆停下来。整个过程可以看做一个加入微分的控制策略。微分,说白了在离散情况下,就是error的差值,就是t时刻和t-1时刻error的差,即 u=Kd* (error(t) - error(t-1)),其中Kd是一个系数项。可以看到,在刹车过程中,因为error是越来越小,所以这个微分控制 项一定是负数,在控制中加入一个负数项,它存在的作用就是为了防止汽车由于刹车不及时而闯过线。从常识上可以理解,越是靠近停车线,越是应该注意踩刹车,不能让车过线,所以这个微分项的作用就可以理解为刹车,当车离停止线很近并且车速还很快时,这个微分项的绝对值就会很大(实际上是一个负数),从而表示应该用力踩刹车才能让车停下来。
切换到水缸的例子,就是当发现水缸里的水快要接近1的时候,加入微分项,可以防止给水缸里的水加到超过1米的高度,说白了就是减少控制过程中的振荡。
在智能车中,微分项的作用就是:当电机速度在快要达到目标值时,及时控速,以防超速。在舵机转向时提前预判,以防转向不及时,小车撞上障碍物或偏离轨道行驶。

————————————————
版权声明:本文参考了CSDN博主「确定有穷自动机」的原创文章
原文链接:https://blog.csdn.net/qq_25352981/article/details/81007075

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!