理想的pid算法往往不能满足实际使用中的很多场景,比如积分饱和的问题,因此需要在此基础上对积分器做抗饱和处理,积分anti windup的优化。这不,隆哥这次面试,直接挂在这么基础的知识点上,肠子悔青,在这里简单总结一下。
1、什么是积分饱和
积分饱和(integral windup或integrator windup)是指pid控制器或是其他有积分器的控制器中可能会发生的一种现象。
这种现象往往发生在误差有大幅变化(例如大幅增加),积分器因为误差的大幅增加有很大的累计量,因为积分器的输出满足下式;
离散化形式表示为:
所以随着时间的增加,每次累积较大的误差 ,很容易造成积分饱和并产生较大的过冲,而且当误差变为负时,其过冲仍维持一段时间之后才恢复正常的情形。
2、实际的例子
这里举一个直流电机调速例子,先看下图;
隆哥设定了转速为 ,这里可以是100 rpm,但是由于某种原因电机一开始堵转了,所以反馈的转速 为0;
这时候仍然处于堵转状态,那偏差 就会一直处于很大的状态,积分器对偏差 进行累积,便迅速达到一个很大的值,导致pid的输出已经接近输出的 上限,导致最终输出的pwm的占空比很大;
此时,堵转忽然消失,但是前面提到pid的输出已经接近输出的 上限,因此电机转速也急剧上升,当 时, ,此时偏差都处于负数状态;
虽然误差变成负数,并且积分器开始累加负数,但是由于之前积分器累积的值已经很大,于是,pid依然会保持较大的输出一段时间,从而产生了很大的过冲;
通常会产生的输出如下图所示;
从图中我们不难发现,这里有三个过程;
过程①:因为这个过程存在 较大幅度变化的误差,因此积分器累积了较大的值,从图中可以看到,积分器的面积比较大(阴影部分);过程②:此时积分已经饱和,产生了较大的过冲,并且在较长的一段时间内,一直处于过冲的状态;过程③:积分脱离饱和状态,产生了积极的调节作用,消除静差,系统输出达到设定值;
3、负面影响
积分器的作用是消除系统稳态误差,如果出现积分饱和,往往会对系统造成负面的影响;
系统输出会产生较大的过冲(超调量);
如果产生正向饱和(图一所示)则系统对于反向的变化会偏慢;
系统产生了较大的过冲 ,并且较大的一段时间 都处于过冲的状态;具体如下图所示;
4、如何防止积分饱和
为了防止pid控制器出现积分饱和,需要在算法加入抗积分饱和(anti-integral windup)的算法;通常有以下几种措施;
积分分离或者称为去积分算法;
在饱和的时候将积分器的累计值初始化到一个比较理想的值;
若积分饱和因为目标值突然变化而产生,将目标值以适当斜率的斜坡变化可避免此情形;
将积分累计量限制上下限,避免积分累计量超过限制值;
如果 pid输出已经饱和,重新计算积分累计量,使输出恰好为合理的范围;
ti文档中的方法
下面是ti的位置式pi算法所做的改进,如下图所示;
比例部分的输出:
积分部分的输出:
未做处理的pid输出:
最终pid输出 :
抗积分饱和用的系数
根据我的理解,由上述输出和①式可知,判断系统是否处于饱和的状态;
如果 ,说明积分器处于饱和状态,此时使 系数为0,这样防止积分进一步进行累积。
反计算抗饱和法
反计算anti-windup法,简称aw法,就是在输出限幅部分根据输入信号和输出信号的差值,把 作为反馈值输入到积分部分,从而达到抑制积分饱和现象的目的;
具体如下图所示;
不难发现,在输出未饱和的情况下, 因此不会对积分器造成影响;当系统发生饱和时,则 ;
现在假设此时为正向饱和,则 ,那么 ,所以最终将 反馈到积分部分;那么从图中可知,相当于从 中减去了 ,这样可以削弱积分,让它退出饱和的状态;
关于 系数, 越大,积分器退出饱和的作用越强,反之则越弱;
当然,积分抗饱和的方法还有很多 遇限积分削弱法,遇限保留积分法 ,这只是其中的一种,下面给出ti的位置式pid算法,增量式的抗饱和处理也是类似的做法。
5、pid算法(抗饱和)
ti的算法中只实现了比例和积分,如果需要微分项,可以去除结尾部分的注释;
/* ===========
file name: pid_reg3.h (iq version) =*/ #ifndef __pidreg3_h__ #define __pidreg3_h__ typedef struct { _iq ref; // input: reference input _iq fdb; // input: feedback input _iq err; // variable: error _iq kp; // parameter: proportional gain _iq up; // variable: proportional output _iq ui; // variable: integral output _iq ud; // variable: derivative output _iq outpresat; // variable: pre-saturated output _iq outmax; // parameter: maximum output _iq outmin; // parameter: minimum output _iq out; // output: pid output _iq saterr; // variable: saturated difference _iq ki; // parameter: integral gain _iq kc; // parameter: integral correction gain _iq kd; // parameter: derivative gain _iq up1; // history: previous proportional output } pidreg3; typedef pidreg3 *pidreg3_handle; /*-----------------------------------------------------------------------------default initalizer for the pidreg3 object.--*/ #define pidreg3_defaults { 0, \ 0, \ 0, \ _iq(1.3), \ 0, \ 0, \ 0, \ 0, \ _iq(1), \ _iq(-1), \ 0, \ 0, \ _iq(0.02), \ _iq(0.5), \ _iq(1.05), \ 0, \ } /*------------------------------------------------------------------------------ pid macro definition------------------------------------------------------------------------------*/ #define pid_macro(v) \ v.err = v.ref - v.fdb; /* compute the error */ \ v.up= _iqmpy(v.kp,v.err); /* compute the proportional output */ \ v.ui= v.ui + _iqmpy(v.ki,v.up) + _iqmpy(v.kc,v.saterr); /* compute the integral output */ \ v.outpresat= v.up + v.ui; /* compute the pre-saturated output */ \ v.out = _iqsat(v.outpresat, v.outmax, v.outmin); /* saturate the output */ \ v.saterr = v.out - v.outpresat; /* compute the saturate difference */ \ v.up1 = v.up; /* update the previous proportional output */ #endif // __pidreg3_h__ // add the lines below if derivative output is needed following the integral update // v.ud = _iqmpy(v.kd,(v.up - v.up1)); // v.outpresat = v.up + v.ui + v.ud;
手机电池充电技巧
锡膏为什么特别容易变干?
大疆教育机器人机甲大师新品,将于3月9日线上发布
贸泽电子备货TI四通道1 GSPSADS54J64模数转换器,高信噪比、高带宽和500 MSPS
Elektrobit提供高度集成加载程序
一文解析PID的积分抗饱和原理
TB1240与TB1238的不同之处
微软已修复Windows102004设备用户显示器黑屏问题
米粉期待的来了:小米平板3将于4月6日发布! 5月量产,依旧情怀价你期待吗?
DG900函数/任意波形发生器的功能及产品特点分析
一款中国研制的自动驾驶飞行器参加试飞
PLC程序设计常见的编程方法
一加3T评测:“高配版”的真旗舰 升级有哪些?
气派独创CPC封装 将替代SOP,BP、矽威力挺
Inventek物联网照明解决方案系统架构分析
路灯装上这些传感器后,不仅能变色还能节约电费
谷歌在Stadia上可玩的游戏的全部产品阵容
华为nova2怎么样?华为nova2主打拍照高颜值,这款2499元新机到底值不值得买?
莫之比隆重推出大货车盲区监测雷达
救护车警笛电路设计调试分享