PID控制器开发笔记

上传人:人*** 文档编号:512317649 上传时间:2023-10-01 格式:DOCX 页数:5 大小:40.83KB
返回 下载 相关 举报
PID控制器开发笔记_第1页
第1页 / 共5页
PID控制器开发笔记_第2页
第2页 / 共5页
PID控制器开发笔记_第3页
第3页 / 共5页
PID控制器开发笔记_第4页
第4页 / 共5页
PID控制器开发笔记_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《PID控制器开发笔记》由会员分享,可在线阅读,更多相关《PID控制器开发笔记(5页珍藏版)》请在金锄头文库上搜索。

1、PID控制器开发笔记之二:积分分离PID控制器的实现前面的文章中,我们已经讲述了 PID控制器的实现,包括位置型PID控制器和增量型PID控制器。 但这个实现只是最基本的实现,并没有考虑任何的干扰情况。在本节及后续的一些章节,我们就来讨 论一下经典 PID 控制器的优化与改进。这一节我们首先来讨论针对积分项的积分分离优化算法。1、基本思想我们已经讲述了 PID 控制引入积分主要是为了消除静差,提高控制精度。但在过程的启动、结束或大 幅度增减设定值时,短时间内系统输出有很大偏差,会造成 PID 运算的积分累积,引起超调或者振荡。 为了解决这一干扰,人们引入了积分分离的思想。其思路是偏差值较大时,

2、取消积分作用,以免于超 调量增大;而偏差值较小时,引入积分作用,以便消除静差,提高控制精度。具体的实现步骤是:根据实际情况,设定一个阈值;当偏差大于阈值时,消除积分仅用 PD 控制;当 偏差小于等于阈值时,引入积分采用 PID 控制。则控制算法可表示为:kU(k) = Kperr(k) + 工 err(j) + /Crf(err(k) 戶oerr(k 1)其中0称为积分开关系数,其取值范围为:|err(/c)| e由上述表述及公式我们可以知道,积分分离算法的效果其实与值的选取有莫大关系,所以值的选 取实际上是实现的难点,值过大则达不到积分分离的效果,而值过小则难以进入积分区,值的 选取存在很大

3、的主观因素。对于经典的增量式PID算法,似乎没有办法由以上的公式推导而来,因为0随着err(k)的变化在不是 修改着控制器的表达式。其实我们可以换一种角度考虑,每次系统调节未定后,偏差应该为零,然后 只有当设定值改变时,系统才会响应而开始调节。设定值的改变实际上是一个阶跃变化,此时的控制输出记为U0开始调节时,其调节增量其实与之前的一切没有关系。所以我们就可以以变化时刻开始为起点,而得到带积分分离的增量算法,以保证在启动、停止和快速变化时防止超调。公式如下:二 Kp (err(k) - err(k - 1) + |3K梓件伙)+ Kd(err(k) 2err(k - 1) + err(k 2)

4、其中 0 的取值与位置型 PID 算法一致。可能有人会担心偏差来回变化,造成积分作用的频繁分离和引 入,进而使上述的增量表达式无法实现。其实我们分析一下就能发现,在开始时,由于设定值变化引 起的偏差大而分离了积分作用,在接近设定值时,偏差变小就引入了积分,一边消除静差,而后处于 稳态,直到下一次变化。2、算法实现这一部分,我们根据前面对其基本思想的描述,来实现基于积分分离的PID算法实现,同样是包括位 置型和增量型两种实现方式。首先我们来看一下算法的实现过程,具体的流程图如下:|e(k)|e否是更新数据输出PID控制器PD控制器结束开始采集数据计算偏差或k)有上图我们知道,与普通的PID算法的

5、区别,只是判断偏差的大小,偏差大时,为PD算法,偏差小 时为PID算法。于是我们需要一个偏差检测与积分项分离系数0的函数。static uint16_t BetaGeneration(float error,float epsilon)uint16_t beta=0;if(abs(error)setpoint-processValue;vPID-integral+=thisError;uint16_tbeta= BetaGeneration(error,vPID-epsilon);if(beta0) vPID-result=vPID-proportiongain*thisError+vPID-

6、derivativegain*(thisError-vPID-lasterror);elsevPID-result=vPID-proportiongain*thisError+vPID-integralgain*vPID-integral+vPID-derivative gain*(thisError-vPID-lasterror);vPID-lasterror=thisError;与普通的 PID 算法的区别就是上述代码中增加了偏差判断,来决定积分项的分离与否。(2)增量型PID算法实现对于增量型PID控制,我们也可以采取相同的处理。首先定义PID对象的结构体:/*定义结构体和公用体*/ty

7、pedef structfloatsetpoint;/设定值floatproportiongain;/比例系数floatintegralgain;/积分系数floatderivativegain;/微分系数floatlasterror;/前一拍偏差floatpreerror;/前两拍偏差floatdeadband;/死区floatresult; /输出值float epsilon; /偏差检测阈值 PID;接下来实现PID控制器:void PIDRegulation(PID *vPID, float processValue)floatthisError;floatincrement;floa

8、tpError,dError,iError;thisError=vPID-setpoint-processValue; / 得到偏差值pError=thisError-vPID-lasterror;iError=thisError;dError=thisError-2*(vPID-lasterror)+vPID-preerror;uint16_tbeta= BetaGeneration(error,vPID-epsilon);if(beta0)increment=vPID-proportiongain*pError+vPID-derivativegain*dError; /增量计算else i

9、ncrement=vPID-proportiongain*pError+vPID-integralgain*iError+vPID-derivativegain*dError;/增量计算vPID-preerror=vPID-lasterror; / 存放偏差用于下次运算vPID-lasterror=thisError;vPID-result+=increment;这就实现了增量型PID控制器积分分离算法,也没有考虑任何的干扰条件,仅仅只是对数学公式的计 算机语言化。3、总结 积分分离算法的思想非常简单。当然,对于0的取值,很多人提出了改进措施,例如分多段取值,设 定多个阈值、2、3、4等,不过这些阈值也需要根据实际的系统来设定。除了分段取值外,甚至1234也有采用函数关系来获取0值。当然,这样处理后就不再是简单的积分分离了,特别是在增量型算法 中,实际上已经演变为一种变积分算法了。已经偏离了积分分离算法的设计思想,在后面我们会进一 步说明。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号