自抗扰控制入门之ESO篇(纯小白入门向和ESO数学表达式的推导)

ESO是自抗扰控制器的核心 .ADRC仅需要系统的输入量和输出量作为信息来源, 通过扩张状态
观测器不仅可以得到各个状态变量的估计, 而且能够估计出不确定模型和外扰的实时作用量, 并在反
馈中加以补偿, 从而达到重新构造对象的目的

一:ESO的理论基础(状态观测器)

1.0 相关资源和B站视频连接(先看视频后看我的讲解,视频只有8分钟)

ESO本质上是一种卡尔曼滤波器的变形
理解卡尔曼滤波器_Part2_状态观测器(B站视频)

1.1 状态观测器的工作原理

以火箭举例子。我们要检测火箭发动机的内部温度。但是,由于技术问题,我们只能检测发动机的外部温度,在此情况下我们借助状态观测器(用数学模型 模仿一个火箭发动机)来判定其内部的温度。

下面的截图中上方是真实火箭发动机,下方的mathematical model是对应的数学模型。(截图来自我上面给视频链接)
在这里插入图片描述

在这里插入图片描述
实际系统的输出和观测器的输出相减做误差。此误差不断地进行反馈,最终为0,达到完美的状态观测。
途中带有 ^ 号的为观测器的输出量
在这里插入图片描述

二: ESO的推导

考虑系统
在这里插入图片描述
其中的β符号代表的是 反馈误差的反馈系数
令 x3 =f(x1 , x2 , t), ﹒x3 =g(x1 , x2 , t), 则g(x1 , x2 , t)也是未知函数 ,于是有
在这里插入图片描述
可取 α1 =0.5 =1/2, α2=0.25 =1/4(一般经验取值) a越小, 跟踪越快, 但滤波效果会变差,a2小于a1使得的得到噪音。

三 fal函数的讲解

Fal函数是 ADRC的核心单元 。Fal函数实际上是对控制工程界的一个经验知识 :“大误差 ,小增益 ;小误差 , 大增益 ”的数学拟合。模糊控制,智能控制 ,变增益 PID等方法, 本质上都是基于这种经验知识, 并且 Fal函数具有快速收敛的特性 , 所以 Fal函数成为后来常用的非线性反馈结构。

3.1 所参考论文

Fal函数滤波器的分析及应用

3.2 fal函数的讲解

在这里插入图片描述
v是一个带有噪声的输入信号, k为比例系数, a为 0 ~ 1之间的常数, δ为影响滤波效果的常数, 输出 y是带有噪声的信号 v通过滤波器后的输出信号 , 可以写为y=FalFilter(v, k, a, δ)。

k是调节响应速度的比例系数 , k越大, 跟踪越快, 但滤波效果会变差 。 a在 0 ~ 1之间取值, a越小, 跟踪越快, 但滤波效果会变差。所以需要在 k、a和 δ之间做一个综合考虑 。

关于a为何在 0 ~ 1之间取值。 α为 0 <α<1时可以。在小误差时应采用大增益 , 大误差时应采用小增益 。

如图 1所示 ,由于 Fal函数滤波器随着 e的变化具有不同的形式, 我们分别予以考虑 。当 e >δ
时 ,非线性反馈 keasign(e)可以使系统状态迅速的逼近输入信号 v,从而使误差 e趋近于 δ。当 e≤
δ时,实际上式(1)的结构为一个低通滤波器。这里kFal(e, a, δ)=ke/δ1 -a,设 k1 =k/δ1 -a,从输入 v到输
出 y写成传递函数的形式为 :
在这里插入图片描述在这里插入图片描述
它是一个低通滤波器。当 δ减小时, k1 增加 ,即截止频率增大, 带宽变宽 ,跟踪速度变快 ,但由于有更多的噪声信号通过 ,滤波效果变差 。同理,当δ增加时, k1 减小 ,带宽变窄 ,跟踪速度变慢, 但使得滤波效果变好。上面的分析结果不但说明了 Fal函数滤波器具有快速收敛以及滤波的本质原因 , 还说明了可用 δ来调整跟踪速度和和滤波效果的原因 。

