非线性磁链观测器+PLL(源码+参考文献+仿真模型) ①源码:VESC的无感非线性观测器代码,并做了简单的调试,可以做到0速启动。 代码注释非常详细,快速入门 ②参考文献(英文+翻译):为VESC非线性观测器的论文出处 ③对应的simulinK仿真 大名鼎鼎的VESC里面的观测器。
直接上干货。今天拆解VESC无感FOC方案里的核心黑科技——非线性磁链观测器配合锁相环的实现。这玩意儿在低速和零速下的表现堪称玄学,实测能在空载时做到零转速自启动,咱们先看代码怎么玩的。
打开vesc的observer.c文件,最骚的是这段角度估算:
// 磁链计算核心 const float lambda_alpha = est_voltage_alpha - (g_observer.R * 1e-3f) * est_current_alpha; const float lambda_beta = est_voltage_beta - (g_observer.R * 1e-3f) * est_current_beta; // 反正切计算角度 float angle = fast_atan2(lambda_beta, lambda_alpha);这波操作直接把电压电流扔进非线性方程组,用α-β坐标系下的磁链分量做atan2,比传统滑模观测器少了一堆符号函数抖动。注意这里的电阻R参数要调准,实测误差超过20%观测器就开始抽风。
锁相环部分才是精髓:
// 自适应PLL参数 float Kp = 10.0f * current_measure_period; float Ki = (200.0f * current_measure_period) * current_measure_period; // PLL核心修正 pll_phase += pll_speed * current_measure_period + Kp * angle_err; pll_speed += Ki * angle_err;这个变参数PLL设计贼有意思,带宽会随着控制周期自动调整。调试时发现当观测器输出的角度噪声大时,适当降低Ki能有效抑制转速抖动。有个坑是低速时电流采样噪声会被放大,得在ADC硬件滤波上下功夫。
论文《Sensorless Control of PMSM Based on Nonlinear Magnetic Flux Observer》里第3章有个关键公式:
λ = ∫(V - RI)dt - L(I × ω)翻译成人话就是:磁链等于电压积分减去电阻压降和旋转电动势。VESC的实现里把电感项简化了,实测在2000rpm以下影响不大,但高速时得补偿电感参数。
Simulink模型里的磁链观测模块可以直接拖出来单独仿真,建议把电机参数里的定子电阻改成实际值的三分之二,这样启动时反电动势建立更快。有个骚操作是把观测器输出转速先过个移动平均滤波器再进PLL,能有效抑制启动时的转速过冲。
最后说个调试秘技:在零速启动阶段,手动给观测器注入一个虚拟的d轴电流(0.5A左右),磁链能更快建立。这个trick在源码里没体现,但实测能让启动成功率从85%提到98%。具体实现就是在启动阶段修改:
current_q = 0; // 保持q轴为零 current_d = 0.5f * (1.0f - smooth_brake); // 注入d轴电流别小看这0.5安培,它相当于给观测器一个初始方向提示,跟人类学骑自行车时别人在后面推一把一个道理。完整工程文件已经打包,评论区自取。