PID算法(上)

最近由于要写嵌入式实验报告,我就偶然间了解到了PID控制算法,发现小的一个灯泡亮暗的控制,大到控制无人机飞行姿态,飞行速度等等,都和PID控制算法有着不可隔分的联系。于是怀着好奇心,我在youtue上看到一个讲PID控制算法很好的视频,不能翻墙的童鞋也可以在B站上看到前三节。

B站地址:https://www.bilibili.com/video/av6451899/?spm_id_from=333.788.videocard.0
youtube地址:
https://www.youtube.com/watch?v=nDZf_tJZks0&list=PLuBO1RvnSkLEwH17JYdEmyfi08WXfEgpU

下面是我针对视频做的一些笔记:

我们先来谈谈传统的控制算法:

一. 二位式控制算法

我简单的画了一下流程图,方便我们理解:

二位式控制算法

用户设置:用户通过可调电阻或者是按钮,输出一个用户所期望的值,我们称为设定着Sv。比如是温度控制的话,这个设定值就是温度,比如用户通过热水器控制开关调到100度,此时传递的Sv值就是100

位式控制算法:它输出一个控制信号,我们称之为out,这个输出的信号就加到我们的执行器件上。位式控制算法的输入信号主要来自于两个,一个是用户设置的值Sv,一个是控制对象当前的值Pv。我们控制对象当前的温度值通过一个传感器,把这个控制对象当前的值获取,然后传送回位式控制算法的输入端,称为Pv。

执行部件:一般属于开关型部件,比如说莫斯管,继电器或者是可控硅之类的开关型部件。其输出的信号加到我们的控制对象上。

控制对象:就是我们例子中讲的加热器,或者是步进电机,或者说是这个电磁阀这些。

Sv和Pv这两个值,在位式控制算法中,通过一些比较,或者说是放大缩小,做一个判断处理后,将输出信号作用到执行部件,然后这个执行部件就去控制我们的控制对象,使其当前值发生改变。

位式控制算法的基本特点:

输出信号比较单一,一般来说只有两种状态,高电平或者是低电平,其对应的驱动我们的控制对象也就只有两种状态,要不是工作,要不就是不工作。因为它输出的是一个开关信号。

位式控制算法输出信号out的依据:就是把Sv和Pv进行比较。
Pv < Sv 则输出高电平,打开开关
Pv >= Sv 则输出低电平,关闭开关

位式控制算法的缺点:

1.其输出值只有两种状态。意味着这个执行部件的开关器件要么处于一个接通状态,要么处于一个断开状态。那假如说控制对象是加热器的话,那有一个电源来给其加热。而我们的控制部件就控制着电源的通和断。控制算法过于简单,单纯的吧Pv和Sv比较。则控制对象要么一直处于高功率运作,要不就是处于一个0W的情况下工作。最终导致我们传感器传回来的温度值,总是在这个设定值100度上下浮动。

产生这种波动的原因,主要是因为控制对象,它本身具有一定惯性。就是电已经加上了温度却还一直往下掉,而电已经断开了,温度还一直往上升。

2.最大的缺点就是,其只考察控制对象当前这个传感器回来的值与目标值之间相差了多少。

因为位式控制算法其不能把我们的温度控制到100度,其温度实际上会在上下几十度波动。很难达到理想的控制效果,在这种情况下,我们就引入另一种控制算法PID算法。

二. PID控制算法

PID算法可以说是在这个位式控制算法上做了很多的调整和优化。
1. 不仅考略你当前的值有没有达标,其还考虑你之前有没有达标过
2. 对输出做了调整,不仅仅只输出两种可能。摆脱了位式控制算法输出的不平滑,要么是很大功率的满负荷工作,要么是彻底停下来。

PID控制算法的流程图我绘制如下:

PID控制算法

Sv是用户的设定值,也就是目标值。
Pv是控制对象的当前值。
偏差信号(通常用E来表示) = Sv – Pv
历史偏差:我们其实可以理解为一个存储器,即从这个设备一通电开始,得到的所有的偏差值用这个存储器来存起来。
当前误差:存的是当前时刻的偏差值
最近偏差:存的是距离很近的,最近两三次的偏差值

把这三个误差值进行线性叠加。叠加之后输出一个控制信号。

PID算法的形成原理:
(1) 数据序列

用x1来代表开机的第一个时间点,用x2来代表开机的第二个时间点,以此类推可以得到数据序列即:
从开机以来,传感器所有的采样点的数据序列(当然是时间间隔越短越好):
x1 x2 x3 … xK-2 xK-1 xK

分析这个采样点的数据序列,可以挖掘出三个方面的信息(即PID算法中的一个P 一个I 一个D)

(2) 信息一:比例算法分析

我们把当前从传感器得到的值Pv,也就是数据序列里的xK,与用户输入的期望值进行偏差运算:

  Ek = Sv – xk (Ek表示现在这个时间点传感器回来的值与我们目标值之间的这样一个偏差程度)
  这个Ek分析则可以取三个值:
  Ek 值  >0  当前控制未达标
      =0  说明正好达标
     < 0. 说明已经超标

然后我们将这个值放大或缩小。即把Ek乘一个数Kp(kp可以理解为一个衰减器或者是放大器,来调整我们传感器回来的偏差值) 把这个乘积的结果作为out输出

Eout = Kp * Ek + out0

