1. 为什么低速下必须换一套玩法:从反电动势失效说起
如果你调过永磁同步电机的无感FOC,大概率经历过这样一个尴尬:中高速跑得挺稳,一到低速甚至零速附近,转子位置估算就开始飘,转速环抖得像筛糠,严重时直接失步。很多人第一反应是调观测器增益,把龙贝格或者滑模的带宽往上顶,结果发现越调越糟——这不是参数没调好,而是物理层面反电动势本身就不够用了。
无感FOC的根基,是通过电机端电压和电流去反推转子位置。中高速时,转子转得快,永磁体切割定子绕组产生的反电动势幅值足够大,信噪比高,观测器能轻松从电压方程里解出磁链和角度。但转速一降,反电动势幅值随转速线性下降,到低速时几乎淹没在电阻压降、逆变器非线性、采样噪声里。你拿一个被噪声糊住的信号去估算角度,神仙也救不了。
这就是为什么低速段必须换思路:不靠反电动势,而是主动往电机里"打"一个激励信号,靠转子凸极效应产生的响应来反推位置。这套方法就是高频注入,英文叫High Frequency Injection,简称HFI。它的核心逻辑是——既然转子自己不说话(反电动势太小),那我就主动问它一句,听它怎么回答,从回答里判断它朝哪。
HFI里又分好几种注入方式:旋转电压注入、脉振正弦注入、方波注入。其中d轴方波高频注入因为实现简单、对处理器算力要求低、在低速段位置估算精度高,成了很多量产方案的首选。但它也不是没有代价——方波注入会带来额外的电流纹波和噪声,推导过程也比正弦注入绕一些。这篇文章就把d轴方波高频注入的算法原理从头推一遍,把每一步的物理意义和工程取舍讲清楚,让你不只是会抄代码,而是真正明白每个公式是怎么来的。
适合谁看?如果你已经做过基础的无感FOC,对Clarke/Park变换、电流环、SVPWM这些不陌生,但一到低速就卡壳,或者想搞明白HFI到底在算什么,那这篇就是给你写的。如果你连FOC的基本框架还没搭起来,建议先把有感和中高速无感跑通再回来。
2. 凸极效应:HFI能成立的全部物理基础
2.1 从电感矩阵看转子的"方向感"
HFI能work,前提是电机得有凸极效应,也就是d轴电感和q轴电感不相等。表贴式永磁电机(SPM)的Ld和Lq理论上相等,凸极效应很弱,HFI效果就差;而内置式永磁电机(IPM)因为永磁体埋在转子铁芯里,d轴磁路经过永磁体(磁导率接近空气),q轴磁路主要走铁芯,导致Ld < Lq,凸极比通常在1.5到3之间,HFI效果就很好。
为什么凸极效应能反映位置?你可以把转子想象成一个椭圆形的铁疙瘩,d轴是短轴方向,q轴是长轴方向。当你在定子上施加一个电压激励,产生的电流响应取决于这个激励方向上的等效电感。如果激励方向正好对着d轴,等效电感是Ld;对着q轴,等效电感是Lq。因为Ld≠Lq,所以同一个电压激励在不同转子位置下产生的电流响应幅值不同。反过来,我测到电流响应的特征,就能推断出转子在哪个方向。
这就是HFI的全部物理基础。听起来简单,但工程上要把它变成可用的角度估算,中间要过好几道坎。
2.2 高频下的电感模型简化
在基波频率下,电机的电压方程要考虑反电动势、交叉耦合、磁饱和等一堆因素,很复杂。但HFI注入的信号频率通常在500Hz到2kHz,远高于基波频率(低速时基波可能只有几Hz到几十Hz)。在这个频率下,有几项可以大胆简化:
- 反电动势项可以忽略:反电动势幅值正比于转速,低速时本来就小,高频下相对于注入电压更是微不足道。
- 电阻压降可以忽略:高频下感抗ωL远大于电阻R,电流主要由电感决定。
- 交叉耦合项影响小:在低速小电流工况下,d-q轴交叉耦合可以近似忽略。
简化后,高频激励下的电机模型就退化成一个纯电感模型:电压约等于电感乘以电流的变化率。这个简化是HFI推导的起点,也是为什么HFI在低速有效、高速反而失效的原因——高速下反电动势项不能忽略了。
注意:这个简化只在注入频率远高于基波频率、且电机处于低速或零速时成立。如果你的应用需要在全速域切换HFI和观测器,切换点的设计要特别小心,后面会讲。
2.3 d轴方波注入和正弦注入的本质区别
正弦注入是往d轴叠加一个高频正弦电压,然后通过带通滤波和同步解调提取位置误差信号。方波注入则是叠加一个高频方波电压,正负交替。
两者的本质区别在于信号处理路径:
| 对比项 | 正弦注入 | 方波注入 |
|---|---|---|
| 注入波形 | 连续正弦 | 正负交替方波 |
| 电流响应 | 连续正弦 | 正负交替脉冲 |
| 解调方式 | 带通滤波+同步解调 | 相邻周期电流差分 |
| 对算力要求 | 较高(需要滤波) | 较低(差分即可) |
| 电流纹波 | 较小 | 较大 |
| 噪声 | 较柔和 | 较尖锐 |
| 位置精度 | 高 | 高 |
方波注入最大的优势是解调简单。因为方波是正负交替的,我只需要在正半周期和负半周期分别采样电流,然后做差分,就能把注入响应提取出来,不需要复杂的带通滤波器。这对低成本MCU很友好。代价是电流纹波更大,电磁噪声更明显,对采样时刻的同步要求也更高。
3. d轴方波高频注入的完整数学推导
3.1 静止坐标系下的高频电压方程
先从最底层写起。在α-β静止坐标系下,高频激励下的电压方程可以写成:
[Vα] [L0 + L1*cos(2θ) L1*sin(2θ) ] [diα/dt] [Vβ] = [L1*sin(2θ) L0 - L1*cos(2θ)] [diβ/dt]其中:
- L0 = (Ld + Lq) / 2,是平均电感
- L1 = (Ld - Lq) / 2,是凸极电感(注意Ld < Lq时L1为负)
- θ是转子电角度
这个矩阵就是凸极效应在静止坐标系下的完整表达。你可以看到,矩阵里的每一项都含有θ,这就是位置信息的来源。如果Ld=Lq,那么L1=0,矩阵退化成对角阵,θ就消失了,HFI也就失效了。
3.2 从静止坐标系到估计旋转坐标系
实际实现时,我们不会直接在α-β系下解算,而是把注入和提取都放到估计的d-q坐标系下做。设估计角度为θ_est,估计误差为Δθ = θ - θ_est。
把上面的方程变换到估计的d-q坐标系(用Park变换,角度用θ_est),经过一通三角函数运算,可以得到估计d轴和q轴上的电压方程。这里不把每一步展开(网上很多推导),直接给结论:
在估计d轴注入方波电压V_inj,估计q轴电压为0的情况下,估计q轴上的高频电流响应为:
i_qh = (V_inj * ΔT / (Ld * Lq)) * L1 * sin(2Δθ) * sign其中ΔT是半个注入周期的时间,sign是方波的符号(+1或-1)。
这个式子就是d轴方波注入的核心解调公式。它告诉我们:估计q轴的高频电流幅值正比于sin(2Δθ)。当Δθ=0时,i_qh=0;当Δθ很小时,sin(2Δθ)≈2Δθ,i_qh正比于角度误差。
3.3 位置误差信号的提取:相邻周期差分
方波注入的解调精髓在于差分。因为方波是正负交替的,我在正半周期采样一次q轴电流,在负半周期再采样一次,两者相减:
Δi_q = i_qh(正) - i_qh(负)由于sin(2Δθ)在正负半周期符号相同(角度误差在半个注入周期内基本不变),而方波符号相反,所以差分后:
Δi_q = 2 * (V_inj * ΔT / (Ld * Lq)) * L1 * sin(2Δθ)这样就把位置误差信号提取出来了,而且不需要带通滤波器,只需要在正确的时刻采样。这就是方波注入解调简单的根本原因。
3.4 从误差信号到角度:锁相环的设计
拿到Δi_q后,怎么把它变成角度?标准做法是过一个锁相环(PLL)。PLL的结构很简单:
- 把Δi_q当作误差输入
- 误差经过一个PI调节器,输出估计转速
- 估计转速积分得到估计角度θ_est
- θ_est反馈回去做Park变换
PLL的闭环传递函数是标准的二阶系统,PI参数决定了带宽和阻尼。这里有个工程经验:PLL带宽不能设太高,因为Δi_q里还有噪声和采样误差,带宽太高会把噪声放大,导致角度抖动。一般低速HFI的PLL带宽设在20到50Hz左右,具体看电机和采样质量。
实操心得:PLL的PI参数整定时,先把积分项设为0,只调比例项,观察角度跟踪是否稳定;然后慢慢加积分项消除稳态误差。如果角度出现低频振荡,说明比例增益太大;如果角度跟踪有滞后,说明积分增益不够。
3.5 极性判断:N/S极分辨的坑
上面推出来的sin(2Δθ)有个致命问题:它的周期是π,不是2π。也就是说,θ和θ+π会产生相同的误差信号。这意味着HFI只能分辨出转子的轴线方向,但分不清哪头是N极、哪头是S极。
这是HFI最经典的坑。解决办法是磁饱和极性判断:往d轴正方向注入一个较大的电流脉冲,由于永磁体的存在,d轴正方向的磁路饱和程度和负方向不同,导致电感变化不同,通过比较正负脉冲下的电流响应幅值,就能判断出N极方向。
具体做法:
- 先让HFI收敛到一个轴线方向(可能是N也可能是S)
- 往估计d轴正方向注入一个短时大电流(比如额定电流的50%到100%)
- 测量电流上升率或稳态电流幅值
- 如果d轴正方向对应N极,磁路更饱和,电感更小,电流上升更快
- 根据结果决定是否需要把角度加π
这个判断只需要在启动时做一次,之后HFI跟踪就不会再丢极性了。
4. 工程实现中的关键细节与参数选择
4.1 注入频率和幅值的权衡
注入频率和幅值是HFI最重要的两个参数,直接决定性能。
注入频率的选择要考虑几个因素:
- 要远高于基波频率,低速时基波可能只有几Hz,所以500Hz以上就够
- 要低于电流环带宽,否则电流环跟不上注入信号
- 要避开机械谐振频率,否则会激发振动
- 要避开采样频率的整数分频,否则会产生混叠
工程上常用的是电流环频率的1/4到1/8。比如电流环10kHz,注入频率取1.25kHz到2.5kHz。方波注入时,注入频率就是方波的基波频率,正负半周期各占一半。
注入幅值的选择更微妙:
- 太小:电流响应信噪比不够,角度估算抖动
- 太大:电流纹波大,噪声明显,可能激发饱和
- 一般取额定电压的10%到20%,或者额定电流的10%到30%
我个人的经验是,先从额定电压的10%开始试,如果角度抖动大就往上加,如果噪声太大就往下减。对于凸极比高的IPM,注入幅值可以小一些;凸极比低的SPM,就得加大注入幅值,但效果还是有限。
4.2 采样时刻的精确同步
方波注入对采样时刻的要求极其苛刻。因为方波是正负交替的,你必须在正半周期的末尾和负半周期的末尾分别采样,才能得到正确的差分信号。如果采样时刻偏了,差分出来的信号就混入了基波电流的变化,角度估算直接崩。
具体来说,假设方波周期是T,正半周期是[0, T/2],负半周期是[T/2, T]。你需要在t=T/2时刻采样一次,在t=T时刻采样一次。这两个时刻正好是方波切换的瞬间,电流响应达到最大。
实现上,通常用PWM定时器的比较中断来触发ADC采样,确保采样时刻和方波切换严格对齐。这里有个大坑:如果PWM载波和注入方波不同步,采样时刻会漂移,导致差分信号里混入低频分量。解决办法是让注入方波的切换和PWM周期严格同步,比如每N个PWM周期切换一次方波。
注意:采样时刻的抖动会直接转化为角度误差。如果你的MCU中断响应有延迟,或者ADC采样有固定偏移,一定要在代码里做补偿。我见过太多人在这里翻车,明明算法推导没问题,就是角度抖,最后发现是采样时刻偏了几个微秒。
4.3 电流环带宽与HFI的相互制约
HFI注入的高频信号会进入电流环,如果电流环带宽不够,注入信号会被衰减,导致响应幅值变小,信噪比下降。但电流环带宽也不能无限高,受限于采样频率和PWM频率。
一般来说,电流环带宽至少要是注入频率的2到3倍。比如注入1kHz,电流环带宽至少2kHz。如果电流环带宽不够,可以考虑:
- 提高PWM频率和采样频率
- 降低注入频率
- 在电流环反馈路径上对注入频率做陷波,但这会同时衰减有用信号,要谨慎
另一个思路是把HFI注入和电流环解耦:注入信号不经过电流环PI,直接叠加到电压输出上。这样电流环只负责基波电流控制,注入响应通过独立的采样通道提取。这种结构更清晰,但实现复杂一些。
4.4 从HFI到中高速观测器的切换
HFI只在低速有效,中高速还是要靠反电动势观测器。两者之间需要一个平滑切换策略,否则切换瞬间角度跳变,电机会抖甚至失步。
常见的切换策略是加权融合:在切换速度区间内,HFI估算的角度和观测器估算的角度按转速加权平均。低速时HFI权重大,高速时观测器权重大,中间平滑过渡。
切换区间的选择很关键:
- 下限:HFI能可靠工作的最高转速,通常是额定转速的5%到10%
- 上限:观测器能可靠工作的最低转速,通常是额定转速的10%到20%
- 两者之间就是切换区间
切换区间内,两个估算器的角度都要参与融合,所以两个估算器都得处于正常工作状态。这意味着HFI在切换区间上限附近还得能work,观测器在切换区间下限附近也得能work,两者要有重叠。
实操心得:切换区间不要设太窄,否则转速波动时会在切换点反复横跳。我一般把切换区间设成额定转速的5%到20%,留足够的重叠。另外,融合权重用转速的平滑函数,不要用阶跃,否则会有突变。
5. 实测中容易翻车的几个场景
5.1 凸极比太低导致信噪比不足
前面说过,SPM的Ld≈Lq,凸极比接近1,HFI效果很差。如果你拿一个SPM电机跑HFI,会发现角度估算抖动很大,甚至完全无法收敛。这不是算法问题,是物理限制。
解决办法:
- 换IPM电机,凸极比至少1.3以上
- 如果必须用SPM,可以尝试饱和凸极注入,通过注入大电流人为制造凸极,但效果有限且会增加损耗
- 或者放弃低速HFI,用其他方法(如开环启动到一定转速再切观测器)
5.2 逆变器非线性导致的电压误差
逆变器有死区、管压降、开关延迟等非线性因素,会导致实际输出电压和指令电压有偏差。这个偏差在低速时相对于注入电压可能占比不小,会直接影响HFI精度。
死区补偿是必须做的。常见做法是根据电流方向补偿死区电压,或者用在线辨识方法估计非线性电压。如果死区补偿没做好,HFI的角度估算会有固定偏差,表现为估算角度和实际角度之间有一个恒定的偏移。
判断方法:如果电机能转但效率低、电流大,或者带载能力差,很可能是角度有固定偏差。这时候要检查死区补偿。
5.3 采样噪声和量化误差
HFI提取的差分信号幅值可能只有几十毫安,如果电流采样噪声有十几毫安,信噪比就很差。这时候角度估算会抖,PLL输出会有高频噪声。
改善方法:
- 提高电流采样精度,用更高位数的ADC
- 在差分信号上做低通滤波,但会引入相位滞后,要权衡
- 增加注入幅值,提高信号幅值
- 在PLL前面加一个陷波器,滤掉注入频率的残余
我一般会在差分信号后加一个截止频率几百Hz的低通滤波,既能滤掉高频噪声,又不会引入太大滞后。滤波器的截止频率要高于PLL带宽,否则会影响PLL的动态。
5.4 负载突变时的角度跟踪
HFI在稳态下角度估算很准,但负载突变时,电流突然变化,会引入额外的电压扰动,可能让HFI暂时失锁。如果负载突变很剧烈,甚至可能让PLL发散。
改善方法:
- PLL带宽适当提高,但会牺牲稳态精度
- 在负载突变时暂时增大注入幅值,提高信噪比
- 加一个角度误差限幅,防止PLL积分饱和
实际调试时,我会用突加突卸负载来测试HFI的动态性能。如果角度在负载突变时抖动超过几度,就要考虑优化PLL参数或注入策略。
6. 代码实现框架与调试顺序
6.1 整体软件架构
一个典型的d轴方波HFI实现包含以下模块:
- 注入模块:在估计d轴电压上叠加方波,频率和幅值可配置
- 采样模块:在方波正负半周期末尾触发ADC采样,获取q轴电流
- 解调模块:计算相邻周期q轴电流差分,得到位置误差信号
- PLL模块:误差信号过PI,输出估计转速和角度
- 极性判断模块:启动时执行一次,确定N极方向
- 切换模块:低速HFI和高速观测器的平滑切换
代码框架大致如下(伪代码):
// 每个PWM周期调用 void HFI_ISR(void) { // 1. 更新方波符号 if (++hfi_counter >= hfi_half_period) { hfi_counter = 0; hfi_sign = -hfi_sign; } // 2. 注入方波到d轴电压 Vd_ref = Vd_pi + hfi_sign * V_inj; Vq_ref = Vq_pi; // 3. 在方波切换时刻采样 if (hfi_counter == 0 || hfi_counter == hfi_half_period) { iq_sample = get_iq(); if (hfi_sign > 0) { iq_pos = iq_sample; } else { iq_neg = iq_sample; // 4. 差分得到误差信号 delta_iq = iq_pos - iq_neg; // 5. PLL更新 angle_error = delta_iq * pll_gain; speed_est = PI_pll(angle_error); angle_est += speed_est * Ts; } } }6.2 调试顺序:从开环到闭环
HFI调试不能一上来就闭环,要按顺序来:
第一步:开环注入,观察电流响应。让电机静止,只注入方波,不跑电流环,用示波器看q轴电流波形。应该看到正负交替的脉冲,幅值随转子位置变化。如果看不到明显脉冲,说明注入幅值太小或凸极比太低。
第二步:手动转动转子,观察误差信号。慢慢转动转子,观察delta_iq随角度的变化。应该是一个周期为π的正弦波。如果波形不对,检查采样时刻和差分逻辑。
第三步:闭环PLL,观察角度跟踪。让PLL闭环,手动转动转子,观察估计角度是否跟随实际角度。如果角度能跟但抖动大,调PLL参数;如果角度不跟或发散,检查误差信号符号和PLL极性。
第四步:极性判断。执行极性判断流程,确认N极方向正确。如果判断反了,电机会反转或失步。
第五步:带载测试。加上负载,观察角度跟踪和转速稳定性。如果带载后角度偏差大,检查死区补偿和电流环带宽。
第六步:切换测试。从低速加速到高速,观察HFI到观测器的切换是否平滑。如果有抖动,调整切换区间和融合权重。
6.3 几个实用的调试技巧
- 用DAC输出内部变量:把delta_iq、angle_error、angle_est等变量通过DAC输出到示波器,比看寄存器直观得多。
- 注入频率从低往高调:先从500Hz开始,稳定后再往上加,找到性能和噪声的平衡点。
- PLL参数从保守往激进调:先保证稳定,再追求动态。
- 记录启动过程:用示波器或数据记录功能抓启动时的角度收敛过程,看是否有超调或振荡。
7. 我对这套算法的一点个人体会
d轴方波高频注入这套东西,推导看起来绕,但核心思想其实很朴素:既然低速时反电动势靠不住,那就主动注入一个已知信号,从响应里反推位置。方波注入相比正弦注入,最大的好处是解调简单,省掉了带通滤波器,对低成本硬件友好。但它的代价是电流纹波和噪声更明显,对采样时刻的同步要求也更高。
我踩过的最大的坑是采样时刻偏移。当时算法推导检查了好几遍都没问题,但角度就是抖。后来用示波器同时看PWM波形和ADC触发信号,发现采样时刻比方波切换晚了几个微秒,导致差分信号里混入了基波分量。把采样时刻对齐后,角度立刻稳了。所以如果你也在调HFI,建议第一件事就是用示波器确认采样时刻和方波切换是否严格对齐。
另一个体会是不要迷信仿真。仿真里电机模型理想,没有死区、没有采样噪声、没有参数偏差,HFI跑得完美。但实际硬件上,死区补偿、采样精度、参数变化都会影响效果。仿真只能验证算法逻辑,真正的参数整定必须在实物上做。
最后说一句关于切换的:HFI和观测器的切换,很多人只关注角度融合,忽略了转速估算的融合。如果两个估算器的转速差异大,切换时转速环会抖。我的做法是角度和转速都做融合,而且融合权重用同一个函数,保证一致性。切换区间内,两个估算器都要处于良好工作状态,所以HFI的有效转速上限和观测器的有效转速下限要有足够重叠,这个重叠区间的设计比切换算法本身更重要。