当前位置: 首页 > news >正文

滑膜观测器

滑膜观测器

文章目录

  • 滑膜观测器
    • 1. 基本原理
    • 2. 滑模观测器的构成
    • 3. 滑模观测器的特点
    • 4. C语言实现
    • 5. 代码说明:
    • 6. 代码中的公式
      • 1. 电流估计更新公式
        • 公式解释:
      • 2. 反电动势估计更新公式
        • 公式解释:
      • 3. 转子位置计算公式
        • 公式解释:
    • 7. 注意事项:
      • 8. 总结

滑模观测器(Sliding Mode Observer, SMO)是一种基于滑模控制理论的状态观测器,用于估计电机或者其他非线性系统中的状态变量,比如转速、转子位置、负载扰动等。滑模观测器因其对模型不确定性和外部扰动具有很强的鲁棒性,广泛应用于电机控制领域,尤其是在永磁同步电机(PMSM)和感应电机(IM)中。

1. 基本原理

滑模观测器的设计基于滑模控制的思想。滑模控制是一种非线性控制方法,通过设计一个滑模面(sliding surface)使得系统的状态沿着滑模面滑动,从而达到控制目标。滑模观测器利用这一原理,通过设计观测器使得观测误差趋近于零,达到对系统状态的准确估计。

2. 滑模观测器的构成

  1. 系统模型:滑模观测器依赖于系统的数学模型,比如电机的状态空间模型。通常,系统模型可以表示为:
    x ˙ ( t ) = A x ( t ) + B u ( t ) + d ( t ) \dot{x}(t) = Ax(t) + Bu(t) + d(t) x˙(t)=Ax(t)+Bu(t)+d(t)
    y ( t ) = C x ( t ) y(t) = Cx(t) y(t)=Cx(t)
    其中, x ( t ) x(t) x(t) 是系统的状态向量, u ( t ) u(t) u(t) 是输入向量, y ( t ) y(t) y(t) 是输出向量, A A A B B B C C C 是系统矩阵, d ( t ) d(t) d(t) 是不确定性或扰动。

  2. 滑模面设计:滑模观测器设计的关键在于滑模面的选择,通常滑模面可以设计为观测误差的函数:
    s ( x , x ^ ) = C ( x − x ^ ) s(x, \hat{x}) = C(x - \hat{x}) s(x,x^)=C(xx^)
    其中, x ^ \hat{x} x^ 是观测器的状态估计。

  3. 滑模控制律:滑模观测器通过切换控制律来保证系统的滑模面趋于零,从而实现状态的准确估计。典型的滑模控制律包含一个符号函数:
    x ^ ˙ ( t ) = A x ^ ( t ) + B u ( t ) + K ⋅ sign ( s ( x , x ^ ) ) \dot{\hat{x}}(t) = A\hat{x}(t) + Bu(t) + K \cdot \text{sign}(s(x, \hat{x})) x^˙(t)=Ax^(t)+Bu(t)+Ksign(s(x,x^))
    其中, K K K 是滑模增益, sign ( s ( x , x ^ ) ) \text{sign}(s(x, \hat{x})) sign(s(x,x^)) 是滑模控制的符号函数,用于引导观测误差收敛。

3. 滑模观测器的特点

  1. 鲁棒性强:滑模观测器对系统参数变化和外部扰动有较强的鲁棒性,因为滑模控制的切换机制能够有效抑制这些不确定性。

  2. 收敛速度快:滑模观测器通常能快速逼近系统的实际状态,具有很快的动态响应特性。

  3. 抖振现象:由于符号函数的存在,滑模观测器在实际应用中可能会引起高频的抖振(chattering)现象,这在电机控制中需要通过滤波或其它技术加以抑制。

4. C语言实现

