做无感FOC的兄弟应该都有这种体会:高速工况下随便糊一个观测器都能转,真正要命的永远是“低速+重负载”的那个瞬间——反电动势小到几乎没有,转子位置一旦飘了,电流方向跟着错,轻则堵转,重则过流放炮。我早期踩过不少这类坑,后来在论文堆里翻到一种叫Harnefors观测器的方案,核心迭代代码算下来就十行左右,实测在低速重载场景下能把转子位置硬生生拉回来。这篇文章不端着,直接把它的原理、代码、调参顺序和实测边界讲清楚,适合正在啃无感算法、或者在带载启动上栽过跟头的工程师。
1. 无感低速启动难在哪儿:先把问题本身拆开
1.1 把转子“藏”在电气信号里
无感控制的本质,是把电机本身当作一个编码器来用。转子转动时,定子绕组里会产生反电动势,这个反电动势的幅值和方向,天然携带转子位置和转速的信息。控制器的任务,就是根据电压、电流这些电气量,把转子位置“解码”出来。
问题是,这个“解码”过程在高速时非常轻松,到了低速就完全变味。因为反电动势的幅值和转速成正比,转速掉到十分之一,反电动势也掉到十分之一。我用一个实际例子来说明:某2.2kW的永磁同步电机,额定转速1500rpm,额定反电动势在100V量级。当转速掉到50rpm时,反电动势只剩3V左右。这3V的微小信号里,还混着逆变器死区误差、电流采样零漂、PWM开关纹波等等干扰,随便一项就有0.5到1V。信噪比从高速时的100比1,直接掉到3比1。
这时候你还想从信号里精确读出转子位置?很多所谓“直接计算法”就是这么死的——公式摆在那里,一算就是一堆噪声。
1.2 低速重载是双重打击
如果只是低速,那问题还简单一点。真正恶心的是“低速+重载”两个条件叠加。重载意味着大电流,大电流带来两个连锁反应:
第一个反应是磁路饱和。电机设计时按额定点标定的电感、磁链参数,在大电流下会明显偏离标称值。你在控制器里写的Rs、Ls,跟电机实际运行的参数已经不是一回事了。模型不准,任何基于模型的位置估计都会产生误差。
第二个反应是电流环干扰。大电流工况下,逆变器死区效应、管压降这些非线性因素被放大,电压指令和电机端实际电压之间的偏差变得不可忽略。这一坨偏差,最终都会折算到位置估计结果里。
所以低速重载场景下,信号本身很弱,模型又不准,干扰又大。这就是无感控制的“鬼门关”,很多看似漂亮的算法一到这个工况就现原形。
1.3 高频注入在这个场景也很尴尬
也许你会说:“那用高频注入法啊,零速都能干。”这话没错,但高频注入在低速重载下也有自己的麻烦。
高频注入的基本原理,是在基波上叠加一路高频电压信号,利用电机交直轴电感的凸极差异,从高频电流响应里解算出转子位置。它的优势是原理上不依赖反电动势,所以零速也能工作。但它的硬伤是:
- 需要电机有明显的凸极率,也就是Ld和Lq差异足够大,表贴式电机经常效果不佳。
- 注入的高频信号会带来额外损耗、电流畸变和电磁噪声,这一点在很多应用里没法接受。
- 重载大电流导致的磁饱和,恰恰会削弱凸极信号本身,相当于你要测的信号被工况“淹没”了。
- 从高频注入切换到反电动势类方法的过渡区,工程上处理不好就会出现切换振荡。
所以在低速重载这个综合场景里,高频注入也不算是银弹。我们需要的是另一种思路:不跟反电动势的幅值硬刚,而是用一个闭环观测器把它“重构”出来。
2. 观测器的关键设计:把反电动势当成一个“可重构状态”
2.1 从电压方程到状态方程的一步
先写永磁同步电机在静止αβ坐标系下的电压方程,大家应该很熟:
vαβ = Rs·iαβ + Ls·diαβ/dt + eαβ
其中eαβ就是反电动势矢量。对于表贴式电机,它等于ψf·ωe·(-sinθe, cosθe),也就是说,反电动势矢量的方向,和转子电角度θe之间存在固定的90度关系。只要能拿到eαβ的方向,转子位置就出来了。
关键问题是低速时eαβ太小,直接通过电压方程反解是不现实的。但这里有一个容易被忽略的事实:eαβ本身并不是一个跳变量,它在一个电周期内平滑变化,在工况变化时也只跟随转速缓变。既然它变化不快,我们就有理由把它当作一个“状态变量”,而不是一个“外部扰动”。把它扩进状态方程,让观测器去同时估计电流和反电动势。
这就是全阶状态观测器的基本思想。数学上,状态向量从两维的电流,扩成四维的“电流+反电动势”:
d/dt iα_hat = -(Rs/Ls)·iα_hat + (vα - eα_hat)/Ls d/dt eα_hat = 0 ——先看成缓变量,慢速自适应
实际运行中eα_hat并不真的等于0,观测器会通过校正项去更新它。这里不搞复杂推导,你只需要记住:反电动势不再是“算出来”的,而是“被估计出来”的。
2.2 预测-校正框架和误差积分的角色
观测器的运行方式用一句话概括就是“导航地图加实时修正”。电流状态方程先根据电压和上一拍的反电动势估计值,预测这一拍的电流应该在哪里;然后拿实测电流和预测电流一对比,差值就是“预测偏了”的证据。
这个差值怎么用?分两路。第一路,直接反馈给电流状态更新,让估计电流快速靠拢真实电流,这相当于比例校正。第二路,累积起来给反电动势估计值,这相当于积分校正。
写成递推形式就是:
iα_hat += Ts·[-(Rs/Ls)·iα_hat + (vα - eα_hat)/Ls + k1·(iα - iα_hat)] eα_hat += Ts·k2·(iα - iα_hat)
β轴完全同理。这就是Harnefors观测器最小的核心骨架,十行代码的底子就在这里。
这里有个关键点值得展开:为什么积分校正对低速如此重要?因为积分环节在低频甚至直流段的增益趋近无穷大。哪怕反电动势信号微弱到几乎看不见,只要电流误差持续存在,积分器就有本事在一拍一拍中把误差累加起来,最终推动eα_hat收敛到真实值。对比直接计算法那种“一次性求值”的结构,积分器相当于在时间维度上反复利用误差,自然对噪声和干扰有平滑抑制作用。
2.3 和“直接算反电动势”的本质区别
很多初学者会问:直接拿公式 e_hat = v - R·i - L·di/dt 不就行了?为什么要绕一圈用观测器?
答案是:直接法对微分的噪声极其敏感。电流信号里哪怕有千分之几的采样抖动,经过微分放大之后,反电动势估计值就变成毛刺海。低速时有效信号小,这种毛刺直接淹没一切。而观测器把“di/dt”投影到了闭环反馈结构里,不显式求导,而是通过状态递推和误差修正来隐式处理,天然滤掉了高频噪声。
从控制理论角度看,Harnefors的方法本质上是把位置估计问题转化成了一个自适应观测问题,利用的是模型参考自适应的思路——参考模型是真实电机,可调模型是控制器里的状态方程,而自适应率就是那条积分通路。这个结构在理论上保证了对参数慢变的鲁棒性,也解释了为什么它在低速重载下还能“扛得住”。
3. 十行核心代码的落地拆解
3.1 函数接口与调用时机
先明确一下使用环境。这段代码跑在FOC控制周期里,一般挂在PWM中断中,载波频率建议不低于8kHz到10kHz,采样周期Ts对应取100微秒量级。观测器每个中断周期调用一次,输入两个电压分量和两个电流分量,输出估计角度和估计转速。
输入电压这里有个工程细节:不要直接拿ADC采出来的电机端电压,那玩意儿纹波太大,还必须做滤波和相位补偿。实际项目里都是直接用SVPWM的电压指令值,叠加死区补偿量,作为观测器的输入。死区补偿怎么算,单独可以写一整篇,这里只说结论:低速时死区补偿不准,观测器角度就会偏,重载时尤其明显。
先定义一个观测器结构体:
typedef struct { float ts; // 采样周期,单位s float rs, ls; // 定子电阻和电感,单位Ω、H float kp, ki; // 观测器增益 float ialpha_hat; // α轴估计电流 float ibeta_hat; // β轴估计电流 float ealpha_hat; // α轴估计反电动势 float ebeta_hat; // β轴估计反电动势 float theta_hat; // 估计电角度 float theta_old; // 上一拍角度,用于差分求速 float omega_hat; // 估计电角速度,单位rad/s } hf_obs_t;初始化时可以先把估计电流、估计反电动势全部清零,角度输出从0开始。注意,实际工程中启动前最好配合预定位或者I/F开环拖动,让初始角度误差落在比较合理的范围内。观测器虽然能把位置拉回来,但你硬顶着180度误差直接上大电流,那也是自找麻烦。
3.2 核心递推代码
真正的核心步进函数也就十行浮点运算:
void hf_obs_step(hf_obs_t *o, float valpha, float vbeta, float ialpha, float ibeta) { float ts = o->ts; float ea, eb; // 1) 电流误差:实测和模型预测的差距 ea = ialpha - o->ialpha_hat; eb = ibeta - o->ibeta_hat; // 2) 电流状态递推:预测 + 比例校正 o->ialpha_hat += ts * (-(o->rs / o->ls) * o->ialpha_hat + (valpha - o->ealpha_hat) / o->ls + o->kp * ea); o->ibeta_hat += ts * (-(o->rs / o->ls) * o->ibeta_hat + (vbeta - o->ebeta_hat) / o->ls + o->kp * eb); // 3) 反电动势自适应律:误差积分 o->ealpha_hat += ts * o->ki * ea; o->ebeta_hat += ts * o->ki * eb; }别小看这段代码,它的信息密度相当高。第1步的电流误差是联接“模型世界”和“真实世界”的桥梁;第2步让估计电流快速贴合实测电流;第3步把误差积累成反电动势修正量。三步之间一环扣一环,最终让反电动势估计值收敛到真实值附近。
3.3 位置提取环节的工程强化
从估计反电动势里取角度,标准做法是:
theta_hat = atan2f(-ealpha_hat, ebeta_hat)
原理是eα = -|E|·sinθe,eβ = |E|·cosθe,所以θe就是atan2(-eα, eβ)。代码里直接套就行。但我强烈建议不要直接对atan2输出做差分求转速,那样角度在±π跳变处会冒出离谱的速度尖峰,噪声更是被微分放大得不成样子。
工程上更稳的做法,是在观测器后面再接一个锁相环或者锁频环,把角度和速度的提取交给这个二阶环路来处理。给你一份可以直接抄的PLL实现:
typedef struct { float theta_pll; // PLL输出角度 float omega_pll; // PLL输出电角速度 float kp_pll, ki_pll; } hf_fll_t; void hf_fll_update(hf_fll_t *f, float theta_raw, float ts) { float err = theta_raw - f->theta_pll; if (err > 3.14159f) err -= 6.28318f; if (err < -3.14159f) err += 6.28318f; f->omega_pll += f->ki_pll * err * ts; f->theta_pll += (f->omega_pll + f->kp_pll * err) * ts; }PLL的带宽一般取观测器带宽的四分之一到二分之一,这样它在平滑角度抖动的同时,还能跟上转速变化。我测试下来,加上PLL以后,角度波形会干净非常多,对后续的电流环和速度环都友好。
4. 增益整定的工程手感:两个参数背后的频率法则
4.1 从观测器极点说起
kp和ki不是随便拍脑袋给的。把第2节的状态方程和观测器方程合并,写出误差动态方程,会发现它是一个二阶系统。按经典控制理论,观测器的两个极点位置决定了收敛速度和噪声抑制能力。工程上我们通常把极点配置成临界阻尼或稍欠阻尼,对应阻尼系数ζ约0.7到1.0。
这里直接给你一套可用公式:
kp = 2·ζ·ωo - Rs/Ls ki = ωo²·Ls
其中ωo是期望的观测器带宽,单位rad/s。如果选ζ=1、带宽f_o=50Hz,那么:
ωo = 2π·50 ≈ 314 rad/s kp ≈ 2×314 - Rs/Ls ki ≈ 314² × Ls
代入一台2.2kW表贴永磁电机的典型参数Rs=1.0Ω、Ls=5mH,得到:
kp ≈ 628 - 200 = 428 ki ≈ 98596 × 0.005 ≈ 493
这两个数量级的数值,会让观测器在几十毫秒内完成收敛,同时对电流采样噪声有很好的抑制。
4.2 参数失配的影响与离线初值
接下来是重头戏:参数到底影响多大?我直接说结论——低速下,电阻失配是最大的敌人。
低速时电流小,电阻压降小,但反电动势信号也小。如果电阻标称值偏了30%,这个偏差产生的电压误差,会直接混进反电动势估计里,最终表现为位置角度的固定偏置。典型现象是:空载时角度还行,一加载,角度误差跟着电流走,负载越大误差越大。
电感失配的影响在不同转速下表现不同。低速时电抗项ωL很小,电感误差影响有限;高速时电感误差直接影响电抗项,位置偏置会随转速上升而放大。所以完整的调参流程应该是:先用离线辨识或者堵转测试把Rs和Ls尽量摸准,再把温度补偿加上,最后才去整定kp和ki。
有个实用技巧:低速重载工况下,如果发现角度偏置和电流成正比,优先怀疑Rs失配;如果偏置和转速成正比,优先怀疑Ls失配。这个排查思路能帮你少走很多弯路。
4.3 一套可复制的调参顺序
增益整定我建议按下面这个顺序走,不要跳步:
- 第一步,先把PLL和观测器带宽拉开。观测器带宽初定50Hz,PLL带宽初定10Hz。
- 第二步,空载、中速启动。转速给到30%额定转速,确保观测器能稳住,再看角度波形是否平滑。
- 第三步,把转速压到低速区,比如10%额定转速。观察收敛速度和抖动水平,如果收敛太慢,适当加大ki;如果抖动太大,适当减小kp。
- 第四步,带载测试。先加50%负载,看角度偏置,再上100%负载。如果偏置明显,回炉去校Rs。
- 第五步,突加突卸负载冲击,观察观测器能否在几百毫秒内把位置拉回来。
整套流程走下来,正常一个下午能调出一个比较稳的状态。我这里可以给一个经验参考表,具体数值要按你的电机折算,别照抄:
| 电机功率 | 额定电流 | 建议观测器带宽 | 建议PLL带宽 | kp数量级 | ki数量级 |
|---|---|---|---|---|---|
| 400W | 1.8A | 30-50Hz | 5-10Hz | 200-400 | 100-300 |
| 2.2kW | 5A | 40-60Hz | 8-15Hz | 300-500 | 400-800 |
| 5.5kW | 12A | 50-80Hz | 10-20Hz | 400-700 | 1000-2000 |
表格里ki数量级受Ls影响最大,电感越大的电机,ki整体数值门槛越高。调的时候以实测角度波形为准,数字只是起点。
5. 实测记录:低速重载拉回的完整表现
5.1 测试条件
直接说配置,方便你复现对比。电机是一台2.2kW表贴永磁同步电机,额定1500rpm,额定电流5A,定子电阻约1.0Ω,电感约5mH。负载用磁粉制动器模拟,能稳定压住扭矩。控制器单片机主频170MHz,PWM载波10kHz,电流环和观测器都在同一次中断里跑,速度环频率1kHz。
启动逻辑:初始位置误差故意不做预定位,直接给一个较小的开环拖动电流,让转子先动起来;观测器输出的角度一旦收敛,就无缝切入闭环。这个流程,和很多压缩机、风机项目的做法是一样的。
5.2 带载启动的干拉过程
最刺激的测试是低速带载直接启动。把转速指令设到50rpm,相当于3.3%额定转速,同时磁粉制动器加载到100%额定负载。
实测下来的过程大致是这样:
- 启动瞬间,估计角度和实际角度偏差大约40度电角度。电流峰值冲到6.5A,被电流环限幅压住,没有过流报警。
- 大约100ms后,角度误差收敛到15度左右。此时电流波形开始从畸变状态恢复。
- 300ms后,角度误差稳定在5度以内,电流变成干净的正弦波形,转速缓缓爬上50rpm。
- 稳态运行时,角度波动±4度电角度,速度波动约±3rpm。在整个过程中,观测器就像一只无形的手,把转子位置牢牢摁在正确轨迹上。
这套数据说明什么?说明它确实具备“低速重载下把位置拉回来”的能力。而且注意一个细节:整个收敛过程中,我没有做任何特殊的启动算法,全靠观测器自己的误差积分去把角度拽回来。对比之前用的滑模观测器,在同样工况下基本都是直接失步,差别非常直观。
5.3 稳态精度与边界失效点
当然,它也不是万能钥匙。我专门测了它的边界:
第一个边界是极低速。转速压到5rpm时,反电动势只剩额定值的百分之零点几,电流采样噪声和逆变器死区误差开始占主导,角度抖动会明显变大,收敛时间显著变长。这个区域建议还是交给I/F开环拖动或者高频注入。
第二个边界是电阻失配。我把电阻在控制器里故意设偏40%,低速带载时角度偏置直接跑到15度以上,电机会出现明显的出力下降。这个案例说明,观测器玩得转的前提是模型别太离谱。
第三个边界是突加突卸满载。从50%负载瞬间加到100%再瞬间卸掉,角度误差会有一个尖峰,大约10度左右,然后几百毫秒内恢复。对于风机泵类负载完全够用,但对于对动态响应要求极高的伺服应用,就得配合更强的补偿手段。
6. 和主流方案横向对比:什么时候用它,什么时候换招
6.1 三张牌各有什么底牌
做无感方案绕不开三张牌:反电动势类观测器(以Harnefors为代表)、滑模观测器、高频注入法。一张表格看清区别:
| 维度 | Harnefors观测器 | 滑模观测器 | 高频注入法 |
|---|---|---|---|
| 低速性能 | 优秀,带载可拉回 | 较差,容易失步 | 零速可用 |
| 高速性能 | 优秀 | 优秀 | 基本不适用 |
| 代码量 | 十行核心 | 简单且皮实 | 复杂,要滤波器设计 |
| 参数依赖 | 中等,电阻敏感 | 较低 | 高,依赖凸极率 |
| 电流质量 | 干净无附加纹波 | 有抖振毛刺 | 有高频纹波 |
| 噪声特性 | 积分类似低通,平滑 | 抖振产生噪声 | 注入噪声明显 |
| 动态响应 | 中等 | 快但抖 | 慢 |
滑模观测器的优势是结构简单、对参数不敏感,高转速下非常皮实,电动工具、风机这类中高速应用基本是首选。缺点是抖振问题在低速下放大,低速重载基本洗洗睡。高频注入能站到零速,但代码量和调试成本都不低,而且对电机凸极特性有硬性要求。
Harnefors观测器恰好卡在一个很有价值的中间位置:它不需要额外的高频注入,不破坏电流波形,代码量又极端精简,低速性能还压得住滑模。缺点就是对Rs参数有一定敏感度,需要做好离线辨识和温度补偿。
6.2 选型建议:按应用场景对号入座
我的选型经验是:
- 风机、水泵这类启动转矩小、速度偏高、要求成本低的场景,直接用滑模或者Harnefors都能跑,但想要启动顺滑、噪声低,Harnefors更好。
- 空调压缩机、冷媒压缩机这类需要带载启动、启动扭矩大、又在低速区反复跑的,Harnefors观测器加初始位置辨识,是目前市面上很常见、也很划算的组合。
- 伺服定位应用、需要零速保持力矩的场景,老老实实上高频注入,别拿Harnefors硬顶。
- 电动工具那种高转速、高冲击、MCU还便宜的,滑模观测器依然是性价比之王。
实际项目中,我见过不少团队把Harnefors和滑模混合起来用:低速交给Harnefors保证带载启动,中高速切到滑模拿鲁棒性。切换点设在15%到20%额定转速之间,配合一段过渡区做角度权值融合,效果相当稳定。
最后分享两句实操体会
调这个观测器最深的体会是:第一次做千万别追求一步到位的完美参数,先把观测器闭环转起来,再看波形逐步调。调试期间有个小技巧——把电流环和速度环的积分作用先关掉,等观测器收敛后再开启,能避免积分饱和造成的拖滞感。另外,观测器输出角度在电流环里最好加一小段超前补偿,补偿量按采样延迟和PWM占空比更新周期来算,方向别搞反,不然高速时会觉得电流相位总差一点。
Harnefors观测器的精髓不在某一行代码多巧妙,而是“误差积分”这个朴素思想在低速下的杀伤力。入门别急着啃完整推导,先把十行代码转起来,让角度波形在低速带载下稳住,再回头看磁链模型和增益矩阵的细节,就顺理成章了。