搞无感FOC的朋友应该都遇到过这个尴尬:电机参数一堆,FOC控制框图也画得出来,但就是不知道转子转到哪了。编码器、霍尔能解决定位问题,但成本和安装空间摆在那里,很多场合就是不愿意加。于是“用龙贝格观测器提取电机反电势,再用PLL从反电动势里解出转子位置和转速”这套组合就成了很多实际项目的选择。
这篇文章是冲着“能复现”三个字写的。不是单纯讲公式推导,而是把我调试这套方案时踩过的坑、参数到底怎么给、为什么这么给、切换逻辑怎么处理,全部按实操顺序整理出来。适合正在做无感FOC的小白,也适合已经用了其他观测器方案、想横向对比的朋友。整套方案并不玄乎,核心就是把反电动势当作不可直接测量的状态,用观测器估出来,再交给锁相环把角度和速度“啃”出来。
1. 为什么选“龙贝格观测器+锁相环”而不是别的方案
1.1 无感FOC到底缺什么
FOC的核心是坐标变换。电流内环要工作在旋转坐标系下,就得知道转子磁场的实时角度;速度环要闭环,也得知道转速。有编码器的时候这些都不是问题,但无感控制下,这两个量全部要“算”出来。
永磁同步电机有一个天然的信息源,就是反电动势。反电动势的大小正比于转速,相位直接和转子电角度挂钩。只要能拿到反电动势的正交分量,角度和速度就有办法恢复。但反电动势没法直接量,电机端电压是一串PWM波,相电压和电流之间有复杂关系,只能靠模型估计。
这里就引出了核心矛盾:电机模型本身不完美,参数会漂移,采样有噪声,PWM开关还带来谐波。能不能把反电动势从这些干扰里“捞”出来,决定了整套无感控制能不能跑稳。
1.2 各种反电动势提取方式的取舍
在做方案选型的时候,我对比过几种主流思路。
直接微分法看着最简单,从电压方程反解出反电动势,问题是微分运算对噪声非常敏感,电流采样稍微有点毛刺,算出来的反电动势就全是毛刺。
滑模观测器鲁棒性好,但开关函数天然带来抖振,通常要加低通滤波压掉抖振,滤波一加上,反电动势的相位就滞后了,角度必须额外补偿。我早年在某个预研项目里试过滑模方案,调抖振和相位补偿花的时间比调主算法还多。
扩展卡尔曼滤波在噪声环境下的表现确实好,可是矩阵运算量大,MCU资源吃紧,Q矩阵、R矩阵的整定也依赖经验,对刚接触无感FOC的人来说门槛偏高。
龙贝格观测器的思路是:把反电动势当成一个额外的状态变量,和电流一起估计。它没有滑模那种抖振,实现代码量小,反馈增益还能用极点配置来设计,物理意义清楚。只要电机参数辨识得差不多,中高速段的表现非常稳。如果说滑模观测器是一把大锤,扩展卡尔曼是一整套工具箱,龙贝格观测器就是那把功能刚好的螺丝刀。
1.3 锁相环在这里的作用
有人会问,反电动势都估出来了,直接求角度不行吗?行,但效果不好。
反电动势里混着谐波和采样噪声,直接做角度运算,结果跳来跳去,而且象限判断、正负号处理都很麻烦。锁相环的价值在于它是一个闭环跟踪器,能自动把估计角度和真实角度的误差压到零,同时输出平滑的速度信号。
PLL本质上是一个带通或者低通性质的跟踪环路,对高频谐波有抑制作用,输出转速很干净,速度环可以直接用,基本不用额外滤。这就是“观测器负责拿到含有角度信息的正弦波,PLL负责把角度和转速从这个正弦波里精确解出来”的分工。
2. 龙贝格观测器的原理推导和参数设计
2.1 从电机方程出发
永磁同步电机在αβ静止坐标系下的电压方程不复杂:
uα = R·iα + Ls·diα/dt + eα
uβ = R·iβ + Ls·diβ/dt + eβ
其中反电动势分量为:
eα = -ψf·ωe·sinθe
eβ = ψf·ωe·cosθe
ψf是转子磁链,ωe是电角速度,θe是转子电角度。从这个表达式能看明白:反电动势的幅值正比于转速,相位就是转子位置的函数。所以只要把eα、eβ估出来,再对这个正交正弦信号做PLL,θe和ωe就能拿回来。
把电流方程改写一下,挪到状态空间:
diα/dt = -R/Ls·iα + uα/Ls - eα/Ls
diβ/dt = -R/Ls·iβ + uβ/Ls - eβ/Ls
这里eα、eβ是未知的,把它们当成额外状态。通常反电动势的变化比电流变化慢得多,可以近似认为deα/dt≈0、deβ/dt≈0。这样一来,系统就被扩张成四阶状态方程,状态变量是 [iα, iβ, eα, eβ]^T。对这个扩张系统设计观测器,就是龙贝格观测器,本质上也是扩张状态观测器的一种。
观测器方程可以写成:
diα_hat/dt = -R/Ls·iα_hat + uα/Ls - eα_hat/Ls + k1·(iα - iα_hat)
deα_hat/dt = k2·(iα - iα_hat)
β轴完全对称,照着写就行。
这个结构非常直观:电流的估计误差同时修正电流估计和反电动势估计。第二行本质是一个积分器,只要有电流偏差,eα_hat就会一直调整,直到偏差归零。k1和k2决定了这个修正过程的快慢。
2.2 极点配置到底怎么配
把观测器的误差方程写成二阶系统,就会发现k1、k2和期望极点的关系很直接。工程上通常希望观测器误差按一个带阻尼的二阶系统收敛,设目标特征方程为:
s² + 2·ζ·ωn·s + ωn² = 0
对应到龙贝格观测器增益,可以得到:
k1 = 2·ζ·ωn - R/Ls
k2 = -ωn²·Ls
注意这里k2的符号,不同资料里因为状态方程写法不一样,符号可能有差异,实际编程的时候要以手头代码为准,先用仿真确认正负。理论归理论,工程上我用的时候不会死磕推导,先把ωn设到2000 rad/s附近、ζ取0.7到1,然后看波形再微调。
ωn选多少确实是个权衡。ωn太小,反电动势估计跟不上转速变化,加减速时角度滞后明显;ωn太大,电流采样噪声会被放大,估计反电动势上全是毛刺。我常用的起点是1500到2500 rad/s之间,再根据实际噪声水平往下调。
这套观测器能不能工作,前提是电机模型参数基本准确。Rs、Ls这两个参数如果偏太多,观测器看到的“电压模型”和真实电机对不上,估计出来的反电动势就会有偏差。Rs随温度变化明显,铜绕组温度升高几十度,电阻可能变20%甚至更多,低速时影响尤其大。Ls在大电流时会饱和而偏移。实用做法是把参数文件里的数值校准到实测阻抗,或者在控制器里做简单的在线辨识。
2.3 离散化是躲不过的一步
MCU里跑的是离散迭代,不能直接把连续域方程搬进去。离散化方式选择影响实际表现。
一阶欧拉最简单,但相位滞后明显;双线性变换精度好,适合把连续域极点配置转换到离散域。离散化之后,还要考虑一拍延时补偿的问题。
我用C语言实现时,α轴的迭代大概是这个流程:
// 电流环中断里,每隔Ts执行一次 errAlpha = iAlpha - iAlphaHat; eAlphaHat += Ts * k2 * errAlpha; iAlphaHat += Ts * (-R/Ls * iAlphaHat + uAlpha/Ls - eAlphaHat/Ls + k1 * errAlpha);β轴完全一样,换成对应变量就行。这里有个细节:先更新反电动势,再更新电流,或者反过来,结果会有细微差别。一旦选定顺序,就不要在调试中随意改动,否则排查问题时会很混乱。
真正的坑在于电压指令uα、uβ不能用PWM占空比直接换算,必须补偿死区时间和管压降。低速时死区误差对反电动势观测的影响非常大。死区补偿公式不复杂,关键是要判断电流方向,方向判断错了反而会引入更大误差。
2.4 PLL的参数设计
PLL的思路简单说:把估计出来的反电动势eα_hat、eβ_hat乘以一个包含估计角度θ_hat的旋转矩阵,得到误差信号。当θ_hat和真实角度θe一致的时候,这个误差信号是0;不一致时,误差信号近似正比于θ_hat - θe。这个线性化关系在小误差范围内成立,所以可以直接交给PI控制器去把误差压回零。
常用误差构造是:ε = eα_hat·cosθ_hat + eβ_hat·sinθ_hat。代入反电动势表达式后会发现,ε在θ_hat接近θe时约等于E·(θ_hat - θe),E是反电动势幅值。PI输出是电角速度估算值,再积分一次得到估算角度。
PLL带宽设计也讲究。带宽太低,加减速时角度滞后,动态响应差;带宽太高,谐波跟着进来,速度反馈有起伏。我一般以200Hz到800Hz为起点,先在100Hz左右确认稳定性,再慢慢往上抬。
实际应用中还有一个重要细节:反电动势幅值正比于转速,低速时幅值小,PLL的环路增益会变小,动态变差。如果希望宽速域都有稳定表现,可以在PLL前面加一个归一化处理,除以反电动势幅值估计值。但归一化在低速时容易放大噪声,所以启动初期不要用,等速度上来再切换。
另外需要注意极对数。PLL输出的是电角速度,转速等于电角速度除以极对数。程序里如果转速保存成RPM,换算关系要统一,这个看起来简单的点,我见过不止一个同事栽跟头。
3. 实操过程与调试逻辑
3.1 先在仿真里把逻辑跑通
拿到一个新方案,我先在仿真平台里搭模型。流程是:先搭永磁同步电机双闭环FOC模型,电流环、速度环都用PI,给定电机参数和反电动势参数。然后做两件事。
第一件事:在电机模型旁边搭龙贝格观测器和PLL,输入用电机模型的电流和电压,输出估算角度和转速,拿它和电机模型真实的θe、ωe对比。这个阶段最容易暴露的是符号错误和初值问题。反电动势公式正负号搞反,最终角度会偏一个固定值,电流环在估计算法控制下可能完全无法工作。
第二件事:把估算角度替换掉真实角度,让电流内环跑在观测角度上,看系统是否稳定。这里能提前发现切换逻辑中可能出现的问题,比直接上硬件省事得多。
3.2 实验平台的搭建要点
实验平台用一块主流MCU控制板加三相逆变器,电流采样用双电阻或三电阻都可以。整个观测器的性能和电流采样质量直接相关,所以采样环节要认真对待。
电流采样时刻要放在PWM中心,让采样电流尽量接近相电流平均值。采样窗口太窄,信号建立不完整,ADC读数就是歪的。ADC偏置没有校准时,每次开关周期都会出现一个固定噪声,这个噪声进入观测器以后,角度反馈就会带着固定频率的抖动。
电压指令uα、uβ的死区补偿必须做。之前我调试一台样机,低速带载测试时电流波形明显有削顶,观测角来回抖,加上死区补偿和管压降补偿以后,波形一下就干净了。死区补偿的前提是电流方向判断准确,这个方向判断一定要滞环处理,否则在电流过零附近,补偿方向来回翻转,结果适得其反。
3.3 启动策略如何衔接
龙贝格观测器在零速和极低速时基本不可用,因为反电动势幅值太小,淹没在噪声里。所以整套启动流程必须包含开环强拉段。
我的启动顺序是这样的:
- 转子定位:给一个固定方向的q轴电流,角度给定为0,把转子拉到一个已知电角度位置,持续几百毫秒。
- I/F开环强拉:给定一个斜坡上升的电角速度,用开环角度做坐标变换,电流环仍然闭环跟踪q轴电流给定。随着转速上升,反电动势幅值增大,观测器逐渐收敛。
- 切换条件:当电角速度超过设定阈值,并且观测器角度与开环角度误差持续小于某个阈值,把控制角度从开环切换为观测角度。
- 切换前做角度对齐:让观测器角度先向开环角度靠拢,减少切换瞬间的角度差。
切换瞬间最容易出电流冲击。我的做法是渐变混合:在若干个控制周期内,开环角度权重从1平滑过渡到0,观测角度权重从0平滑过渡到1。虽然增加了一点代码量,但切换冲击几乎消失。
还有一个容易忽略的点:强拉电流不能给太大。强拉电流越大,开环角度和真实角度之间的静差越大,切换时冲击就越猛。强拉电流应该根据负载需求尽量压低,留出足够裕量就行。
3.4 参数整定顺序
我的整定顺序固定是:电流环 → 开环I/F启动 → 观测器+PLL → 速度环 → 带载优化。
电流环必须先调好。观测器的输入是电流和电压,电流噪声大,观测器输出就不可能干争。电流环带宽一般取开关频率的1/10到1/20,先确保电流内环跟踪快、不振荡。
电流环稳定后,再调观测器极点频率和PLL带宽。这两个参数不要同时动,变量越多越难定位问题。先调观测器带宽,再调PLL带宽,交叉验证。
给一组参考初值,以10kHz PWM频率为例:
- 电流环PI:Kp按电机阻抗换算,大概0.5左右,Ki取100左右。
- 观测器极点频率:2000 rad/s,阻尼系数0.707。
- PLL带宽:200Hz。
- 速度环:Kp取0.05到0.2,Ki取5到20。
这组数只能当起点,不同功率电机和不同载频差异很大,但调参思路是一样的:先看观测器角度有没有高频毛刺,有就压带宽;再看动态响应够不够,不够就提带宽。
速度环放到最后调,是因为它依赖PLL输出的转速。转速反馈本身不干净,速度环参数调了半天也白调。
4. 常见问题与排查技巧实录
4.1 观测器输出发散或震荡
现象是估算角度来回跳,电流环跟着抖,严重时过流报警。
先查电流采样方向。三相电流进ADC的方向如果接反,观测器的电流误差符号就是反的,收敛条件不成立。这一步在硬件阶段就要确认。
再查电压补偿。uα、uβ没有补偿死区时,低速段观测器看到的电压指令和真实端电压差异很大,容易在电流过零附近振荡。
最后调整观测器极点频率。把ωn降低一半,看振荡是否减弱。如果减弱说明是带宽过高放大噪声;如果没有变化,问题更可能在参数或符号。
4.2 从开环切换到闭环时电流冲击
现象是切换瞬间q轴电流突然增大,母线电压跌落,甚至触发保护。
本质是开环角度和观测角度不同步。切条件里要增加角度误差判断,比如误差小于15度电角度才允许切换。切换前做一个角度斜坡对齐,把观测器角度拉向开环角度。
如果强拉电流偏大,切换冲击也会更明显。把强拉电流降到满足带载的最低值,同时检查加速度曲线是否太陡,让电机在切换时刻处于稳定的中高速段。
4.3 低速性能差,带载起动困难
现象是轻载能转起来,带一点负载就失步。
低速时反电动势和噪声一个量级,单靠龙贝格观测器很难兼顾稳定性和动态。工程上有几个补充手段:对凸极电机可以叠加高频注入法来辨识初始角度,表贴电机没有凸极性,只能用定位加强拉。降低PLL带宽能让角度更平滑,但会牺牲动态。改进强拉开环的电流和加速度曲线,让电机迅速跨过低速区,也是一种有效办法。
4.4 参数失配时角度波动
现象是电机稳定运行后,速度环反馈有固定频率的波动,频率跟转速同步。
这个特征基本指向参数失配。Ls偏大会导致观测器对反电动势幅值估计偏高,角度估算超前;Rs偏大会导致低速时电压模型不准。
可以做一次简单的参数辨识:在转子锁定时给电枢施加阶跃电压,测量电流上升时间得到Ls,稳态电流得到Rs。温度变化引起的Rs漂移,再根据电流或温度做补偿。
4.5 常见问题速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 观测角频率波动明显 | PLL带宽过高 / 电流噪声大 | 降PLL带宽、检查采样时刻 |
| 低速带载失步 | 反电动势信噪比低 / 启动策略不完善 | 增加强拉电流、优化切换逻辑 |
| 切换瞬间过流 | 角度跳变 / 强拉电流偏大 | 加角度差阈值、渐变混合 |
| 估计角度恒偏差90度 | 反电动势公式或坐标变换符号错误 | 核对eα、eβ定义与旋转矩阵 |
| 转速反馈噪声大 | 电流采样噪声进入观测器 | 电流滤波、降低观测器极点频率 |
| 电机有嗡嗡声 | 死区补偿未加或方向判断不准 | 补偿死区电压、增加滞环 |
4.6 几个代码实现的细节
代码实现上有几个习惯值得养成。
估算角度用浮点或定点格式要统一,角度要归一化,防止累加溢出。PLL的PI输出要加限幅,电角速度限幅对应最大转速。观测器和PLL的迭代频率与控制频率保持一致,不要在不同时间基准下混用。
调试时把观测器输出的扩展状态,也就是eα_hat和eβ_hat,用调试工具实时看。只看最终角度容易把问题掩盖,直接看反电动势波形反而能快速定位是采样问题、补偿问题还是参数问题。
5. 一些个人体会和后续扩展方向
如果让我重新做一遍这个项目,我会把更多时间花在“参数准确”而不是“算法调优”上。龙贝格观测器加PLL这套方案本身已经很成熟,大部分调不出来或者调不好的问题,根源不是算法公式,而是电流采样质量、死区补偿、参数辨识这些基础环节。基础打得牢,这套方案就是又快又稳。
后面积累经验以后,有几个扩展方向值得做:把龙贝格观测器改成自适应增益,根据转速自动调整带宽,平衡低速和高速的矛盾;在中高速段引入弱磁控制,扩展调速范围;把参数辨识做成在线版,定期更新Rs和Ls,减少温度变化对观测器的影响。
电机控制领域工具很多,算法迭代也快,但核心思路是相通的。把反电动势观测和锁相环这两个模块吃透,再去看滑模观测器、扩展卡尔曼滤波,都会顺手很多。
最后再分享一个小技巧:调试无感FOC时,不要一上来就盯着角度曲线看。先把电流采样、电流内环、死区补偿这些“地基”打好,再去看观测器和PLL。地基不稳,上层做得再花哨也会翻车。这是我自己摸索出来的调试顺序,希望对正在做同类项目的朋友有帮助。