ADRC——一阶ESO扩张状态观测器simulink实现及C语言代码

本文介绍了一阶扩展状态观测器(ESO)的基本原理及其Simulink模型实现过程。通过公式推导和C语言代码示例,详细阐述了如何搭建一阶ESO并应用于扰动估计和控制。此外,还提供了仿真结果来验证所提方法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        理论部分见我之前的博客,一阶ESO相比起来实现更简单,也更好理解,可帮助新手入门使用。虽然常见的物理系统,绝大多都是二阶系统,如F=ma, 做位置控制时,一般用二阶ESO。但是一阶ESO也有一定的用途,后面有空把之前做的一阶ESO的实际案例开源出来。

simulink模型已上传网盘

链接:https://pan.baidu.com/s/1q7zgYNjGXXrAHaaPCSZqFA 
提取码:2579

1、公式推导

一阶系统模型:

\dot x=f(x,t)+bu \\

 拓展为2阶系统:

\dot x_1=x_2+bu \\ \dot x_2=g(x_1,x_2,t)

建立起观测器:

\begin{cases} e_1=y-z_1 \\ \dot z_1 =z_2+bu+\beta_{01}*fal(e_1,\alpha_1,\delta)\\ \dot z_2 =\beta_{02}*fal(e_1,\alpha_2,\delta) \end{cases}

fal函数:

 2、simulink

ESO代码

function [z1_hat,z2_hat] = fcn(y,u)
 
h=0.01;

 
persistent z1 z2 
if isempty(z1)  
    z1=0;
    z2=0;
end
 
e=y-z1;
 
fe1=fal(e,0.5,0.01);
fe2=fal(e,0.25,0.01);

z1=z1+h*(z2 + 100*fe1 + u);  %需要调参 <100,300>这两个参数
% 这里也可以写成 z1=z1+h*(z2 + 100*e + u);
z2=z2+ h*(300*fe2);


z1_hat=z1;
z2_hat=z2;

end
 
 
function f=fal(e,alpha,delta)
if abs(e)>delta
    f=abs(e)^alpha*sign(e);
else
    f=e/(delta^(1-alpha));
end
end

 模型搭建:

扰动估计效果:

 

控制效果

 

3、C语言代码 

.h文件

typedef struct
{
    float dt;
    float b;
    float z1_hat;
    float z2_hat;

    float alpha_1;
    float alpha_2;
    float delta_1;
    float beta_1;
    float beta_2;

    uint8_t start_flag;
} ESO_1order_pm_st;

.c文件

void ESO_1order(float y, float u, ESO_1order_pm_st *eso_pm)
{
    float e, fe1, fe2;
    if (eso_pm->start_flag == 0)
    {
        eso_pm->z1_hat = y;
        eso_pm->z2_hat = 0;
    }
    e = y - eso_pm->z1_hat;

    fe1 = fal(e, eso_pm->alpha_1, eso_pm->delta_1);
    fe2 = fal(e, eso_pm->alpha_2, eso_pm->delta_1);

    eso_pm->z1_hat += eso_pm->dt * (eso_pm->z2_hat + eso_pm->beta_1 * fe1 + eso_pm->b * u);
    eso_pm->z2_hat += eso_pm->dt * (eso_pm->beta_2 * fe2);
}

使用方法:

ESO_1order_pm_st  ESO_pm;

/*一阶ESO参数初始化*/

ESO_pm.dt = 0.001;
ESO_pm.alpha_1 = 0.5;
ESO_pm.alpha_2 = 0.25;
ESO_pm.b = 1.0f;

ESO_pm.delta_1 = 0.01;
ESO_pm.beta_1 = 50.0f;
ESO_pm.beta_2 = 100.0f;
ESO_pm.start_flag = 0;


 /*调用方法*/
ESO_1order(y, u, &ESO_pm);  //需要给入参数y和u

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值