永磁同步电机自抗扰控制ADRC(位置环/速度环控制器)Matlab/Simulink仿真(S-Function)

经典PID控制器的主要缺陷为:阶跃信号下的初始误差较大,系统存在快速性与超调之间的矛盾;微分器对噪声敏感,微分信号容易被噪声淹没失去作用;误差积分容易使系统产生振动,对扰动的抑制响应较慢。

自抗扰控制(ADRC)技术的核心思想是将简单的积分串联型视为标准模型,把系统模型中不同于标准型的部分和外部干扰之和视为总扰动,并将其扩张为一个新的状态。通过状态估计,反馈线性化等将被控对象还原为标准的积分串联系统,最后为该积分串联系统设计状态反馈控制律,简化设计使得结构简单,物理意义明确。

自抗扰控制器由TD、ESO、和NLSEF这三个各具独特优点的主要部分组成,具有结构简单,响应速度快、动静态性能良好、不依赖于被控对象的精确模型、抗扰动能力强等诸多优点,在非线性控制领域以及其他复杂控制环境中得到了大量应用和认可。ADRC中的TD用来安排合适的过渡过程,得到输入信号快速且无超调的跟踪信号和优质的微分信号。ESO是ADRC的核心,其作用是跟踪被控对象的输出,同时给出受控对象的各阶状态变量以及系统总扰动的实时估计,将其补偿到控制器中,实现动态补偿线性化。NLSEF采用非线性函数把TD产生的跟踪及微分信号与ESO给出的状态变量估计值之间的误差进行非线性组合得到初级控制量,然后同总扰动的补偿量一起生成最终的控制信号。

过渡过程中的fhan(x1,x2,r,h)函数计算公式为:

