扩展卡尔曼滤波与滑模观测器的结合,反电势波形近乎完美的正弦波形,观测器估算转子电角度与实际电角度相差0.3弧度左右,转速跟随效果较好。

电机控制圈子里总流传着一句话:"观测器设计得好,电机能给你跳芭蕾"。最近在调试永磁同步电机无感控制时,偶然发现扩展卡尔曼滤波(EKF)和滑模观测器(SMO)的混搭方案挺有意思。这俩家伙就像相声里的捧哏和逗哏,一个负责稳,一个负责狠。

先看实测波形(图1),反电势的波形像用圆规画出来的正弦曲线。这在传统滑模观测器里可不常见,毕竟SMO自带抖动的基因。秘诀在于用EKF处理非线性环节时的数值稳定性,给滑模的开关特性上了个柔光滤镜。

def sliding_mode(emf_alpha, emf_beta):
    s = np.array([emf_alpha - estimated_emf_alpha,
                 emf_beta - estimated_emf_beta])
    # 自适应滑模增益
    k = 0.5 * np.linalg.norm(speed_estimate) + 10
    return -k * np.sign(s)

这段代码里的门道在于滑模增益的自适应设计。传统固定增益在低速时容易引发高频噪声,这里用转速估计值动态调节,像给油门装了智能节气门。实测发现电机在500rpm时角度跟踪误差稳定在0.3rad左右,相当于17度的相位差,对于无位置传感器控制来说算是能交差的成绩。

转速跟踪曲线(图2)更值得玩味。启动阶段的延迟主要来自EKF的收敛过程,但进入稳态后两条曲线几乎重合。这里有个小技巧:把机械运动方程写进EKF的状态转移矩阵,相当于给观测器装了个物理引擎。

% EKF预测步片段
function [x_pred, P_pred] = predict(x, P, omega, dt)
    F = [1 -dt*x(3) -dt*x(2);
         dt*x(3) 1 dt*x(1);
         0 0 1]; % 状态转移矩阵
    Q = diag([0.01, 0.01, 0.1]); % 过程噪声
    x_pred = [x(1) - dt*x(3)*x(2);
             x(2) + dt*x(3)*x(1);
             x(3)]; % 非线性状态方程
    P_pred = F*P*F' + Q;
end

这个雅可比矩阵的构造暗藏玄机——把角速度ω作为状态量参与耦合,比传统线性化处理更贴合电机实际动力学。调试时发现Q矩阵的对角元素比例直接影响收敛速度,第三元素(对应转速噪声)适当加大能让观测器对负载突变更敏感。

实测中遇到过有意思的现象:当故意让实际转速阶跃变化时,观测器输出的角度会先有个小幅振荡,然后像橡皮筋一样"弹"到新平衡点。这暴露出两种观测器的动态特性差异——滑模的鲁棒性像急性子,EKF的优化特性像慢性子,二者配合需要找好节奏。

最后说个工程经验:别迷信理论上的渐近收敛,实际调试时在电流环采样中断里加点料,比如用估计角度的余弦值做前馈补偿,能让转速波动再降15%。毕竟再好的观测器也得落地到PWM波上才有价值,不是吗?

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