<think>好的,我需要回答用户关于FAL函数定义、使用方法示例的问题。首先,用户提供了三个引用内容,我需要仔细阅读这些内容,确保回答准确并正确引用。 用户提到的引用[1]提到FAL的基本步骤,包括打开FAL、移植步骤中的定义设备、设备表分区表,以及调用fal_init()初始化。引用[2]详细说明了如何定义Flash设备表,特别是fal_cfg.h的位置配置方法。引用[3]介绍了FAL的目录结构基本组成,比如inc、src等目录,还有示例文档的位置。 接下来,我需要组织回答的结构。用户的问题包括函数定义、使用方法示例,所以需要分点回答。根据引用内容,FAL的关键函数可能包括fal_init()fal_partition_find()fal_partition_read/write/erase()等。需要确认这些函数的具体定义参数,可能参考引用中的步骤,比如初始化流程分区操作。 在定义部分,需要说明如何定义Flash设备分区表,这涉及到在fal_cfg.h中添加设备结构体分区表数组。使用方法部分,应该分步骤讲解初始化、查找分区、进行读写擦除操作。示例代码可能需要结合Python或其他语言,但根据引用中的示例,可能使用C语言更合适,因为FAL是RT-Thread的一部分,通常用C编写。 需要注意用户提到的系统级指令,比如行内数学表达式使用$...$,但这里可能不涉及数学公式。回答需用中文,结构清晰,引用标识要自然添加在对应的段落末尾。例如,在提到定义设备表时引用[2],初始化时引用[1]。 可能还需要验证是否正确引用了每个步骤对应的引用,比如定义设备表在引用[2],初始化在引用[1]。同时,确保代码示例正确,比如调用fal_init(),查找分区,然后进行读写操作。另外,用户可能需要知道如何移植FAL到具体工程中,这部分在引用[1][2]中有提到,需要整合到回答中。 最后,生成相关问题,可能需要围绕FAL的配置、移植、其他API函数或调试方法展开,确保问题与用户可能感兴趣的后续步骤相关。</think>### FAL函数定义与使用方法 #### 1. FAL核心函数定义 FAL(Flash抽象层)的核心函数定义在`inc/fal.h`头文件中,主要包含以下功能函数: - **初始化函数**:`fal_init()`用于初始化整个FAL库,需在应用启动时调用[^1] - **设备操作函数**:`fal_blk_read/write/erase()`等函数通过设备名称操作Flash设备 - **分区操作函数**:`fal_partition_read/write/erase()`通过分区名称操作指定分区 #### 2. 函数使用步骤 **步骤1:初始化FAL库** ```c int main(void) { fal_init(); // 初始化Flash抽象层[^1] /* 后续操作 */ } ``` **步骤2:查找指定分区** ```c const struct fal_partition *partition = fal_partition_find("download"); if (partition == NULL) { rt_kprintf("Partition not found!\n"); return -1; } ``` **步骤3:执行读写操作** ```c // 写入数据到分区 char buffer[512] = "Hello FAL!"; fal_partition_write(partition, 0, buffer, sizeof(buffer)); // 从分区读取数据 fal_partition_read(partition, 0, buffer, sizeof(buffer)); rt_kprintf("Read data: %s\n", buffer); ``` #### 3. 关键配置说明 - **Flash设备定义**:在`fal_cfg.h`中定义`struct fal_flash_dev`结构体数组,指定设备名称、地址、块大小等参数[^2] ```c static struct fal_flash_dev nor_flash0 = { .name = "nor_flash0", .addr = 0x08000000, .len = 1024*1024, .blk_size = 4096 }; ``` - **分区表定义**:在`fal_cfg.h`中配置`FAL_PART_TABLE`数组,定义分区名称、所属设备、偏移量大小[^2] ```c #define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WORD, "app", "nor_flash0", 0, 512*1024}, \ {FAL_PART_MAGIC_WORD, "download", "nor_flash0", 512*1024, 512*1024} \ } ``` #### 4. 应用示例 实现固件OTA升级的典型流程: ```c void firmware_update(void) { const struct fal_partition *download_part = fal_partition_find("download"); const struct fal_partition *app_part = fal_partition_find("app"); // 擦除应用程序分区 fal_partition_erase(app_part, 0, app_part->len); // 从下载分区拷贝固件 uint8_t buffer[4096]; for (int offset = 0; offset < download_part->len; offset += 4096) { fal_partition_read(download_part, offset, buffer, 4096); fal_partition_write(app_part, offset, buffer, 4096); } rt_kprintf("Firmware update completed!\n"); } ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值