滑膜观测器

滑膜观测器


滑模观测器(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. 总结

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

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值