\left\{\begin{matrix} d=rh\\ d_{0}=hd\\ y=x_{1}+hx_{2}\\ a_{0}=\sqrt{d^{2}+8r\left | y \right |}\\ a=\left\{\begin{matrix} x_{2}+\frac{a_{0}-d}{2},\left | y \right |>d_{0}\\ x_{2}+\frac{y}{h},\left | y \right |\leq d_{0} \end{matrix}\right.\\ fhan=\left\{\begin{matrix} -rsign(a),\left | a \right |>d\\-\frac{ra}{d},\left | a \right |\leq d \end{matrix}\right. \end{matrix}\right.

扩张观测器中的fal()函数为:

fal(\varepsilon ,\alpha ,\delta )=\left\{\begin{matrix} \left | \varepsilon \right |^{2}sign(\varepsilon ),\left | \varepsilon \right |>\delta \\ \frac{\varepsilon }{\delta ^{1-\alpha }},\left | \varepsilon \right |\leq \delta \end{matrix}\right.

作为位置控制器的仿真如下:

一阶状态变量为角度,二阶状态变量为转速,控制信号量为指令转速:

x\dot{}_{1}=x_{2}

x\dot{}_{2}=[(\frac{3}{2}\frac{P_{n}^{2}\psi _{f}^{2}}{JR}-\frac{B}{J})x_{2}+\frac{3}{2}\frac{P_{n}\psi _{f}}{JR}U_{q}-b_{0}u-\frac{T_{L}}{J}]+b_{0}u

令一个高阶状态变量为x_{3}=(\frac{3}{2}\frac{P_{n}^{2}\psi _{f}^{2}}{JR}-\frac{B}{J})x_{2}+\frac{3}{2}\frac{P_{n}\psi _{f}}{JR}U_{q}-b_{0}u-\frac{T_{L}}{J}

上式变为:

x\dot{_{1}}=x_{2}

x\dot{_{2}}=x_{3}+b_{0}u

x\dot{_{3}}=f(u,x_{2},T_{L}...)

式中最后一项f()代表各类误差,内外扰动构成的综合扰动项,表达式计算复杂,建模难以保证准确,扰动变量无法预测,因此很难得到可靠的解析解。但如果能得到这个非实际状态变量的实时近似观测值,同样也可以对系统进行误差补偿。扩张观测器经过非线性逼近的方式,得到足够接近X3的值,那么令u=\frac{u_{0}-x_{3}}{b_{0}},即可达到闭环。

S-Function代码如下:

function [sys,x0,str,ts,simStateCompliance]=sfun_ADRC(t,x,u,flag,r,h)
switch flag
    case 0
        [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
    case 2
        sys=mdlUpdate(t,x,u,r,h);
    case 3
        sys=mdlOutputs(t,x,u);
    case {1,4,9}
        sys=[];
    otherwise
       DAStudio.error('simulink:blocks:unhandledFlag',num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=8;
sizes.NumOutputs=8;
sizes.NumInputs=2;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[0;0;0;0;0;0;0;0];
str=[];
ts=[1e-6 0];

simStateCompliance='UnknownSimstate';
function sys=mdlUpdate(t,x,u,r,h)
b=0.01;
h_1=0.1;
h_2=0.01;
delta=0.01;
beta0=0;
beta1=150;
beta2=150;
beta01=100;
beta02=500;
beta03=1000;
alpha0=0.001;
alpha1=5;
alpha2=1.2;

z1=x(1);
z2=x(2);
z3=x(3);
v1=x(4);
v2=x(5);
e0=x(6);
e1=x(7);
uf=x(8);
v=u(1);
y=u(2);
%% TD
v1=v1+h_1*v2;
v2=v2+h_1*fhan(v1-v,v2,r,h);

%% ESO
e=z1-y;
z1=z1+h_2*(z2-beta01*e);
z2=z2+h_2*(z3-beta02*fal(e,0.5,delta)+b*uf);
z3=z3+h_2*(-beta03*fal(e,0.25,delta));

%% NLSEF
e1=v1-z1;
e0=e0+e1;
if e0>1000
    e0=1000;
else if e0<-1000
        e0=-1000;
    end
end

e2=v2-z2;
u0=beta1*fal(e1,alpha1,delta)+beta2*fal(e2,alpha2,delta)+beta0*fal(e0,alpha0,delta);
% u0=-fhan(e1,c*e2,r0,h);
uf=(u0-z3)/b;
if uf>3000
    uf=3000;
else if uf<-3000
        uf=-3000;
    end
end
sys=[z1;z2;z3;v1;v2;e0;e1;uf];
function sys=mdlOutputs(t,x,u)
sys=x;

 搭建模型如下:

 其中r和h的取值为:

得到的位置响应为:

 作为速度控制器:

将机械运动方程改写为:\frac{d\omega }{dt}=f_{0}+b_{0}i_{q}^{*}=\frac{K_{t}i_{q}}{J}-\frac{B\omega }{J}-\frac{T_{L}}{J},其中f_{0}=(-B\omega -T_{L}+K_{t}(i_{q}-i_{q}^{*}))/J看作系统内外部扰动之和。

S-Function代码如下:

function [sys,x0,str,ts,simStateCompliance]=sfun_VelADRC2(t,x,u,flag,r,h)
switch flag
    case 0
        [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
    case 2
        sys=mdlUpdate(t,x,u,r,h);
    case 3
        sys=mdlOutputs(t,x,u);
    case {1,4,9}
        sys=[];
    otherwise
       DAStudio.error('simulink:blocks:unhandledFlag',num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=8;
sizes.NumOutputs=8;
sizes.NumInputs=2;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[0;0;0;0;0;0;0;0];
str=[];
ts=[1e-6 0];

simStateCompliance='UnknownSimstate';
function sys=mdlUpdate(t,x,u,r,h)
b=10;
h_1=0.1;
h_2=0.01;
delta=0.001;
beta0=10;
beta1=40;
beta2=200;
beta01=100;
beta02=500;
beta03=1000;
alpha0=0.5;
alpha1=0.5;
alpha2=0.25;

z1=x(1);
z2=x(2);
z3=x(3);
v1=x(4);
v2=x(5);
e0=x(6);
e1=x(7);
uf=x(8);
v=u(1);
y=u(2);
%% TD
v1=v1+h_1*v2;
v2=v2+h_1*fhan(v1-v,v2,r,h);

%% ESO
e=z1-y;
z1=z1+h_2*(z2-beta01*e);
z2=z2+h_2*(z3-beta02*fal(e,0.5,delta)+b*uf);
z3=z3+h_2*(-beta03*fal(e,0.25,delta));

%% NLSEF
e1=v1-z1;
e0=e0+e1;
if e0>1000
    e0=1000;
else if e0<-1000
        e0=-1000;
    end
end

e2=v2-z2;
u0=beta1*fal(e1,alpha1,delta)+beta2*fal(e2,alpha2,delta)+beta0*fal(e0,alpha0,delta);
% u0=-fhan(e1,c*e2,r0,h);
uf=(u0-z3)/b;
if uf>7.5
    uf=7.5;
else if uf<-7.5
        uf=-7.5;
    end
end
sys=[z1;z2;z3;v1;v2;e0;e1;uf];
function sys=mdlOutputs(t,x,u)
sys=x;

搭建模型为:

r,h的值及内部模型如下:

得到的位置和速度响应如下:

参考文献: 

[1]留若宸. 多电机伺服系统同步控制研究[D].浙江大学,2020.DOI:10.27461/d.cnki.gzjdx.2020.000807.
[2]黄文俊. 基于优化ADRC的伺服控制技术的研究与开发[D].江南大学,2017.

  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
自抗扰技术(ADRC)是一种控制技术,能够对一些不确定性和干扰起作用的系统进行控制,并在实际应用中取得了良好的效果。由此,许多电动机的控制系统均采用了ADRC技术。 基于自抗扰技术的永磁同步电机电流控制器Simulink仿真是一种用于评估电机控制算法的方法。 SimulinkMATLAB中的一个仿真境,允许对系统进行建模并对其进行仿真。 针对永磁同步电机目前广泛使用矢量控制技术来提高性能的问题,研究人员提出了一种基于自抗扰技术的电流控制算法。该算法是通过逆推法来获取永磁同步电机模型,然后将其与ADRC控制器结合使用来提高控制性能。通过此Simulink仿真,可以分析该算法的性能和其实际应用的可行性。 具体而言,Simulink仿真主要有两个方面:一是建模永磁同步电机,包括永磁同步电机的电路、机械和电子方面的元件及其相互作用的系统;二是构建ADRC算法,并将其集成到永磁同步电机控制中,通过仿真实验分析ADRC算法控制永磁同步电机中的表现。 在Simulink仿真中,可以对永磁同步电机在各种情况下的性能进行仿真研究。通过分析仿真结果,可以调整和改进算法,并最终在实际系统中实现更稳定和高效的永磁同步电机控制。 总之,基于自抗扰技术的永磁同步电机电流控制器Simulink仿真控制系统研究领域中一种重要的方法,可以提高控制系统的性能并加速实际应用中的研究。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值