理论部分见我之前的博客,一阶ESO相比起来实现更简单,也更好理解,可帮助新手入门使用。虽然常见的物理系统,绝大多都是二阶系统,如F=ma, 做位置控制时,一般用二阶ESO。但是一阶ESO也有一定的用途,后面有空把之前做的一阶ESO的实际案例开源出来。
simulink模型已上传网盘
链接:https://pan.baidu.com/s/1q7zgYNjGXXrAHaaPCSZqFA
提取码:2579
1、公式推导
一阶系统模型:
拓展为2阶系统:
建立起观测器:
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文件文章来源:https://www.toymoban.com/news/detail-742853.html
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);
}
使用方法:文章来源地址https://www.toymoban.com/news/detail-742853.html
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
到了这里,关于ADRC——一阶ESO扩张状态观测器simulink实现及C语言代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!