#include "math.h"
#include "stdio.h"// 定义电机参数
#define L 0.001f      // 电感
#define R 1.0f        // 电阻
#define Ke 0.01f      // 反电动势常数
#define Ts 0.001f     // 采样时间// 定义滑模观测器增益
#define K_slide 100.0f
#define EPSILON 0.001f// 滑模观测器状态变量
typedef struct {float i_alpha;  // Alpha 轴电流估计值float i_beta;   // Beta 轴电流估计值float e_alpha;  // Alpha 轴反电动势估计值float e_beta;   // Beta 轴反电动势估计值
} SMO_State;// 电机模型输入结构
typedef struct {float v_alpha;  // Alpha 轴电压float v_beta;   // Beta 轴电压float i_alpha;  // Alpha 轴电流实际值float i_beta;   // Beta 轴电流实际值
} Motor_Input;// 符号函数
float sign(float x) {if (x > 0.0f) return 1.0f;if (x < 0.0f) return -1.0f;return 0.0f;
}// 滑模观测器的更新函数
void SMO_Update(SMO_State *state, Motor_Input *input) {// 计算电流估计误差float i_alpha_error = input->i_alpha - state->i_alpha;float i_beta_error = input->i_beta - state->i_beta;// 更新电流估计state->i_alpha += Ts * ((input->v_alpha - R * state->i_alpha - state->e_alpha) / L + K_slide * sign(i_alpha_error));state->i_beta += Ts * ((input->v_beta - R * state->i_beta - state->e_beta) / L + K_slide * sign(i_beta_error));// 更新反电动势估计state->e_alpha += Ts * (-K_slide * sign(i_alpha_error));state->e_beta += Ts * (-K_slide * sign(i_beta_error));
}// 计算转子位置(使用反电动势矢量)
float Calculate_Rotor_Position(SMO_State *state) {return atan2f(state->e_beta, state->e_alpha);
}int main() {// 初始化滑模观测器状态SMO_State smo_state = {0.0f, 0.0f, 0.0f, 0.0f};// 初始化电机输入 (这里用一些假数据)Motor_Input motor_input = {1.0f, 0.5f, 0.2f, 0.1f};// 更新滑模观测器for (int i = 0; i < 1000; i++) {SMO_Update(&smo_state, &motor_input);// 计算转子位置float rotor_position = Calculate_Rotor_Position(&smo_state);// 输出转子位置printf("Step %d: Rotor Position = %f radians\n", i, rotor_position);}return 0;
}

5. 代码说明:

  1. 参数定义

    • LRKe分别表示电机的电感、电阻和反电动势常数。
    • Ts表示采样时间。
  2. 滑模观测器状态变量SMO_State结构体包含估算的电流值和反电动势值。

  3. 电机输入结构Motor_Input结构体包含电压和实际测量的电流。

  4. 符号函数sign函数用于滑模控制中的切换逻辑。

  5. SMO_Update函数:这个函数是滑模观测器的核心,用于更新电流和反电动势的估计。

  6. Calculate_Rotor_Position函数:这个函数通过计算反电动势的角度来估算转子的位置。

  7. 主函数main函数中初始化了滑模观测器状态和电机输入,运行一个简单的模拟循环,输出每一步的转子位置估计值。

6. 代码中的公式

1. 电流估计更新公式

在滑模观测器的SMO_Update函数中,电流估计的更新公式如下:

state->i_alpha += Ts * ((input->v_alpha - R * state->i_alpha - state->e_alpha) / L + K_slide * sign(i_alpha_error));
state->i_beta += Ts * ((input->v_beta - R * state->i_beta - state->e_beta) / L + K_slide * sign(i_beta_error));
公式解释:
  • Ts:采样时间(时间步长)。
  • input->v_alphainput->v_beta:实际测得的Alpha轴和Beta轴电压。
  • R:电阻。
  • state->i_alphastate->i_beta:估计的Alpha轴和Beta轴电流。
  • state->e_alphastate->e_beta:估计的Alpha轴和Beta轴反电动势。
  • L:电感。
  • K_slide:滑模增益。
  • sign(i_alpha_error)sign(i_beta_error):符号函数,用于滑模控制的切换逻辑。
  • i_alpha_errori_beta_error:电流估计误差,即实际电流与估计电流的差值。

