当前位置: 首页 > 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. 总结

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


http://www.mrgr.cn/news/15713.html

相关文章:

  • 怎么批量生成静态二维码?文本静态码的批量生成技巧
  • 8.29笔记
  • C#实现仪表盘
  • 滚柱导轨:数控机床高效运行的驱动力
  • 模拟+思维(时间规划烧饼)
  • 【WiFi协议的发展学习1】
  • linux下cpu多核运行程序以及运行时间统计
  • 【复杂系统系列(初级)】自动调节动态平衡模型——生物体的稳态机制
  • 【HTML】使用过程中的随记
  • 关于springboot的Rest请求映射处理的源码分析(二)
  • 构建智慧人才档案,驱动未来发展新引擎 —— 解锁人才管理新篇章
  • 【C++类和对象】拷贝构造、运算符重载以及日期类的实现
  • pdf转dwg怎么转换?5个软件教你轻松转换文件
  • 投屏软件哪个好用又免费?4款投屏软件,远程且兼容多平台!
  • 矩阵性质简介
  • C#如何查看/写入日志到Windows事件查看器
  • 国产系统-共享文件夹
  • 关于Scrapy的那些事儿(四)Scrapy Shell
  • 集成电路学习:什么是ARM先进精简指令集计算机
  • 石油设备和相关机械都包涵那些?