高频注入无感FOC低速段设计:IIR滤波与位置估计实操

发布时间:2026/10/7 14:52:47
高频注入无感FOC低速段设计:IIR滤波与位置估计实操 1. 高频注入无感 FOC 的整体设计思路1.1 为什么低速段必须靠高频注入无感 FOC 的痛点从来不在高速段。反电动势幅值跟转速成正比转速一上去滑模观测器、龙伯格观测器、磁链观测器都能把转子位置估得七七八八。真正难啃的骨头是零速和极低速——这时候反电动势几乎为零任何基于反电动势的观测器都等于闭着眼睛猜。高频注入HFIHigh Frequency Injection就是冲着这个盲区去的。它的底层逻辑不是去测反电动势而是主动往电机里打一个高频信号然后从电流响应里读出转子的凸极信息。PMSM 的转子有凸极性——d 轴和 q 轴的电感不相等通常 Ld Lq内嵌式电机尤其明显这个电感差异就是 HFI 的物理基础。你注入一个高频电压电流的响应幅值会随转子位置变化把这个变化解调出来就能反推转子角度。我一开始接触 HFI 的时候最大的困惑是既然反电动势观测器那么好用为什么还要费劲搞注入后来在台架上实测才明白零速启动时观测器输出的角度完全是随机的电机要么不转要么反转要么抖。HFI 解决的就是从静止到能跑起来这一段。一旦转速超过额定转速的 5%~10%就可以平滑切换到反电动势观测器这就是所谓的IF 启动 HFI 观测器的混合策略。1.2 三种注入方式的取舍HFI 按注入信号类型分主流有三种旋转电压注入、脉振电压注入、方波注入。选哪种不是拍脑袋得看你的应用场景和 MCU 算力。注入方式信号形式优点缺点适用场景旋转电压注入在 αβ 轴注入旋转高频电压实现简单无需转子角度先验转矩脉动大噪声明显对噪声不敏感的低速场合脉振电压注入在估计 d 轴注入高频电压转矩脉动小信噪比高需要估计角度存在耦合大多数工业伺服方波注入在估计 d 轴注入高频方波频带宽动态响应快对采样和 PWM 频率要求高高动态、高带宽场合我个人的经验是脉振注入是性价比最高的选择。旋转注入虽然实现简单但那个嗡嗡声和转矩脉动在很多场合是不能接受的。方波注入性能最好但它要求 PWM 频率足够高一般 10kHz 以上而且电流采样必须跟 PWM 严格同步否则解调出来的信号全是噪声。脉振注入介于两者之间用 5kHz 左右的注入频率就能跑得不错对 MCU 也友好。1.3 从注入到角度整条信号链的骨架整个 HFI 的信号链可以拆成四步注入 → 采样 → 解调 → 估计。注入环节我们在估计的 d 轴也就是当前认为的转子方向叠加一个高频电压。采样环节用电流传感器采三相电流Clarke 变换到 αβ 轴。解调环节把高频响应从基波电流里分离出来——这一步就是 IIR 滤波器的战场。估计环节从解调出的高频电流幅值里提取角度误差信号送进 PLL 或锁相环输出估计角度和转速。这条链上IIR 滤波器的设计直接决定了角度估计的精度和带宽。滤波器截止频率选高了基波和高频混在一起角度抖选低了相位滞后大动态响应慢。后面我会专门用一节讲这个取舍。2. 核心细节解析IIR 滤波与位置估计的实操要点2.1 IIR 滤波器在 HFI 里到底干什么很多人一上来就问IIR 滤波器怎么设计但更该先问的是它在 HFI 里承担什么角色。HFI 的电流信号里混着三样东西基波电流对应转矩、高频响应电流对应转子位置、PWM 开关噪声。我们要的是第二样另外两样都得滤掉。IIR无限冲击响应滤波器的特点是有反馈、有极点、相位非线性但计算量小、过渡带陡。在 HFI 里它主要干两件事第一带通滤波。把注入频率附近的分量留下来基波和开关噪声滤掉。比如注入频率 1kHzPWM 频率 10kHz那带通滤波器的中心频率就是 1kHz带宽几百 Hz。第二低通滤波。解调之后高频载波被搬移掉剩下的是包含角度误差的低频信号这时候需要低通滤波把残余的高频纹波滤干净。注意IIR 滤波器的相位滞后是绕不开的。你在设计时必须把相位补偿算进去否则估计角度会系统性偏移电机效率下降、发热增加。2.2 双二阶 IIR 带通滤波器的参数计算工程上最常用的 IIR 结构是双二阶Biquad也就是两个二阶节级联。它的传递函数长这样H(z) (b0 b1*z^-1 b2*z^-2) / (1 a1*z^-1 a2*z^-2)设计一个中心频率 f0 1kHz、采样频率 fs 10kHz、品质因数 Q 2 的带通滤波器参数计算过程如下import numpy as np fs 10000.0 # 采样频率 f0 1000.0 # 中心频率 Q 2.0 # 品质因数 w0 2 * np.pi * f0 / fs alpha np.sin(w0) / (2 * Q) b0 alpha b1 0 b2 -alpha a0 1 alpha a1 -2 * np.cos(w0) a2 1 - alpha # 归一化 b0, b1, b2 b0/a0, b1/a0, b2/a0 a1, a2 a1/a0, a2/a0 print(fb0{b0:.6f}, b1{b1:.6f}, b2{b2:.6f}) print(fa1{a1:.6f}, a2{a2:.6f})跑出来大概是 b00.303, b10, b2-0.303, a1-1.273, a20.394。这几个系数直接写进 MCU 的差分方程就行// 双二阶 IIR 带通滤波每个采样周期调用一次 float biquad_bandpass(float x) { static float x1 0, x2 0, y1 0, y2 0; float y b0*x b1*x1 b2*x2 - a1*y1 - a2*y2; x2 x1; x1 x; y2 y1; y1 y; return y; }这里有个坑浮点运算在低端 MCU 上很慢。如果你的芯片没有 FPU建议用 Q15 定点实现系数放大 32768 倍取整。但定点会引入量化误差Q 值越高误差越明显所以定点实现时 Q 别超过 3。2.3 位置估计从高频电流到角度误差解调出高频电流的幅值之后怎么变成角度这里用的是外差法Heterodyne。假设估计角度是 θ_est真实角度是 θ_real角度误差 Δθ θ_real - θ_est。在估计 d 轴注入高频电压后q 轴的高频电流响应近似正比于 sin(2Δθ)。当 Δθ 很小时sin(2Δθ) ≈ 2Δθ也就是说q 轴高频电流幅值直接反映了角度误差。把这个误差信号送进 PLLΔθ → PI 调节器 → 估计转速 ω_est → 积分 → 估计角度 θ_estPLL 的带宽一般取 50~200 rad/s。带宽太低角度跟踪慢电机加速时容易失步带宽太高噪声放大角度抖动。我一般从 100 rad/s 起步根据实际波形微调。实操心得PLL 的 PI 参数不要孤立地调。它和 IIR 滤波器的带宽是耦合的——滤波器带宽窄了PLL 带宽也得跟着降否则两个环节的相位滞后叠加起来系统直接振荡。2.4 磁极极性判断为什么角度会差 180 度这是 HFI 最容易被忽略、也最容易翻车的地方。凸极效应只能告诉你转子轴线的方向但分不清 N 极还是 S 极。也就是说估计角度可能是 θ也可能是 θ 180°。如果搞反了电机要么不转要么效率极低、电流巨大。判断磁极极性的方法核心思路是利用磁饱和效应。在估计的 d 轴正方向注入一个短时脉冲电压然后反向再注入一个。由于永磁体的存在d 轴正方向的磁路饱和程度和反方向不一样导致两个方向的电感不同电流响应幅值也不同。比较两次响应的幅值就能判断出真正的 N 极方向。具体操作步骤在估计 d 轴注入正向电压脉冲持续时间约 1~2ms记录电流峰值 I_pos。等待电流衰减到零约 5ms。在估计 d 轴注入反向电压脉冲同样时长记录电流峰值 I_neg。如果 I_pos I_neg说明估计 d 轴指向 N 极角度正确否则需要加 180°。注意脉冲幅值不能太大一般取额定电流的 30%~50%否则会引起转子明显抖动。脉冲时间也不能太长否则电流饱和判断失效。3. 实操过程从零搭建一套 HFI 无感 FOC3.1 硬件与工具准备先把家伙什备齐。我用的是一套自制的三相逆变板主控是带 FPU 的 Cortex-M4PWM 频率 10kHz死区 1μs。电流采样用的是两颗霍尔电流传感器采样时刻对齐 PWM 中心。项目选型说明主控Cortex-M4 168MHz带 FPU算 IIR 不吃力PWM 频率10kHz注入频率取 1kHz是 PWM 的 1/10电流采样霍尔传感器精度比采样电阻高温漂小注入频率1kHz避开基波和开关噪声注入幅值额定电压的 10%~15%太小信噪比不够太大噪声明显注入频率的选择有个经验公式注入频率取 PWM 频率的 1/10 到 1/5。10kHz PWM 对应 1~2kHz 注入。太低会和基波混叠太高会被 PWM 开关噪声淹没。3.2 注入信号的生成在估计 d 轴的电压指令上叠加高频分量// 每个 PWM 周期调用 float theta_inj 2 * PI * f_inj * t; // 注入相位 float u_inj U_inj * cos(theta_inj); // 注入幅值 // 叠加到估计 d 轴 u_d_est u_d_pid u_inj; u_q_est u_q_pid; // 反 Park 变换到 αβ 轴 u_alpha u_d_est * cos(theta_est) - u_q_est * sin(theta_est); u_beta u_d_est * sin(theta_est) u_q_est * cos(theta_est);这里的关键是注入信号必须加在估计 d 轴上不是真实 d 轴。因为我们不知道真实角度只能加在估计方向上然后通过误差信号去修正估计角度。3.3 电流采样与解调电流采样必须和 PWM 同步。我一般选在 PWM 周期的中点采样这时候开关噪声最小。采到三相电流后Clarke 变换到 αβ 轴再 Park 变换到估计 dq 轴// Clarke 变换 i_alpha i_a; i_beta (i_a 2*i_b) / sqrt(3); // Park 变换到估计 dq 轴 i_d_est i_alpha * cos(theta_est) i_beta * sin(theta_est); i_q_est -i_alpha * sin(theta_est) i_beta * cos(theta_est);然后对 i_q_est 做带通滤波提取出注入频率附近的分量。滤波后的信号再乘以注入信号的同相分量做外差解调float i_q_hf biquad_bandpass(i_q_est); // 带通滤波 float err i_q_hf * cos(theta_inj); // 外差解调 err biquad_lowpass(err); // 低通滤波提取直流分量这个 err 就是角度误差信号送进 PLL。3.4 PLL 参数整定与角度输出PLL 的结构很简单就是一个 PI 加积分// PLL 参数 float Kp_pll 20.0f; float Ki_pll 200.0f; // 每个控制周期调用 float err get_angle_error(); // 上一步解调出的误差 pll_integral Ki_pll * err * Ts; if (pll_integral MAX) pll_integral MAX; if (pll_integral -MAX) pll_integral -MAX; float omega_est Kp_pll * err pll_integral; theta_est omega_est * Ts; // 归一化到 0~2π if (theta_est 2*PI) theta_est - 2*PI; if (theta_est 0) theta_est 2*PI;Kp 和 Ki 的整定我一般用临界比例度法先把 Ki 设为零慢慢加大 Kp 直到角度开始振荡记下此时的 Kp_critical然后取 Kp 0.5 * Kp_criticalKi Kp / (0.5 * T_critical)。实测下来这套方法比盲调快得多。3.5 磁极极性判断的完整流程启动流程里磁极极性判断必须在 HFI 角度收敛之后、电机开始闭环之前完成。完整时序注入高频信号等 PLL 收敛约 100ms此时 theta_est 已经能跟踪转子轴线但可能差 180°。停止高频注入在估计 d 轴注入正向脉冲 2ms记录 I_pos。等待 5ms让电流衰减到零。注入反向脉冲 2ms记录 I_neg。比较 I_pos 和 I_neg如果 I_pos I_neg说明 theta_est 反了theta_est PI。重新启动高频注入进入闭环。踩过的坑脉冲之间等待时间不够电流没衰减完就发下一个脉冲导致判断结果随机跳变。后来把等待时间从 3ms 加到 5ms问题消失。这个时间取决于电机的电气时间常数 L/RL 越大、R 越小等待时间越长。4. 常见问题与排查技巧实录4.1 角度估计抖动大、电机噪声明显这是最常见的抱怨。原因通常有三个注入幅值太大、IIR 滤波器带宽太宽、PLL 带宽太高。排查顺序先把注入幅值降到额定电压的 8%看抖动是否改善。如果没改善把带通滤波器的 Q 值从 2 提到 4缩窄带宽。还不行把 PLL 的 Kp 减半。我遇到过最顽固的一次最后发现是电流采样和 PWM 没对齐采样时刻落在开关沿上噪声直接混进了解调信号。把采样点移到 PWM 中心后波形立刻干净了。4.2 电机启动时反转或抖动十有八九是磁极极性判断错了。用示波器抓一下 I_pos 和 I_neg 的波形看看两个脉冲的电流峰值差异是否明显。如果差异很小小于 10%说明脉冲幅值不够加大到额定电流的 50% 再试。如果差异很大但方向判断反了检查比较逻辑是不是写反了。还有一种可能是 HFI 角度还没收敛就急着切闭环。我一般会等 PLL 的误差信号稳定在零附近至少 50ms再进入下一步。4.3 高速段切换时失步HFI 和反电动势观测器的切换是个技术活。切换太早观测器还没准备好切换太晚HFI 在高速段性能下降。我的做法是在 5%~10% 额定转速之间做渐变切换用加权系数把两个角度估计值混合而不是硬切。float w (omega_est - omega_low) / (omega_high - omega_low); if (w 0) w 0; if (w 1) w 1; theta_final w * theta_observer (1 - w) * theta_hfi;这样切换过程平滑不会出现角度跳变。4.4 常见问题速查表现象可能原因排查方法解决措施角度抖动大注入幅值过大降低注入幅值观察降到额定电压 8%~10%角度抖动大IIR 带宽过宽提高 Q 值Q 从 2 提到 4角度抖动大采样与 PWM 不同步示波器看采样时刻移到 PWM 中心启动反转磁极判断错误抓脉冲电流波形检查比较逻辑加大脉冲启动抖动PLL 未收敛看误差信号延长收敛等待时间切换失步硬切换看切换瞬间角度改为加权渐变切换电流波形畸变注入频率与基波混叠看电流频谱提高注入频率4.5 几个不外传的调试技巧技巧一用 DAC 输出内部信号。把解调后的误差信号、估计角度、真实角度如果有编码器通过 DAC 输出到示波器一眼就能看出问题在哪。比盯着串口打印的数字强一百倍。技巧二先开环验证注入链路。不要一上来就闭环。先固定一个角度注入高频信号看解调出的误差信号是否随真实角度变化。这一步能排除 80% 的硬件和采样问题。技巧三IIR 滤波器先用 MATLAB 仿真。把系数算好后在 MATLAB 里跑一遍阶跃响应和频率响应确认相位滞后在可接受范围内再写进 MCU。我见过太多人直接写系数结果相位滞后 90°角度根本没法用。技巧四注入频率避开机械共振点。有些电机的机械结构在特定频率会共振如果注入频率刚好撞上电机会发出刺耳的噪声。换个注入频率就能解决。5. 从代码到波形一次完整的调试记录5.1 台架搭建与初始波形台架上用的是一台 400W 内嵌式 PMSM额定电流 2.5A极对数 4。编码器装在尾部用来对比 HFI 估计角度和真实角度。第一次上电注入频率 1kHz幅值 1.5VPLL 带宽 100 rad/s。示波器上看到估计角度和真实角度基本重合但误差信号上有明显的 2kHz 纹波——这是注入频率的二次谐波说明低通滤波器没滤干净。把低通截止频率从 500Hz 降到 200Hz纹波消失角度平滑。5.2 磁极判断的实测数据正向脉冲电流峰值 I_pos 1.82A反向脉冲 I_neg 2.15A。I_pos I_neg说明估计 d 轴指向 N 极角度正确。如果反过来就需要加 180°。这里有个细节脉冲幅值我一开始设的是额定电流的 30%0.75A结果两个方向的电流差异只有 5%判断不稳定。加到 50%1.25A后差异扩大到 18%判断就稳了。所以脉冲幅值不能太保守。5.3 切换过程的波形分析从 HFI 切换到反电动势观测器转速设在 200rpm。用加权渐变切换过渡时间 500ms。示波器上看切换过程中角度没有跳变电流波形平滑。如果硬切能看到明显的角度跳变和电流冲击。经验切换的转速点不要设得太低。反电动势观测器需要一定的反电动势幅值才能工作一般至少 5% 额定转速。设太低观测器本身就不准切换过去反而更差。6. 写在最后的一些个人体会HFI 这套东西理论看一遍就懂但真正跑起来坑全在细节里。IIR 滤波器的相位、PLL 的带宽、磁极判断的脉冲幅值、切换的时机每一个参数都需要在台架上反复试。我自己的经验是先把开环注入跑通再加 PLL最后做磁极判断和切换。每一步都验证波形不要跳步。另外别迷信仿真。MATLAB 里跑得再漂亮到了实际硬件上采样噪声、死区、器件非线性都会让结果偏离。仿真用来定参数范围实际调试用来微调。两者结合才能把 HFI 调稳。最后分享一个小技巧如果实在调不出来把注入频率降一半试试。很多时候问题出在注入频率和 PWM 频率的比值不合适降一半往往能豁然开朗。