这个公式的基本思路是:

  • 通过测得的电压和估计的电流、电阻、反电动势来更新电流估计。
  • 添加滑模控制项来减小估计误差,提高鲁棒性。

2. 反电动势估计更新公式

在滑模观测器的SMO_Update函数中,反电动势的更新公式如下:

state->e_alpha += Ts * (-K_slide * sign(i_alpha_error));
state->e_beta += Ts * (-K_slide * sign(i_beta_error));
公式解释:
  • Ts:采样时间(时间步长)。
  • state->e_alphastate->e_beta:估计的Alpha轴和Beta轴反电动势。
  • K_slide:滑模增益。
  • sign(i_alpha_error)sign(i_beta_error):符号函数,用于滑模控制的切换逻辑。
  • i_alpha_errori_beta_error:电流估计误差,即实际电流与估计电流的差值。

这个公式的基本思路是:

  • 通过电流估计误差来更新反电动势估计。
  • 通过滑模控制项调整反电动势估计值,增加鲁棒性。

3. 转子位置计算公式

Calculate_Rotor_Position函数中,转子位置的计算公式如下:

return atan2f(state->e_beta, state->e_alpha);
公式解释:
  • atan2f:计算反电动势矢量在Alpha轴和Beta轴上的角度,得到转子位置。
  • state->e_alphastate->e_beta:估计的Alpha轴和Beta轴反电动势。

7. 注意事项:

  1. 定时器中断:在实际应用中,SMO_Update函数通常会在定时器中断中调用,以确保采样时间Ts的准确性。

  2. 优化编译:在STM32平台上编译时,确保开启了优化选项以提高代码执行效率。

  3. 硬件支持:确保STM32硬件配置正确,如ADC采样、电流传感器接口、PWM输出等,这些都是电机控制系统正常运行的基础。

  4. 该代码使用了非常简化的模型和假设,在实际应用中,电机模型和滑模观测器的设计会更加复杂。

  5. 实际应用中可能需要更多的滤波和抗扰措施,以应对噪声和抖振现象。

8. 总结

滑模观测器是一种强大且实用的状态观测工具,特别适合应用于电机控制领域,具有鲁棒性强和收敛速度快的优点。然而,由于可能存在的抖振问题,在设计和应用中需要采取适当的措施进行处理。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络爬虫--生成假数据
  • 【零知识证明】构建第一个zk
  • python-带空格的数字层三角形
  • SQL视图:简化复杂查询的利器
  • 详细说一下MVCC
  • 电脑强制退出程序快捷键
  • redis内存数据库的专业术语雪崩、击穿、穿透的名词解释
  • 二分法介绍
  • Python生成指定数量的随机XML文件
  • 572. 另一棵树的子树
  • Python自动化:Excel根据IP匹配网段获取所属源端口
  • 探索OpenCV:图像处理基础与实践
  • 如何解决“Intel (R) Wireless-AC 9560 160MHz 设备无法启动“?
  • SpringBoot下调用kettle脚本
  • Linux--数据链路层(macarp)
  • 2017届校招提前批面试回顾
  • Apache Spark Streaming 使用实例
  • express.js的介绍及使用
  • Java教程_软件开发基础
  • passportjs 源码分析
  • Python 反序列化安全问题(二)
  • vue 个人积累(使用工具,组件)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 创建一种深思熟虑的文化
  • 浮现式设计
  • 后端_MYSQL
  • 蓝海存储开关机注意事项总结
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • Semaphore
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​520就是要宠粉,你的心头书我买单
  • # windows 安装 mysql 显示 no packages found 解决方法
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (10)STL算法之搜索(二) 二分查找
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (void) (_x == _y)的作用
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (剑指Offer)面试题34:丑数
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (五)activiti-modeler 编辑器初步优化
  • (一)80c52学习之旅-起始篇
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .a文件和.so文件
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Core与存储过程(一)
  • .net 托管代码与非托管代码
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net和php怎么连接,php和apache之间如何连接
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .stream().map与.stream().flatMap的使用
  • ::