一、PID的数学模型
在工业应用中,PID及其衍生算法是应用最广泛的算法之一,是当之无愧的通用算法。如果能掌握PID算法的设计和实现过程,一般的研发人员应付一般的研发应该就够了。问题是,值得称道的是,在众多控制算法中,PID控制算法最为简单,也是最能体现反馈思想的控制算法,可谓经典中的经典。经典不一定复杂,经典往往是最简单最简单的。PID算法的一般形式:
PID算法通过误差信号控制被控变量,控制器本身就是比例、积分、微分三个环节的总和。这里我们指定(在时间 t):
1.输入量为
2.输出是
3.偏差为
二、PID算法的数字离散化
假设采样间隔为T,那么在第K个T时刻:
偏差 =
积分部分用求和的形式表示,即
微分环节用斜率的形式表示,即
PID算法的离散化公式:
可以表示为:
在公式中:
比例参数:控制器的输出与输入偏差值成正比。一旦系统出现偏差,比例调节会立即产生调节效果,减少偏差。特点:工艺简单快捷,比例作用大,可加快调整速度,减少误差;但它降低了系统的稳定性,导致不稳定和残余误差。
积分参数:积分环节主要用于消除静态误差。所谓静态误差,就是系统稳定后输出值与设定值之差。积分环节其实就是累积偏差的过程,把累积的误差加上原来有一个系统来抵消系统造成的静态差异。
微分参数:微分信号反映了偏差信号的变化规律,或变化趋势,根据偏差信号的变化趋势进行超前调整,从而提高系统的快速性。
PID的基本离散表示如上。目前的表达形式属于位置PID,另一种表达形式是增量PID,从上面的表达式可以很容易地得到:
所以:
上式是离散化PID的增量表示。从公式可以看出,增量表达结果与最后3次的偏差有关,大大提高了系统的稳定性。请注意,最终输出应为:
输出 = + 增量调整值
三、PID的C语言实现
1.位置PID的C语言实现
上面已经抽象了位置PID和增量PID的数学表达式。这里重点介绍C语言代码的实现过程。
第一步:定义PID变量结构体,代码如下:
结构 t_pid{
浮动设置速度;//定义设置值
浮动实际速度;//定义实际值
浮动错误;//定义偏差值
浮动 err_last; //定义最后的偏差值
浮动 Kp,Ki,Kd; //定义比例、积分和微分系数
浮动电压;//定义电压值(控制执行器的变量)
浮点积分;//定义整数值
}pid;
第二部分:初始化变量,代码如下:
无效 PID_init(){
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.电压=0.0;
pid.integral=0.0;
pid.Kp=0.2;
pid.Ki=0.015;
pid.Kd=0.2;
}
统一初始化变量,尤其是Kp、Ki、Kd这三个参数,在调试过程中,通过调整这三个量可以直接调整所需的控制效果。
第三步:编写控制算法,代码如下:
浮动PID_realize(浮动速度){
pid.SetSpeed=速度;
pid.err=pid.SetSpeed-pid.ActualSpeed;
pid.integral+=pid.err;
pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
返回 pid.ActualSpeed;
}
注意:这里使用最基本的算法实现形式。不考虑死区问题,不设上下限。只是公式的直接实现,后面的介绍中会逐步完善。
至此,PID的基本实现部分已经初步完成。这是测试代码:
诠释主要(){
PID_init();
整数计数=0;
而(计数
{
浮动速度=PID_realize(200.0);
printf(“%fn”,速度);
计数++;
}
返回0;
}
2.增量PID的C语言实现
上一节介绍了位置PID的最简单实现,本节讲解增量PID的实现。
#包括
#包括
结构 t_pid{
浮动设置速度;//定义设置值
浮动实际速度;//定义实际值
浮动错误;//定义偏差值
浮动 err_next; //定义最后的偏差值
浮动 err_last; //定义最高偏差值
浮动 Kp,Ki,Kd; //定义比例、积分和微分系数
}pid;
无效 PID_init(){
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.err_next=0.0;
pid.Kp=0.2;
pid.Ki=0.015;
pid.Kd=0.2;
}
浮动PID_realize(浮动速度){
pid.SetSpeed=速度;
pid.err=pid.SetSpeed-pid.ActualSpeed;
浮动增量速度=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
pid.ActualSpeed+=incrementSpeed;
pid.err_last=pid.err_next;
pid.err_next=pid.err;
返回 pid.ActualSpeed;
}
诠释主要(){
PID_init();
整数计数=0;
而(计数
{
浮动速度=PID_realize(200.0);
printf(“%fn”,速度);
计数++;
}
返回0;
}
3.积分分离PID控制算法
在普通PID控制中,引入积分环节的目的主要是为了消除静态误差,提高控制精度。但在启动、结束或大幅增加或减少设定时,系统输出会在短时间内出现较大偏差,导致PID运算的积分累加,导致控制值超过极限控制值对应于执行器可能允许的最大动作范围。从而造成较大的超调,甚至振荡,这是绝对不允许的。
为了克服这个问题,引入了积分分离的概念。其基本思想是当控制量偏离设定值较大时取消积分作用;当被控变量接近给定值时,引入积分控制,消除静差,提高精度。具体实现代码如下:
pid.Kp=0.2;
pid.Ki=0.04;
pid.Kd=0.2; //初始化过程
if(abs(pid.err)>200)
{
索引=0;
}别的{
指数=1;
pid.integral+=pid.err;
}
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last); //算法的具体实现过程
4.抗积分饱和PID控制算法C语言实现
所谓积分饱和现象是指如果系统在一个方向上出现偏差,由于积分作用的不断累积,PID控制器的输出会增加,从而使执行器到达极限位置。如果控制器输出U(k)继续增加,则执行器的开度不能再增加,此时计算机的输出控制量超出正常工作范围,进入饱和区。一旦系统出现反向偏差,u(k) 就会逐渐退出饱和区。进入饱和区越深,离开饱和区的时间越长。在这段时间内,执行器仍然停留在极限位置,并没有立即随着偏差的反转而做出相应的变化。此时,系统就像失控,导致控制性能恶化。这种现象称为积分饱和现象或积分失控。现象。
防止积分饱和的方法之一是反积分饱和法。这种方法的思路是,在计算u(k)时,首先判断上一时刻的控制变量u(k-1)是否已经超出极限范围:如果u(k-1) >umax,只累积负偏差;如果 u(k-1)
结构 t_pid{
浮动设置速度;//定义设置值
浮动实际速度;//定义实际值
浮动错误;//定义偏差值
浮动 err_last; //定义最后的偏差值
浮动 Kp,Ki,Kd; //定义比例、积分和微分系数
浮动电压;//定义电压值(控制执行器的变量)
浮点积分;//定义整数值
浮动 umax;
浮标;
}pid;
无效 PID_init(){
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.电压=0.0;
pid.integral=0.0;
pid.Kp=0.2;
pid.Ki=0.1; //注意,和前几次相比,这里积分链接的值增加了
pid.Kd=0.2;
pid.umax=400;
pid.umin=-200;
}
浮动PID_realize(浮动速度){
整数索引;
pid.SetSpeed=速度;
pid.err=pid.SetSpeed-pid.ActualSpeed;
if(pid.ActualSpeed>pid.umax) //灰色背景表示实现反积分饱和
{
if(abs(pid.err)>200) //蓝色标记为积分分离过程
{
索引=0;
}别的{
指数=1;
如果(pid.err
{
pid.integral+=pid.err;
}
}
}否则如果(pid.ActualSpeed
if(abs(pid.err)>200) //积分分离过程
{
索引=0;
}别的{
指数=1;
如果(pid.err>0)
{
pid.integral+=pid.err;
}
}
}别的{
if(abs(pid.err)>200) //积分分离过程
{
索引=0;
}别的{
指数=1;
pid.integral+=pid.err;
}
}
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
返回 pid.ActualSpeed;
}
5.梯形积分的PID控制算法
先看梯形算法的积分链接公式
作为PID控制律的积分项,其作用是消除残余误差。为了尽量减少残差,需要提高积分项的运算精度。因此,可以将矩形积分改为梯形积分。具体实现语句为:
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral/2+pid.Kd*(pid.err-pid.err_last); // 梯形积分
6.变积分PID控制算法
变积分PID可以看作是积分分离的PID算法的更一般形式。在常见的PID控制算法中,由于积分系数是恒定的,所以在整个控制过程中积分增量是恒定的。但是,系统对积分项的要求是,当系统偏差较大时,积分效应要减弱甚至不存在,当偏差较小时,要加强积分效应。如果积分系数过大,会出现过冲,甚至积分饱和。如果积分系数太小,则不能在短时间内消除静态误差。因此pid控制器参数整定与实现,需要根据系统的偏差来改变积分速度。
变积分PID的基本思想是试图改变积分项的累积速度,使其与偏差相对应:偏差越大,积分越慢;偏差越小,积分越快。
在这里,在积分系数之前添加了一个比例值指数:
当绝对(错误)
当180
当abs(err)>200时,index=0;
最终尺度链接的尺度系数值为ki*index;
具体PID实现代码如下:
pid.Kp=0.4;
pid.Ki=0.2; //添加积分系数
pid.Kd=0.2;
浮动PID_realize(浮动速度){
浮动指数;
pid.SetSpeed=速度;
pid.err=pid.SetSpeed-pid.ActualSpeed;
if(abs(pid.err)>200) //变量积分过程
{
索引=0.0;
}否则如果(绝对(pid.err)
索引=1.0;
pid.integral+=pid.err;
}别的{
指数=(200-abs(pid.err))/20;
pid.integral+=pid.err;
}
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
返回 pid.ActualSpeed;
}
7.专家 PID 和模糊 PID
从前面的解释不难看出,PID的控制思想非常简单,其主要问题和难点在于比例、积分、微分环节的参数设定过程。对于具有确定的执行器控制模型或简单控制模型的系统,参数的设置可以通过计算得到。对于一般对精度要求不高的执行器系统,可以采用拼凑法进行实验设置。
然而,在实际的控制系统中,线性系统毕竟很少,大部分系统都是非线性系统,或者说系统模型不确定的系统。如果要求控制精度高,则需要进行参数的整定过程。难的。专家 PID 和模糊 PID 旨在满足这一需求。专家算法和模糊算法都属于智能算法的范畴。智能算法最大的优点是可以在控制模型未知的情况下对模型进行控制。这里需要注意的是,专家PID或模糊PID绝对不是专家系统或模糊算法与PID控制算法的简单相加。是专家系统或模糊算法在PID控制器参数整定中的应用。也就是说,
专家系统和模糊算法都需要参数调优的依据,也就是说,在任何情况下,都有一个设定什么值的依据。这个基础是一些逻辑的组合。只需找出逻辑组合关系即可。证据再明显不过了。先说专家PID的C语言实现。如前所述,我们需要找到一些依据,我们必须从PID系数本身开始。
(1)。比例系数的作用是加快系统的响应速度,提高系统的调整精度。系统越大,系统响应速度越快,调整幅度越大系统精度,但容易产生超调,甚至造成系统不稳定,数值过小会降低调节精度,响应速度慢,延长调节时间,导致系统的静态和动态特性恶化;
(2)。积分作用系数的作用是消除系统的稳态误差。值越大,系统的静态误差消除越快,但如果太大,则响应过程初期会出现积分饱和现象,会导致响应过程中的超调量过大,过小将难以消除系统的静态误差,影响调节精度系统;
(3)。微分系数的作用是改善系统的动态特性。它的作用主要是抑制响应过程中任意方向的偏差变化,提前预测偏差变化但是,如果过大,响应过程会提前制动,增加了整定时间,降低了系统的抗扰性。
反映系统性能的两个参数是系统误差e和误差的变化规律,很容易理解:
首先,我们指定一个error的极限值,假设为Mmax;指定了一个比较大的error值,假设为Mmid;指定了一个较小的误差值,假定为 Mmin;
当abs(e)>Mmax时,说明误差的绝对值已经很大了。无论误差趋势如何,都应考虑控制器的输入应以最大值(或最小值)输出,以达到快速调整误差的效果,使误差的绝对值在最大速度。在这种情况下,就相当于实现了开环控制。
当e*ec>0时,表示误差正朝着误差绝对值增大的方向变化。这时候如果abs(e)>Mmid,说明误差也很大,可以认为控制器实现了很强的控制效果。为了实现扭转误差的绝对值向减小的方向变化,误差的绝对值迅速减小。此时如果 abs(e)
当e*err0或e=0时pid控制器参数整定与实现,表示误差的绝对值在递减方向变化,或者已经达到平衡状态,此时控制器输出可以保持不变。
当 e*err
当 abs(e)
上述逻辑判断过程实际上是对控制系统的专家判断过程。
实际上,模糊算法属于智能算法,智能算法也可以称为非模型算法。智能算法包括专家系统、模糊算法、遗传算法和神经网络算法。事实上,这些算法中的任何一种都可以与PID结合,选择的关键是不能满足处理的实时性。当我们的处理器足够快时,我们可以选择更复杂、精度更高的算法。然而,控制器的处理速度限制了我们的算法选择。当然,成本是限制处理器速度的最根本原因。将模糊PID应用于一般控制系统是没有问题的。
模糊算法实际上并不模糊。模糊算法实际上是一个逐次细化的过程。这是一个例子。我们设计了一个倒立摆系统。如果摆针的偏差小于5°,我们就说它的偏差比较“小”;当摆针的偏差在5°到10°之间时,我们说它的偏差处于“中间”状态;当摆针的偏差大于10°时,我们说它的偏差有点“大”。对于“小”、“中”、“大”这样的词,都是精确的表达,但问题是,如果摆针的偏差是3°,那么这是一种什么样的状态呢?我们可以用“小”来表达。如果是7°,可以说是“中”和“小”。那么如果达到80°,它的偏差可以说是“非常大”。我们调整的过程,其实就是让系统的偏差从一个非常“大”逐渐过渡到一个非常“小”的过程。当然,我们系统的这个调整过程是快速而稳定的。通过上面的描述,可以实现每个状态可以分为大、中、小三种状态,但是它们的隶属度是不一样的。比如6°属于small的度数可能是0.3,隶属度是0.7,隶属度是0。这里其实有一个问题,就是,如何确定这种从属关系的程度?这需要我们设计一个隶属函数。详情可以在相关资料中找到,这里没有办法详细解释。然后,知道隶属度,就可以根据当前隶属度来控制电机旋转的速度和方向。当然,最终的控制量必须在控制电压上执行。很容易想到这一点。我们控制的目的是将倒立摆从属于“大”度1的状态调整到属于“小”度1的状态。当隶属度较大时,我们加快调整速度,当会员数较小时,我们放慢调整速度,进行微调。但问题是,大中小状态都是汉字,怎么能用数字表示,再用程序代码表示呢?实际上,我们可以设置三个数字来代表大、中、小三种状态。比如大用3表示,中用2表示,小用1表示。那么我们可以用1*0.3+2*0.7+3*0.@ >0=1. 7 来表示它。当然,这个公式不一定是这样的。该公式的设计是一个系统模糊化和精确化的过程。读者也可以参考相关文献进行理解。但就数字1.7而言,可以看出目前6°的角度偏差在中小之间,但更偏向中。我们可以根据这个数字来调整电机的转速和时间。当然,
前面的例子已经基本解释了模糊算法的基本原理。然而,在实践中,一个系统的限制因素往往不是一个。在上面的例子中,只有偏差角成为系统调整的参考因素。在实际系统中,比如PID系统,需要对比例、积分、微分三个环节进行调整,那么这三个环节的作用就需要认识。考虑到根据震荡情况等信息对这三个环节的调整比例,输入和输出不是单一的,它们之间必然存在某种内在的逻辑联系。所以这种逻辑联系成为了我们设计工作的重点。
四、PID算法参数整定方法
1.临界比例法
(1) 将调节器积分时间设置为最大,微分时间设置为零,比例δ适当,平衡运行一段时间,系统进入自动运行。
(2)逐渐减小比例δ,得到等幅振荡过程,记下临界比例和临界振荡周期。
(3)根据求和值,利用经验公式,计算调节器的各个参数,即δ, , .
(4)按“先P,后I,后D”的操作程序,将调节器的调整参数调整到计算值,如果不满意,可以进一步调整。
临界振荡调谐公式
2.衰减曲线法
在纯比例作用下,将比例从大到小调整,得到一个有衰减比(4:1)的过渡过程,记下此时的比例和振荡周期,根据经验公式计算对应的积分) 时间和微分时间。
衰减曲线法控制器参数计算表
注:(1)。对于响应速度较快的控制系统,很难识别4:1衰减曲线并读出Ts。这种情况下,可以将记录来回振荡两次以达到稳定为4:1衰减过程。(2)。在生产过程中,负载变化会影响工艺特性。当负载变化较大时,必须重新调整调节器的参数值。(< @3).如果考虑4:1衰减太慢,应该应用10:1衰减过程。对于10:1衰减曲线方法,调节调节器参数的步骤是准确的同上,只是计算公式略有不同。
3.经验
根据经验,首先将控制器参数置于一定值上,直接在封闭控制系统中通过改变给定值施加干扰,看输出曲线的形状,用δ, , , 的规则调整控制过程,为指引。测试相应的参数,直到它们合适为止。
长期生产实践中总结的参数表
4.经验公式
参数调优找到最佳,从小到大的顺序。
首先是比例,然后是积分,最后是微分。
曲线振荡非常频繁,比例刻度盘需要放大。
曲线围绕大湾浮动,刻度盘转向小。
请登录后发表评论
注册
社交帐号登录