PID控制应该算是应用非常广泛的控制算法了。小到控制一个元件的温度,大到控制无人机的飞行姿态和飞行速度等等,都可以使用PID控制。这里我们从原理上来理解PID控制。
00什么是PID控制
PID是proportion integration differentiation三个英文单词的简称,也即是我们翻译过来的比例、积分、微分控制。控制的原理图如开头的封面图片所示。我们都知道控制系统的最理想效果为是系统的实际输出与期望达到的输出完全相同,但实际情况来说输入与输出之间总存在一定的偏差,所以我们就要采用控制方法来实现更优的控制
01大白话PID控制
1.1比例控制算法(比例因子Kp)
我们先说PID中最简单的比例控制,抛开其他两个不谈,用一个经典的例子吧。假设我有一个水缸,最终的控制目的是要保证水缸里的水位永远的维持在1米的高度。假设初试时刻,水缸里的水位是0.2米,那么当前时刻的水位和目标水位之间是存在一个误差的error,且error为0.8.这个时候,假设旁边站着一个人,这个人通过往缸里加水的方式来控制水位。如果单纯的用比例控制算法,就是指加入的水量u和误差error是成正比的。即
假设kp取0.5
- 那么t=1时(表示第1次加水,也就是第一次对系统施加控制),那么u=0.5*0.8=0.4,所以这一次加入的水量会使水位在0.2的基础上上升0.4,达到0.6.
- 接着,t=2时刻(第2次施加控制),当前水位是0.6,所以error是0.4。u=0.5*0.4=0.2,会使水位再次上升0.2,达到0.8.
- 如此这么循环下去,水位最终会达到一米。就是比例控制算法的运行方法。
但是,单单的比例控制存在着一些不足,其中一点就是 –稳态误差!像上述的例子,根据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米的水位就不在变化了,且系统已经达到稳定。由此产生的误差就是稳态误差了。(在实际情况中,这种类似水缸漏水的情况往往更加常见,比如控制汽车运动,摩擦阻力就相当于是“漏水”,控制机械臂、无人机的飞行,各类阻力和消耗都可以理解为本例中的“漏水”)
所以,单独的比例控制,在很多时候并不能满足要求。
1.2积分控制算法(积分因子Ki)
还是用上面的例子,如果仅仅用比例,可以发现存在暂态误差,最后的水位就卡在0.8了。于是,在控制中,我们再引入一个分量,该分量和误差的积分是正比关系。所以,比例+积分控制算法为:
还是用上面的例子来说明,第一次的误差error是0.8,第二次的误差是0.4,至此,误差的积分(离散情况下积分其实就是做累加),∫∫error=0.8+0.4=1.2. 这个时候的控制量,除了比例的那一部分,还有一部分就是一个系数ki乘以这个积分项。由于这个积分项会将前面若干次的误差进行累计,所以可以很好的消除稳态误差(假设在仅有比例项的情况下,系统卡在稳态误差了,即上例中的0.8,由于加入了积分项的存在,会让输入增大,从而使得水缸的水位可以大于0.8,渐渐到达目标的1.0.)这就是积分项的作用。
1.3微分控制算法(微分因子Kd)
换一个另外的例子,考虑刹车情况。平稳的驾驶车辆,当发现前面有红灯时,为了使得行车平稳,基本上提前几十米就放松油门并踩刹车了。当车辆离停车线非常近的时候,则使劲踩刹车,使车辆停下来。整个过程可以看做一个加入微分的控制策略。
微分,说白了在离散情况下,就是error的差值,就是t时刻和t-1时刻error的差,即:
其中的kd是一个系数项。可以看到,在刹车过程中,因为error是越来越小的,所以这个微分控制项一定是负数,在控制中加入一个负数项,他存在的作用就是为了防止汽车由于刹车不及时而闯过了线。从常识上可以理解,越是靠近停车线,越是应该注意踩刹车,不能让车过线,所以这个微分项的作用,就可以理解为刹车,当车离停车线很近并且车速还很快时,这个微分项的绝对值(实际上是一个负数)就会很大,从而表示应该用力踩刹车才能让车停下来。
切换到上面给水缸加水的例子,就是当发现水缸里的水快要接近1的时候,加入微分项,可以防止给水缸里的水加到超过1米的高度,说白了就是减少控制过程中的震荡。
02照本宣科谈PID
2.1 PID算法的前提
PID是一个闭环控制算法。因此要实现PID算法,必须在硬件上具有闭环控制,就是得有反馈。
2.2 使用现状
PID是比例(P)、积分(I)、微分(D)控制算法。但并不是必须同时具备这三种算法,也可以是PD,PI,甚至只有P算法控制。我以前对于闭环控制的一个最朴素的想法就只有P控制,将当前结果反馈回来,再与目标相减,为正的话,就减速,为负的话就加速。现在知道这只是最简单的闭环控制算法。
2.3三个环节的作用
比例,反应系统的基本(当前)偏差e(t),系数大,可以加快调节,减小误差,但过大的比例使系统稳定性下降,甚至造成系统不稳定;
积分,反应系统的累计偏差,使系统消除稳态误差,提高无差度,因为有误差,积分调节就进行,直至无误差。
微分,反映系统偏差信号的变化率e(t)-e(t-1),具有预见性,能预见偏差变化的趋势,产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除,因此可以改善系统的动态性能。但是微分对噪声干扰有放大作用,加强微分对系统抗干扰不利。
2.4常用的调参经验(使用规律)
比例控制规律P:采用P控制规律能较快地克服扰动的影响,它的作用于输出值较快,但不能很好稳定在一个理想的数值,不良的结果是虽较能有效的克服扰动的影响,但有余差出现。它适用于控制通道滞后较小、负荷变化不大、控制要求不高、被控参数允许在一定范围内有余差的场合。
比例积分控制规律(PI):在工程中比例积分控制规律是应用最广泛的一种控制规律。积分能在比例的基础上消除余差,它适用于控制通道滞后较小、负荷变化不大、被控参数不允许有余差的场合。
比例微分控制规律(PD):微分具有超前作用,对于具有容量滞后的控制通道,引入微分参与控制,在微分项设置得当的情况下,对于提高系统的动态性能指标,有着显著效果。因此,对于控制通道的时间常数或容量滞后较大的场合,为了提高系统的稳定性,减小动态偏差等可选用比例微分控制规律。如:加热型温度控制、成分控制。需要说明一点,对于那些纯滞后较大的区域里,微分项是无能为力,而在测量信号有噪声或周期性振动的系统,则也不宜采用微分控制。
例积分微分控制规律(PID):PID控制规律是一种较理想的控制规律,它在比例的基础上引入积分,可以消除余差,再加入微分作用,又能提高系统的稳定性。
总之,控制规律的选用要根据过程特性和工艺要求来选取,决不是说PID控制规律在任何情况下都具有较好的控制性能,不分场合都采用是不明智的。如果这样做,只会给其它工作增加复杂性,并给参数整定带来困难。当采用PID控制器还达不到工艺要求,则需要考虑其它的控制方案。如串级控制、前馈控制、大滞后控制等。
03PID 控制器的设计与实现
3.1PID算法的推导
连续时间PID控制系统图如下图所示。其中D(s)为PID控制器部分,其输入与输出的的关系可按照下面的微分方程表示:
在数字控制器中,当采样周期足够短时,以求和代替积分,以差分代替微分。则k时刻与k-1时刻的微分方程可分别表达为下面形式
两式相减
这就是数字PID控制器的增量式算法。
假设需要辨识的被控对象模型为
3.2Matlab编程实现
- 因为要建立起系统离散差分模型,先用matlab确定系统的离散模型
1
2
3
4
5
6clear;
clc;
ts=0.5;
sys=tf(4,[1 2 0]);%系统的传递函数
dsys=c2d(sys,ts,'z');%离散化
[num,den]=tfdata(dsys,'v');%得到离散化后的z传递函数分子分母系数 - 程序运行的结果如下:
1
2
3
4
5
6
7
8
9
10
11sys =
4
---------
s^2 + 2 s
Continuous-time transfer function.
dsys =
0.3679 z + 0.2642
----------------------
z^2 - 1.368 z + 0.3679
Sample time: 0.5 seconds
Discrete-time transfer function. - 系统的差分方程如下
- 完整的程序实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41%{
title:PID 控制算法实现
date: 2020.05.10
author:Decaplee
%}
clear;
clc;
ts=0.5; %采样时间=0.5s
sys=tf(4,[1 2 0]);%建立被控对象传递函数
dsys=c2d(sys,ts,'z');%离散化,表示为z传递函数的形式
[num,den]=tfdata(dsys,'v');%输出num和den,分别代表差分方程分子与分母的系数
e_1=0; %初始化k-1、k-2时刻的偏差
e_2=0;
u_1=0.0; %初始化k-1、k-2时刻时刻的输入量
u_2=0.0;
y_1=0; %初始化k-1、k-2时刻时刻的输出量
y_2=0;
Esum=0;
%PID参数
kp=2.1;
ki=0.3
kd=0.12;
u=zeros(1,100);%数组的大小
time=zeros(1,100);%初始化数组的大小
ts=0.5;
for k=1:1:100
time(k)=k*ts; %时间参数由 1 时刻开始
r(k)=1; %期望值
y(k)=-1*den(3)*y_2-den(2)*y_1+num(3)*u_2+num(2)*u_1+num(1)*u(k);% 初始化系统响应输出序列,与前一时刻的输出有关(这就是差分方程)
e(k)=r(k)-y(k); %期望输出与实际输出之间的差值,代表误差信号
u(k)=kp*(e(k)-e_1)+ki*e(k)+kd*(e(k)-2*e_1+e_2); %系统PID控制器输出序列
u_2=u_1;
y_2=y_1;
e_2=e_1;
u_1=u(k); %前一个的控制器输出值
y_1=y(k); %前一个的系统响应输出值
e_1=e(k); %前一个误差信号的值
end
p1=plot(time,r,'-.');xlim([0,50]);hold on;%指令信号的曲线(即期望输入)
p2=plot(time,y,'b--');xlim([0,50]);hold on;%
当Kp=2.1、Ki=0.3、Kd=0.12时,输出的控制曲线如下
04 PID控制器参数整定
4.1 参数整定过程
在进行参数整定之前,笔者利用Matlab的GUI模块建立了数字PID参数整定系统,便于观察PID控制器各个环节的参数对系统响应性能的影响,如设计布局和实际运行效果分别如下图所示
下面采用扩充临界比例度法进行参数整定:
扩充临界比例度法适用于有自衡特性的受控对象,是对连续时间PID控制器参数整定的临界比例度的扩充,其主要步骤如下:
选择一足够短的采样周期T(一般应在被控对象纯时延时间的十分之一以下),作纯比例控制。
逐渐加大比例系数Kp,直到系统达到临界等幅振荡,记下此时的振荡周期Ts,以及增益Ks。
选择控制度
所谓控制度,就是以模拟控制器为标准,将数字控制器的效果与模拟控制器的控制效果相比较,通常采用误差积分的比值形式进行定义,即
4)根据选定的控制度,查表,确定PID控制器的采样周期T和控制器参数Kp, TI, TI 。
5)按照求得的整定参数试运行,观察实际控制效果,并适当进行修正。
4.2 参数整定结果
经过多次参数调整分析,并利用Matlab的GUI模块综合考虑上升时间,超调量,稳态时间,稳态误差等因素,在下图的GUI中观察参数整定效果。
最终整定结果为
整定后的输出响应曲线为
可见,经过参数整定后系统的上升时间超调量以及稳态误差的整体控制效果有了巨大的改进。