在自动控制中,pid及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景。
1、pid算法基本原理
pid算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法。对于一般的研发人员来说,设计和实现pid算法是完成自动控制系统的基本要求。这一算法虽然简单,但真正要实现好,却也需要下一定功夫。首先我们从pid算法最基本的原理开始分析和设计这一经典命题。
pid算法的执行流程是非常简单的,即利用反馈来检测偏差信号,并通过偏差信号来控制被控量。而控制器本身就是比例、积分、微分三个环节的加和。其功能框图如下:
根据上图我们考虑在某个特定的时刻t,此时输入量为rin(t),输出量为rout(t),于是偏差就可计算为err(t)=rin(t)-rout(t)。于是pid的基本控制规律就可以表示为如下公式:
其中kp为比例带,ti为积分时间,td为微分时间。pid控制的基本原理就是如此。
2、pid算法的离散化
上一节简单介绍了pid算法的基本原理,但要在计算机上实现就必须将其离散化,接下来我们就说一说pid算法的离散化问题。在实现离散化之前,我们需要对比例、积分、微分的特性做一个简单的说明。
比例就是用来对系统的偏差进行反应,所以只要存在偏差,比例就会起作用。积分主要是用来消除静差,所谓静差就是指系统稳定后输入输出之间依然存在的差值,而积分就是通过偏差的累计来抵消系统的静差。而微分则是对偏差的变化趋势做出反应,根据偏差的变化趋势实现超前调节,提高反应速度。
在实现离散前,我们假设系统采样周期为t。假设我们检查第k个采样周期,很显然系统进行第k次采样。此时的偏差可以表示为err(k)=rin(k)-rout(k),那么积分就可以表示为:err(k)+ err(k+1)+┈┈,而微分就可以表示为:(err(k)- err(k-1))/t。于是我们可以将第k次采样时,pid算法的离线形式表示为:
也可以记为:
这就是所谓的位置型pid算法的离散描述公式。我们知道还有一个增量型pid算法,那么接下来我们推到一下增量型pid算法的公式。上面的公式描述了第k个采样周期的结果,那么前一时刻也就是k-1个采样周期就不难表示为:
那么我们再来说第k个采样周期的增量,很显然就是u(k)-u(k-1)。于是我们用第k个采样周期公式减去第k-1个采样周期的公式,就得到了增量型pid算法的表示公式:
当然,增量型pid必须记得一点,就是在记住u(k)=u(k-1)+∆u(k)。
3、pid控制器的基本实现
完成了离散化后,我们就可以来实现它了。已经用离散化的数据公式表示出来后,再进型计算机编程已经不是问题了。接下来我们就使用c语言分别针对位置型公式和增量型公式来具体实现。
(1)位置型pid的简单实现
位置型pid的实现就是以前面的位置型公式为基础。这一节我们只是完成最简单的实现,也就是将前面的离散位置型pid公式的计算机语言化。
首先定义pid对象的结构体:
1 /*定义结构体和公用体*/
2
3 typedef struct
4
5 {
6
7 float setpoint; //设定值
8
9 float proportiongain; //比例系数
10
11 float integralgain; //积分系数
12
13 float derivativegain; //微分系数
14
15 float lasterror; //前一拍偏差
16
17 float result; //输出值
18
19 float integral;//积分值
20
21 }pid;
接下来实现pid控制器:
1 void pidregulation(pid *vpid, float processvalue)
2
3 {
4
5 float thiserror;
6
7 thiserror=vpid->setpoint-processvalue;
8
9 vpid->integral+=thiserror;
10
11 vpid->result=vpid->proportiongain*thiserror+vpid->integralgain*vpid->integral+vpid->derivativegain*(thiserror-vpid->lasterror);
12
13 vpid->lasterror=thiserror;
14
15 }
这就实现了一个最简单的位置型pid控制器,当然没有考虑任何干扰条件,仅仅只是对数学公式的计算机语言化。
(2)增量型pid的简单实现
增量型pid的实现就是以前面的增量型公式为基础。这一节我们只是完成最简单的实现,也就是将前面的离散增量型pid公式的计算机语言化。
首先定义pid对象的结构体:
1 /*定义结构体和公用体*/
2
3 typedef struct
4
5 {
6
7 float setpoint; //设定值
8
9 float proportiongain; //比例系数
10
11 float integralgain; //积分系数
12
13 float derivativegain; //微分系数
14
15 float lasterror; //前一拍偏差
16
17 float preerror; //前两拍偏差
18
19 float deadband; //死区
20
21 float result; //输出值
22
23 }pid;
接下来实现pid控制器:
void pidregulation(pid *vpid, float processvalue)
{
float thiserror;
float increment;
float perror,derror,ierror;
thiserror=vpid->setpoint-processvalue; //得到偏差值
perror=thiserror-vpid->lasterror;
ierror=thiserror;
derror=thiserror-2*(vpid->lasterror)+vpid->preerror;
increment=vpid->proportiongain*perror+vpid->integralgain*ierror+vpid->derivativegain*derror; //增量计算
vpid->preerror=vpid->lasterror; //存放偏差用于下次运算
vpid->lasterror=thiserror;
vpid->result+=increment;
}
这就实现了一个最简单的增量型pid控制器,也没有考虑任何的干扰条件,仅仅只是对数学公式的计算机语言化。
4、基本特点
前面讲述并且实现了pid控制器,包括位置型pid控制器和增量型pid控制器。界限来我们对这两种类型的控制器的特点作一个简单的描述。
位置型pid控制器的基本特点:
位置型pid控制的输出与整个过去的状态有关,用到了偏差的累加值,容易产生累积偏差。
位置型pid适用于执行机构不带积分部件的对象。
位置型的输出直接对应对象的输出,对系统的影响比较大。
增量型pid控制器的基本特点:
增量型pid算法不需要做累加,控制量增量的确定仅与最近几次偏差值有关,计算偏差的影响较小。
增量型pid算法得出的是控制量的增量,对系统的影响相对较小。
采用增量型pid算法易于实现手动到自动的无扰动切换。
USB快充2.4G遥控夜灯方案
由硅和钙钛矿组合生产的太阳能电池在高压力下表现良好
基于多边形拼接虚拟管道的无人机集群分布式控制
百度研发中国首款云端全功能AI芯片“昆仑”
电池业务拟分拆上市 天能动力的资本局
自动控制系统PID控制器的基本实现
采用Linux系统的嵌入式工控量热仪设计方案
边缘自动化与IIoT的机遇
眉山建市以来最大工业项目,信利(仁寿)第5代显示项目封顶仪式举行
数据中台不断落地 逐渐蔓延到了安防行业
基于MCU的设备开发安全的RTOS
华为郭平预计,截止到2020年底将部署超过150万个5G基站
The MathWorks双模式混合动力总成系统
锂电池充放电理论和电量计算方法的设计
激光等离子复合焊的优缺点和工艺原理的介绍
重新设计核动力火箭发动机 飞向火星!
农业气象仪器都有哪些,它的使用效果怎么样
苹果推iOS 14.2测试版,引入全新曲目识别功能
无线Mesh技术和网络
9024-0256-01