4. SMO在αβ坐标系下的实现

任务目标

在静止αβ坐标系下,基于永磁同步电机(PMSM)的电压方程构建滑模观测器(SMO),通过滑模面收敛提取反电动势(EMF)分量,进而为后续转子位置/速度估算提供输入。本案例聚焦于SMO核心算法的离散化实现与反电动势提取验证。

必要环境与依赖

  • 语言:C语言(适用于MCU/DSP移植)
  • 数学库:math.h(仅使用sqrt、fabs)
  • 输入:αβ轴电压指令v_alpha、v_beta,αβ轴电流采样i_alpha、i_beta
  • 电机参数:定子电阻R_s、定子电感L_s、反电动势系数K_e(用于验证对比)

核心原理与实现

PMSM在αβ坐标系下的电流方程为:

di_alpha/dt = (-R_s·i_alpha + v_alpha - e_alpha) / L_s
di_beta/dt = (-R_s·i_beta + v_beta - e_beta) / L_s

其中e_alpha、e_beta为反电动势。SMO构造电流观测器,用滑模控制律z = K·sign(i_hat - i)作为等效反电动势估计。当滑模面s = i_hat - i = 0到达后,控制律的低频分量即等于真实反电动势。本实现采用饱和函数替代符号函数以减小抖振,并通过一阶低通滤波器提取等效控制量。

关键完整代码

#include <math.h>

typedef struct {
    float R_s;        // 定子电阻 (Ω)
    float L_s;        // 定子电感 (H)
    float K_slide;    // 滑模增益
    float lp_fc;      // 低通滤波截止频率 (Hz)
    float Ts;         // 采样周期 (s)

    // 内部状态
    float i_alpha_hat;
    float i_beta_hat;
    float e_alpha_lp;
    float e_beta_lp;
    float lp_alpha;
    float lp_beta;
} SMO_AlphaBeta;

// 饱和函数:限制在 ±delta 内
static float sat(float x, float delta) {
    if (x > delta) return delta;
    if (x < -delta) return -delta;
    return x;
}

// 初始化观测器
void SMO_Init(SMO_AlphaBeta *smo, float R_s, float L_s, float K_slide,
              float lp_fc, float Ts) {
    smo->R_s = R_s;
    smo->L_s = L_s;
    smo->K_slide = K_slide;
    smo->lp_fc = lp_fc;
    smo->Ts = Ts;
    smo->i_alpha_hat = 0.0f;
    smo->i_beta_hat = 0.0f;
    smo->e_alpha_lp = 0.0f;
    smo->e_beta_lp = 0.0f;
    smo->lp_alpha = 0.0f;
    smo->lp_beta = 0.0f;
}

// 单步执行:输入电压/电流采样,输出反电动势估计
void SMO_Step(SMO_AlphaBeta *smo, float v_alpha, float v_beta,
              float i_alpha, float i_beta,
              float *e_alpha_out, float *e_beta_out) {
    float Ts = smo->Ts;
    float L_s = smo->L_s;
    float R_s = smo->R_s;

    // 电流观测误差
    float err_alpha = smo->i_alpha_hat - i_alpha;
    float err_beta = smo->i_beta_hat - i_beta;

    // 滑模控制律(饱和函数,边界层 delta=0.5)
    float z_alpha = smo->K_slide * sat(err_alpha, 0.5f);
    float z_beta = smo->K_slide * sat(err_beta, 0.5f);

    // 电流观测器离散化(前向欧拉)
    smo->i_alpha_hat += Ts * ((-R_s * smo->i_alpha_hat + v_alpha - z_alpha) / L_s);
    smo->i_beta_hat += Ts * ((-R_s * smo->i_beta_hat + v_beta - z_beta) / L_s);

    // 低通滤波器提取等效反电动势(一阶惯性环节)
    float w_lp = 2.0f * 3.14159265f * smo->lp_fc;
    float alpha_lp = w_lp * Ts / (1.0f + w_lp * Ts);

    smo->lp_alpha += alpha_lp * (z_alpha - smo->lp_alpha);
    smo->lp_beta += alpha_lp * (z_beta - smo->lp_beta);

    // 输出滤波后的反电动势估计
    *e_alpha_out = smo->lp_alpha;
    *e_beta_out = smo->lp_beta;
}

运行与验证方法

最小验证流程:

  1. 给定一组恒定电压输入(如v_alpha=5.0V,v_beta=0V)和初始电流为0,以1kHz采样率(Ts=0.001s)循环调用SMO_Step。
  2. 同时用真实电机模型(di/dt = (-R_s·i + v - e_true)/L_s)仿真电流,其中e_true设为已知正弦或恒定值(如e_alpha=1.0V,e_beta=0.5V)。
  3. 将仿真电流作为观测器输入,运行2000步(2秒)至稳态。

通过条件:

  • 观测器电流i_alpha_hat、i_beta_hat收敛至仿真电流值(误差<0.01A)。
  • 输出e_alpha_out、e_beta_out稳态值与设定的e_true偏差<10%(例如设定1.0V/0.5V,输出应在0.9~1.1V和0.45~0.55V范围内)。
  • 滑模增益需满足K_slide > max(|e_alpha|, |e_beta|),建议取2~3倍反电动势幅值以保证收敛。

参数参考:R_s=2.5Ω,L_s=8.5mH,K_slide=10,lp_fc=200Hz,Ts=0.0001s(10kHz)。若使用恒定反电动势验证,需将真实反电动势值代入电流仿真模型,而非直接给定电压。

常见问题

  • 抖振过大:增大饱和函数边界层(当前0.5)或降低滑模增益,但需保证增益仍大于反电动势幅值。
  • 相位滞后:低通滤波器截止频率越高,滞后越小但滤波效果变差;实际应用中需根据转速范围折中,或后续采用锁相环补偿。
  • 离散化误差:采样频率应至少为电机电频率的20倍以上,否则需改用双线性变换离散化。