用这两个数相乘来控制这个输出信号的控制,我们称之为比例控制。比例控制的特点:就是输出信号的大小OUT与我们当前的偏差值Ek成比例。PID算法输出信号不再只有高和低两种,其输出的为PWM信号。

PWM信号:

就是指的是我们算一个PWM为一个信号控制周期(这一个周期中,有高电平也有低电平,不同的是其脉宽可以不同,即可以有90/100s输出高电平,10/100s输出低电平)这样以来就可以使控制对象的功率在1/100到100/100之间波动。而不会出现只有满功率和不功率。而具体是哪个功率呢,就看我PID算法所输出的值的大小,输出的值越大,其脉宽就越宽,那么控制对象在一定时间内得到加电时间就会加长。

也就是说通过改变控制对象在一个周期内这个工作与停止的时间比例来调整。所以总而言之,比列控制就是根据当前偏差值比例大小输出控制信号

比例调节缺点为:

当Ek = 0的时候,out就变成0了。
输出信号等于0的意思是我不输出控制信号了,也就是我不控制你了,那这个时候我的这个负载就是处于失控的状态。缺点是有误差我才控制,没有误差我就不起作用了。所以导致这个比例算法系统在工作的时候总是有误差,因为没误差的时候不工作了啊。

为了改善这个。可以在out = Kp’ * Ek 后面加一个常数,叫 OUT零

所以我们把这个输出叫Pout比例

Pout = Kp' * Ek + out0

(2)信息二:积分算法分析(Sk说明历史情况,Ek说明当前情况)

我们把数据序列中的每一项都和用户所设定的期待值作差运算,分别得到E1,E2,等等。

E1 = Sv -x1 E2 = Sv-x2以此类推得到历史的偏差序列:

E1  E2  E3 … Ek-2 Ek-1 Ek

很明显我们知道这个序列中有些值为正数,有些值为负数,还有极少量为0。然后我们把这个偏差序列求一个代数和即:

Sk = E1 + E2 +….+Ek(每一项可正可负,所以不会无穷大)
这样我们得到的Sk也有三种结果:
  Sk > 0  说明比设定值小的数多于比设定值大的数。 说明过去这段时间,大多数时候未达标。
  Sk = 0  说明平均下来都达标了
  Sk < 0  说明大多数时候已经超标了
  此时输出信号OUT 信号= Kp’ * Sk(因为其把历史上的数据都加起来了,就可以理解为一种积分。积分实际上就是偏差求和)

这里也有一个问题,当Sk为0时,即只要历史上是好的,我就不管你了,所以也要在后面加一个OUT零

Sout = Kp' * Sk + out0

(3)信息三:微分算法分析(有一种预见性趋势)

这个算法只考虑前一个时刻和这个时刻,这两个时间点,所以我们把最近两次的偏差相减得到如下:

Dk = Ek – Ek-1

当然Dk也有三种取值,不过这三种取值都不太好了解,我们可以借助画x y坐标轴分析,也可以将其想象成物理中的单位速率,然后来理解

Dk >0  偏差变化率越大 变的越快 在这两个时间点之间产生了剧烈的变化
说明这个偏差有增大的趋势,我们由此可以预测出下一个时间点也会有一个大的突变(因此此时要大幅度调整输出信号,来应对这种突变)
Dk = 0  
Dk < 0
我们的输出同时也对其进行扩大处理:
Dout = Kp*Dp(夸大的目的为了更好的抑制它)

微分控制算法的缺点:

当Dk = 0的时候,此时说明其两次的偏差变化频率是一样的,但是,频率一样不代表没有偏差。但是此时系统却什么也不做,所以我们说微分控制不能够独立行动。它独立行动的话,系统肯定是有误差的。

微分算法的依据是偏差有没有变化趋势,偏差有了变化趋势,我才控制,没有变化趋势,我就不去改变。也就是说无论你偏差多大,只要你一直很平稳的差着,这样就不会对其进行矫正了。

所有有时候就希望在微分控制变化率没有改变的情况下,我们还对系统持有控制,也会在它后面加上一个OUT零。

Dout = Dk * Kp'' + out0

让我们来回顾一下:

积分算法:
其总是根据历史上的结果来进行判断。积分算法有时候给人一种很陈旧的感觉,也就是那些历史上遗留的问题也会带到我们的控制系统上来。所以,有时候产生的效果并不好。

其优点为:其考察了历史因素,我们能走到今天,就是因为历史上的这些因素,而导致的结果。我们可以考察历史因素,但不能单单考虑。

微分算法:
微分控制不能够独立行动,但它能检测到突变,并且根据已知现象进行未来的预测比如,在前一刻将冷水突然倒在热水器上,这种突变就能被微分算法检测出。此时我们就要加大电压的输入,以使它更快地恢复。

(4)PID算法——三个算法的综合

PID算法的数学模型:

PID的输出 = Pout + Iout + Dout
= (Kp * Ek + out0) + (kp’ * Sk + out0) + (kp’’ * Dk + out0)
我们给其做一个归并
PIDOut = Kp (Ek + Sk + Dk) + out0

这就形成了PID算法的基本思想。

算出的数值就能控制我们的脉冲的宽度。比如我们算出的值为800,则输出高电平800 低电平200

由此可见PID控制算法已经很公正了。其实视频后面还讲解了关于Ek Sk Dk的确定问题。等看完了一定补一篇博客~

猜你喜欢

转载自blog.csdn.net/qq_37414405/article/details/83627950