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;
}
运行与验证方法
最小验证流程:
- 给定一组恒定电压输入(如
v_alpha=5.0V,v_beta=0V)和初始电流为0,以1kHz采样率(Ts=0.001s)循环调用SMO_Step。 - 同时用真实电机模型(
di/dt = (-R_s·i + v - e_true)/L_s)仿真电流,其中e_true设为已知正弦或恒定值(如e_alpha=1.0V,e_beta=0.5V)。 - 将仿真电流作为观测器输入,运行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倍以上,否则需改用双线性变换离散化。