基于抗积分饱和(Anti-windup)的自适应PID控制(白嫖程序模型)

发布于:2022-12-29 ⋅ 阅读:(798) ⋅ 点赞:(0)

目录

前言

 1.抗饱和的变结构PID控制算法

 2.仿真实例

2.1PID Contoller自动调参

2.2基于Anti-Windup的PID控制

2.2.1s函数编写控制器

 2.2.2搭建模型

 2.2.3查看结果

2.2.4总结


前言

由于控制系统的非线性饱和(个人通俗理解成控制输入饱和)特性,导致控制器windup问题,进而影响系统稳定性,针对这一问题,可以采用基于An-windup的自适应PID控制(抗饱和的变结构PID控制算法)解决这类问题,其主要与传统PID不同在于,将PI/PID积分部分产生的饱和不良现象进行补偿,即对积分环节采用自适应变化律

 1.抗饱和的变结构PID控制算法

A.S.Hodel等提出PID积分环节的自适应变化律:

 进而,基于Anti-windup的PID控制算法为:

 2.仿真实例

以简单的二阶系统为例:

 指令信号为10的阶跃信号,umin = 0,umax = 10,即限定控制输入在[0,10]范围内,将其与传统PID仿真进行对比。

2.1PID Contoller自动调参

在这里之前我想复习以下之前学习过的PID controller模块的自动调节tune功能使用方法:

①简单搭建以下模型:

 ②打开PID  controller模块,刚开始使用要先“Apply”,后点击“tune”

 ③进入如下界面,通过滑动“Response Time”和“Transient Behavior”调节自己所需的超调量,响应时间等

 ④调节好后,可以查看调节的超调量,峰值,裕度等信息,调节合适后,点击“Update Block”更新P、I、D值在我们Simulink的模块中。

 ⑤查看结果

2.2基于Anti-Windup的PID控制

2.2.1s函数编写控制器

function [sys,x0,str,ts]=Adp_PID(t,x,u,flag)
switch flag,
case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
case 1,
    sys=mdlDerivatives(t,x,u);
case 3,
    sys=mdlOutputs(t,x,u);
case {2, 4, 9 }
    sys = [];
otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 1;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 3;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 0;
sys=simsizes(sizes);
x0=[0];
str=[];
ts=[];
function sys=mdlDerivatives(t,x,u)
e=u(1);
un=u(2);
us=u(3);

ki=10;
alfa=1.0;

umin=0;umax=10;
ua=(umin+umax)/2;
if un~=us&e*(un-ua)>0
   dxite=-alfa*(un-us)/ki;
else
   dxite=e;
end
sys(1)=dxite;
function sys=mdlOutputs(t,x,u)
sys(1)=x(1);   %η

 2.2.2搭建模型

 2.2.3查看结果

 基于Anti-Windup的控制输出

 普通PID的控制输出

2.2.4总结

可以看到基于Anti-Windup的自适应PID能够使控制输出实现正常调节,而普通PID由于控制系统的饱和现象导致输出不正常,即windup现象,验证了通过自适应调节积分环节参数达到补偿调节的效果。

注:仅为便利自己学习,错误在所难免,如有侵权,请联系删除,有兴趣的学者可以参考学习交流,谢谢!

参考资料

《先进PID控制MATLAB仿真》

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到