基于EKF扩展卡尔曼滤波的PMSM无传感器控制 仿真实现了永磁电机无传感器转速闭环控制。 其中,永磁同步电机采用数学模型进行建模,将卡尔曼滤波器作为自适应系统控制电机工作,该算法适用于高性能伺服系统,可以在很大的速度范围工作,在低速状态下能快速完成闭环。 由仿真结果可以看到初始阶段和上升阶段转速的误差较大,但随着转速的上升及稳定,误差逐渐减少,可以说明选择合适的协方差矩阵,基于EKF的无传感器技术能满足实现电机控制性能的要求。 文件包含: [1]一个仿真文件 [2]EKF卡尔曼滤波器源代码 [3]相关参考文献

最近在折腾永磁同步电机(PMSM)无传感器控制,发现扩展卡尔曼滤波(EKF)这玩意儿确实有意思。传统观测器在低速容易翻车,EKF硬是通过概率模型把转速和位置都给估出来了。今天咱们就掰开揉碎了聊聊这个事,顺便把仿真代码里几个关键点拎出来看看。

先看电机模型部分。PMSM在dq坐标系下的电压方程长得挺规整:

% PMSM动态模型
function dx = motor_model(t, x, u)
    Ld = 0.001; Lq = 0.001; R = 0.5; J = 0.01; B = 0.1; P = 4;
    lambda_m = 0.1;
    
    id = x(1); iq = x(2); w = x(3); theta = x(4);
    ud = u(1); uq = u(2);
    
    did = (ud - R*id + Lq*w*iq)/Ld;
    diq = (uq - R*iq - Ld*w*id - lambda_m*w)/Lq;
    dw = (3/2*P*(lambda_m*iq + (Ld-Lq)*id*iq) - B*w)/J;
    dtheta = w;
    
    dx = [did; diq; dw; dtheta];
end

这里有个坑要注意:电感参数Ld和Lq如果设置不对,整个观测器立马抽风。之前仿真时把Ld设成0.01,结果转速估计直接飞天上不来了,调了三天才发现是这货的问题。

EKF的核心在状态预测和修正这两板斧。看看预测阶段的骚操作:

def predict(self, u):
    # 状态转移
    self.x = self.f(self.x, u)
    # 雅可比矩阵计算
    F = self.jacobianF(self.x, u)
    # 协方差预测
    self.P = F @ self.P @ F.T + self.Q

这里的雅可比矩阵计算绝对是技术活。以转速w的偏导数计算为例:

% 雅可比矩阵F计算片段
df4dw = - (3*P^2*(lambda_m*iq + (Ld-Lq)*id*iq))/(2*J) * Ts;
df4did = (3*P^2*(Ld-Lq)*iq)/(2*J) * Ts;

这种偏导要是手算分分钟出错,建议直接上符号计算工具。之前用Matlab的jacobian函数自动生成代码,结果仿真速度慢了五倍,最后还是硬着头皮手写了。

观测模型也别掉以轻心。实测发现只测相电流的话,低速时观测器容易迷路。后来改成电流+反电动势观测,效果立竿见影:

// 观测方程(C代码片段)
float h[2] = {
    id_est,
    iq_est + K * w_est * sin(theta_est)
};

这个K系数就是个玄学参数,调到0.7时波形突然就稳了,至今没想明白理论依据是啥。

基于EKF扩展卡尔曼滤波的PMSM无传感器控制 仿真实现了永磁电机无传感器转速闭环控制。 其中,永磁同步电机采用数学模型进行建模,将卡尔曼滤波器作为自适应系统控制电机工作,该算法适用于高性能伺服系统,可以在很大的速度范围工作,在低速状态下能快速完成闭环。 由仿真结果可以看到初始阶段和上升阶段转速的误差较大,但随着转速的上升及稳定,误差逐渐减少,可以说明选择合适的协方差矩阵,基于EKF的无传感器技术能满足实现电机控制性能的要求。 文件包含: [1]一个仿真文件 [2]EKF卡尔曼滤波器源代码 [3]相关参考文献

协方差矩阵调参堪称大型打地鼠现场。Q矩阵对角元素设大了,估计值抖得像帕金森;设小了又反应迟钝。最后找到个邪门规律:电流噪声设1e-4,转速噪声设1e-3,角度噪声设1e-5时效果最魔幻。

看看仿真结果曲线,启动瞬间转速估计误差能有200rpm,但0.2秒后就收敛到±10rpm以内。这说明EKF的预测能力确实顶,不过初始阶段的鬼畜波动也暴露出系统对初值敏感的问题。解决方案嘛,要么加个启动预定位,要么在初始阶段暂时切到开环。

最后扔个调试秘诀:把过程噪声协方差Q和观测噪声协方差R设成可调参数,直接在仿真里动态修改。这样能实时看到参数变化对系统的影响,比改代码重跑仿真高效十倍。具体实现就是在Simulink里加几个滑动条模块,谁用谁知道。

参考文献打包扔网盘了,重点推荐那篇1994年的经典论文《Sensorless Control of PMSM Using EKF》,虽然年头久但干货十足。仿真代码建议从空载启动开始调,别一上来就加负载,容易怀疑人生。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