
1. 为什么低速下必须换一套玩法从反电动势失效说起搞过永磁同步电机无感FOC的人都有一个共识中高速区间靠反电动势估算转子位置基本是送分题。反电动势幅值和转速成正比转速越高信号越强信噪比越好观测器随便调调都能收敛。但一旦转速掉到额定转速的百分之几甚至要求零速带载启动反电动势几乎衰减到零这时候你拿什么去估算转子位置答案就是高频注入英文叫High Frequency Injection简称HFI。HFI的核心思路说白了就一句话既然电机在低速下不产生足够的反电动势来暴露转子位置那我就主动往定子绕组里打一个高频信号利用电机本身的凸极效应saliency去问转子到底在哪。永磁同步电机分两类一类是表贴式SPM交直轴电感基本相等凸极率接近1这类电机做HFI非常吃力另一类是内置式IPM永磁体埋在转子铁芯内部d轴磁路经过永磁体磁阻大电感小q轴磁路主要走铁芯磁阻小电感大。这个Ld和Lq的差异就是HFI赖以生存的物理基础。我接触过的项目中低速HFI主要用在几个场景电梯曳引机的零速伺服、注塑机的低速大扭矩直驱、纺织机械的精确张力控制以及一些需要从零速直接带满载启动的场合。这些场景的共同特点是对低速性能要求极高而编码器又因为成本、布线、环境油污、粉尘、震动等原因不适合安装。所以无感FOC加HFI这套组合在工业界是有真实刚需的。高频注入按注入轴分主流有旋转电压注入、脉振电压注入、方波注入几大类。按注入信号形状分有正弦波注入和方波注入。这篇要聊的是d轴正弦波高频注入也就是在估算的d轴方向上叠加一个高频正弦电压通过检测q轴高频电流响应来提取位置误差信号。这个方案的好处是信号处理链路清晰、对PWM死区不敏感、电流环带宽压力相对可控适合载波频率在10kHz到20kHz之间的中功率驱动器。注意HFI不是万能的。凸极率低于1.2的电机HFI的位置估算精度会急剧恶化这时候要么换电机要么考虑其他方案。选型阶段就要把电机凸极率作为硬指标来评估。2. d轴正弦波注入的物理图像把电机当成一个带位置标签的变压器2.1 从电感矩阵到位置误差信号要理解d轴正弦波高频注入得先把电机的高频模型建立起来。在静止坐标系下PMSM的电压方程可以写成[ud] [Rs p*Ld -we*Lq ] [id] [0 ] [ ] [ ] [ ] [ ] [uq] [we*Ld Rs p*Lq ] [iq] [we*psi_f]其中p是微分算子we是电角速度psi_f是永磁磁链。在低速甚至零速时we约等于零交叉耦合项和反电动势项都可以忽略方程退化成两个独立的RL电路。这时候往定子施加高频电压电机就表现为一个纯电感网络而电感值随转子位置变化。把方程变换到估算的dq坐标系用上标^表示估算值定义位置误差角delta_theta theta - theta_hat。经过坐标变换和忽略电阻高频下感抗远大于电阻后高频电压和电流的关系可以写成[u_dh] [L_avg L_diff*cos(2*delta_theta) L_diff*sin(2*delta_theta)] [i_dh] [ ] j*wh*[ ] [ ] [u_qh] [L_diff*sin(2*delta_theta) L_avg - L_diff*cos(2*delta_theta)] [i_qh]这里L_avg (Ld Lq)/2L_diff (Ld - Lq)/2wh是注入频率。这个矩阵就是整个HFI算法的核心。它告诉我们一个关键事实高频电流响应的幅值和相位都携带了位置误差角delta_theta的信息。2.2 为什么选d轴注入而不是q轴在估算的d轴注入高频电压意味着u_dh Vhsin(wht)u_qh 0。代入上面的矩阵解出q轴高频电流i_qh (Vh*sin(wh*t) / (wh*Ld*Lq)) * L_diff * sin(2*delta_theta)这个式子非常漂亮。它说明q轴高频电流的幅值正比于sin(2delta_theta)而sin(2delta_theta)在delta_theta接近零时近似等于2*delta_theta。也就是说q轴高频电流的幅值就是位置误差的线性度量。只要把i_qh提取出来经过解调、低通滤波就能得到误差信号再送进锁相环或者龙贝格观测器就能把估算位置收敛到真实位置。那为什么不在q轴注入如果在q轴注入解出来的d轴高频电流表达式里会出现cos(2delta_theta)项在delta_theta为零附近cos(2delta_theta)约等于1对误差不敏感而且符号无法区分正负偏差。所以d轴注入是更自然的选择误差信号在零点附近有最大斜率观测器收敛速度最快。2.3 注入频率和幅值的选取逻辑注入频率wh不能随便选。它必须满足几个约束第一要远高于电流环带宽否则电流环会把注入信号当成扰动去调节把信号吃掉第二要远低于PWM载波频率否则一个注入周期内采样点太少解调精度不够第三要避开电机的机械谐振频率否则会激起震动。工程上常用的经验值是载波频率10kHz时注入频率取1kHz到2kHz载波频率20kHz时注入频率取2kHz到4kHz。注入电压幅值Vh一般取额定电压的5%到15%具体要看电机的凸极率和电流环能承受的额外电流纹波。Vh太小信噪比不够Vh太大额外损耗和噪音都上去了。我一般会先算一下注入电流幅值Ih Vh / (wh * Ld)。如果Ih超过额定电流的20%就要考虑降低Vh或者提高wh。这个计算在选参数阶段非常关键能避免一上来就把电流环搞饱和。3. 信号解调链路从高频电流到位置误差的完整推导3.1 带通滤波先把注入频率的成分抠出来采样得到的相电流经过Clarke和Park变换后得到估算dq轴上的电流。这个电流里混着基波电流、PWM谐波、注入响应。第一步是用带通滤波器把注入频率附近的成分提取出来。带通滤波器的中心频率就是wh带宽一般取wh的10%到20%。这里有个坑带通滤波器的相位延迟会直接影响解调精度。如果滤波器在wh处的相移不是零解调出来的误差信号就会带一个固定偏差。解决办法有两种一是用窄带带通相位特性在中心频率附近近似线性可以标定补偿二是用同步解调把滤波和解调合并处理。我一般倾向于第二种后面会展开。3.2 同步解调乘以参考信号再低通从带通滤波器出来的q轴高频电流可以写成i_qh Ih * sin(wh*t phi) * sin(2*delta_theta)其中phi是滤波器和电路引入的相位延迟。同步解调的做法是把这个信号乘以一个和注入信号同频的参考信号sin(wh*t)得到i_qh * sin(wh*t) Ih * sin(2*delta_theta) * [cos(phi) - cos(2*wh*t phi)] / 2这个结果里有两部分直流分量Ihsin(2delta_theta)*cos(phi)/2和二倍频分量。用一个低通滤波器把二倍频滤掉剩下的直流分量就是我们要的误差信号epsilon Ih * cos(phi) * sin(2*delta_theta) / 2当delta_theta很小时epsilon约等于Ih*cos(phi)*delta_theta。这就是位置误差的线性估计。cos(phi)是一个常数增益可以在标定阶段测出来补偿掉。3.3 锁相环把误差信号变成转速和位置拿到epsilon之后下一步是设计观测器把误差收敛到零。最常用的是锁相环PLL结构d(omega_hat)/dt Ki * epsilon d(theta_hat)/dt omega_hat Kp * epsilon这是一个典型的二阶系统。Kp和Ki的设计要兼顾收敛速度和超调量。我一般按二阶系统阻尼比0.707来整定自然频率取电流环带宽的1/5到1/10。这样既能保证低速下快速收敛又不会因为带宽太高引入噪声。如果你用的是龙贝格观测器思路类似只是把误差信号作为校正项加到状态方程里。龙贝格观测器的好处是能同时估算转速和位置而且对参数变化有一定鲁棒性。但HFI加龙贝格观测器的组合在极低速下还是HFI主导观测器更多是起平滑和预测作用。提示PLL的积分器一定要加限幅防止在位置误差很大时积分饱和导致收敛变慢甚至发散。限幅值一般取额定转速的10%到20%。4. 参数敏感性分析哪些量会要你的命4.1 电感参数失配对误差增益的影响从误差信号表达式epsilon Ihcos(phi)sin(2delta_theta)/2可以看出误差增益和Ih有关而Ih Vh/(whLd)。如果实际Ld和控制器里用的Ld不一致Ih就会偏差导致误差增益变化。更麻烦的是Ld和Lq本身会随电流饱和而变化。在重载情况下铁芯饱和会让Ld和Lq都下降凸极率Lq/Ld也可能变化。我实测过一台7.5kW的IPM电机空载时Lq/Ld约2.3满载时降到1.8左右。如果控制器里用的是空载参数满载时误差增益会下降约20%PLL的等效带宽也跟着降收敛变慢。解决办法是在线辨识电感或者至少在调试时把典型负载下的参数标定进去。4.2 逆变器非线性的影响逆变器死区和管压降会导致输出电压和指令电压之间有偏差。这个偏差在低频时影响很大因为死区时间占整个周期的比例高。对于HFI来说注入频率通常在1kHz以上死区时间一般1到2微秒占注入周期的比例很小所以影响相对可控。但如果注入频率选得偏低比如500Hz死区效应就会明显恶化解调精度。另一个非线性因素是电流采样误差。采样电阻的温漂、运放的失调、ADC的量化噪声都会在解调后的误差信号里引入直流偏置。这个偏置会导致位置估算有一个固定偏差。我一般会在调试时记录零速下的epsilon均值如果偏离零超过阈值就在软件里做偏置补偿。4.3 交叉饱和与多凸极效应IPM电机的凸极不仅来自转子几何还来自铁芯饱和。当d轴电流较大时d轴磁路饱和加剧Ld下降凸极率反而可能上升。但q轴电流大时q轴磁路饱和Lq下降凸极率下降。这种交叉饱和效应会让误差信号不再严格正比于sin(2*delta_theta)而是带上了高次谐波。在多凸极电机比如某些分数槽集中绕组电机中电感随位置变化的周期不是180度电角度而是更复杂的波形。这时候用标准的sin(2*delta_theta)模型去解调就会引入周期性误差。处理办法是标定实际电感的谐波成分在解调时做补偿或者直接用查表法。5. 从仿真到样机我踩过的那些坑5.1 仿真里收敛样机上发散第一次做HFI的时候我在Simulink里搭了模型参数调好波形漂亮得很位置误差收敛到零转速阶跃响应也很干净。结果烧到样机上一上电就发现估算位置在抖转速环一闭合就飞车。排查了两天才发现仿真里用的电机模型是线性的电感恒定而实际电机在注入电压下电流纹波导致电感在每个PWM周期内都在变。更关键的是仿真里没有考虑ADC采样和PWM更新的时序配合。具体来说我的注入信号是在PWM周期中点采样但PWM更新是在周期起点。这导致实际施加的电压和采样时刻的电流之间有一个半周期的相位差。在仿真里这个相位差被忽略了样机上就表现为解调误差信号里混入了大量二倍频纹波。解决办法是把采样时刻和PWM更新对齐或者在解调时补偿这个半周期相位。5.2 带通滤波器的群延迟导致PLL振荡第二个坑是带通滤波器的群延迟。我一开始用了一个四阶巴特沃斯带通中心频率2kHz带宽200Hz。仿真里没问题样机上PLL的Kp稍微给大一点就振荡。后来用频率响应分析仪测了一下滤波器的相频特性发现群延迟在中心频率附近有将近200微秒。这个延迟在PLL环路里等效于一个相位滞后把相位裕度吃掉了。换成二阶滤波器群延迟降到50微秒以内问题解决。所以带通滤波器的阶数不是越高越好要在选择性和延迟之间折中。如果对延迟特别敏感可以考虑用自适应陷波器或者同步平均法来替代带通滤波。5.3 零速带载启动时的积分饱和零速带载启动是HFI最考验人的场景。电机静止位置误差可能很大比如初始位置随机PLL的积分器会快速累积。如果负载转矩很大电机在位置收敛之前根本转不动积分器就一直积直到饱和。等位置收敛了积分器退饱和又需要时间导致启动过程拖沓甚至失败。我的处理办法是分阶段启动第一阶段只闭合电流环注入HFI让PLL先收敛位置这时候转速环不投入电机可能微微抖动但不至于飞车第二阶段位置收敛后再缓慢投入转速环同时给积分器一个合理的初值。这个初值可以根据负载转矩估算或者干脆从零开始但限制积分器的最大输出。注意零速启动时如果电机凸极率不够或者负载惯量太大HFI可能无法在合理时间内收敛。这时候要考虑增加注入幅值或者改用其他启动策略比如I/F启动过渡到HFI。6. 调试与验证怎么判断HFI真的在工作6.1 用示波器看解调前后的波形调试HFI最直接的办法是用示波器看几个关键信号注入电压指令、q轴高频电流、解调后的误差信号、估算位置和真实位置的对比。如果误差信号在位置误差为零时确实过零而且斜率方向正确说明解调链路是通的。我一般会先用手转动电机观察误差信号是否随位置变化。如果转一圈误差信号变化两个周期说明sin(2*delta_theta)的关系是对的。如果变化一个周期或者四个周期说明解调参考信号的频率或者相位有问题。6.2 位置估算精度的量化评估光看波形不够还要量化评估。我会用一台带高精度编码器的电机做对比记录估算位置和真实位置的差值。在低速下比如10rpm如果位置误差峰峰值在5度电角度以内基本可以接受。如果超过10度就要查参数或者解调链路。评估时要注意编码器本身有安装误差和量化误差对比时要扣除。另外位置误差会随负载变化空载和满载要分别测。我一般会做一组负载扫描从空载到额定负载记录位置误差曲线看是否在可接受范围内。6.3 常见问题速查表现象可能原因排查方向位置估算抖动大注入幅值太小或带通带宽太宽增大Vh收窄带通带宽低速收敛慢PLL带宽太低或误差增益不足提高Kp/Ki检查电感参数零速启动失败积分饱和或初始位置误差太大分阶段启动限制积分器位置有固定偏差解调偏置或滤波器相位延迟标定偏置补偿相位高速时HFI干扰HFI未及时退出设置平滑切换逻辑7. 和其他无感方案的配合HFI不是孤岛7.1 低速HFI与中高速反电动势观测器的切换实际产品里HFI只在低速段用转速上去之后要切到反电动势观测器比如滑模观测器或者龙贝格观测器。切换点一般在额定转速的5%到10%。切换过程要平滑不能有位置跳变。我一般用加权融合在切换区间内估算位置 alpha * HFI位置 (1-alpha) * 反电动势位置alpha随转速线性下降。切换的难点在于两个观测器的位置误差特性不同。HFI在低速下误差小高速下因为注入频率相对转速不再足够高误差会变大。反电动势观测器正好相反。所以切换点要选在两者误差相当的位置。我一般会做一组实验分别测两个观测器在全速范围内的位置误差找交叉点。7.2 HFI与参数辨识的相互促进HFI本身可以用来辨识电感。因为注入高频信号时电机的阻抗主要就是感抗通过测量高频电压和电流的幅值相位可以反推出Ld和Lq。这个信息可以反过来喂给反电动势观测器提高中高速的估算精度。我做过一个方案在电机启动前先注入一组不同方向的高频信号辨识出Ld和Lq的初始值然后HFI用这组参数去估算位置。运行过程中再根据电流大小对电感做在线修正。这样整个无感FOC系统在低速和中高速都能有不错的表现。7.3 什么时候该放弃HFIHFI不是万能的。如果电机凸极率太低比如SPM电机或者应用场景对噪音和额外损耗极其敏感HFI可能就不合适。这时候可以考虑其他低速方案比如高频方波注入对凸极率要求稍低、旋转注入信号处理更复杂但精度更高或者干脆用I/F启动加反电动势观测器过渡。我在一个风机项目里就遇到过这个问题。风机电机是SPM凸极率只有1.05HFI根本做不出来。最后改用I/F启动开到一定转速后切反电动势观测器虽然低速性能一般但风机对低速转矩要求不高勉强能用。所以方案选型一定要先看电机和应用需求不能拿着锤子找钉子。8. 代码实现的关键片段与注释8.1 注入信号生成// 注入信号生成在估算d轴叠加高频正弦 // Vh: 注入幅值, wh: 注入角频率, Ts: 控制周期 float theta_h 0.0f; // 注入相位累加器 float Vh 30.0f; // 注入电压幅值根据母线电压和电机参数标定 float wh 2.0f * 3.1415926f * 2000.0f; // 2kHz注入频率 void inject_signal(float *ud_ref, float *uq_ref) { theta_h wh * Ts; if (theta_h 2.0f * 3.1415926f) { theta_h - 2.0f * 3.1415926f; } float u_inj Vh * sinf(theta_h); *ud_ref u_inj; // 只加在d轴 // uq_ref 不变 }这段代码里theta_h是注入相位累加器每个控制周期累加wh*Ts。注意累加后要做归一化防止浮点数精度丢失。注入电压只加在d轴q轴不动。Vh和wh的选取前面已经讲过这里不再重复。8.2 同步解调与低通滤波// 同步解调从q轴高频电流中提取位置误差 // i_qh: 带通滤波后的q轴高频电流 // theta_h: 注入相位 float demodulate(float i_qh, float theta_h) { float ref sinf(theta_h); // 参考信号与注入同相 float mixed i_qh * ref; // 相乘 // 低通滤波截止频率取注入频率的1/10 static float lpf_state 0.0f; float alpha 0.05f; // 一阶低通系数根据截止频率计算 lpf_state alpha * (mixed - lpf_state); return lpf_state; // 输出误差信号epsilon }同步解调的关键是参考信号要和注入信号同频同相。如果滤波器引入了相位延迟参考信号也要相应移相。低通滤波器的截止频率不能太高否则二倍频滤不干净也不能太低否则动态响应太慢。我一般取注入频率的1/10左右。8.3 PLL观测器实现// PLL观测器从误差信号估算转速和位置 // epsilon: 解调后的误差信号 // Kp, Ki: PLL增益 float omega_hat 0.0f; // 估算转速 float theta_hat 0.0f; // 估算位置 void pll_update(float epsilon) { // 比例积分 float omega_corr Kp * epsilon; omega_hat Ki * epsilon * Ts; // 限幅防止积分饱和 if (omega_hat OMEGA_MAX) omega_hat OMEGA_MAX; if (omega_hat -OMEGA_MAX) omega_hat -OMEGA_MAX; // 位置更新 theta_hat (omega_hat omega_corr) * Ts; // 归一化 if (theta_hat 2.0f * 3.1415926f) theta_hat - 2.0f * 3.1415926f; if (theta_hat 0.0f) theta_hat 2.0f * 3.1415926f; }PLL的Kp和Ki按二阶系统整定。我一般先确定自然频率wn和阻尼比zeta然后Kp 2zetawnKi wn*wn。wn取电流环带宽的1/5到1/10。限幅值OMEGA_MAX取额定转速的10%到20%。9. 实测数据与经验总结9.1 一台7.5kW IPM电机的实测结果我用一台7.5kW、额定转速1500rpm、凸极率约2.2的IPM电机做了完整测试。注入频率2kHz注入电压幅值40V母线电压540VPLL自然频率50Hz阻尼比0.707。测试结果如下转速位置误差峰峰值转速波动备注0 rpm3.5度不适用零速带载负载50%额定10 rpm4.2度2%空载50 rpm5.8度1.5%空载100 rpm7.1度1.2%空载准备切换150 rpm9.5度1.0%已切换到反电动势观测器从数据看零速和极低速下位置误差在5度电角度以内满足大多数工业应用要求。转速升高后HFI误差增大所以在100rpm左右开始切换150rpm完成切换。9.2 几个反直觉的发现第一个反直觉的发现是注入电压幅值不是越大越好。我一开始把Vh加到80V以为信噪比更高结果位置误差反而变大了。原因是注入电流太大导致电感饱和凸极率下降误差信号的非线性也加剧。后来降到40V误差反而小了。所以Vh要选在信噪比和饱和之间的平衡点。第二个反直觉的发现是PLL带宽不是越高越好。我试过把wn提到200Hz理论上收敛更快但实际位置抖动明显增大因为高频噪声被放大了。降到50Hz后收敛速度虽然慢一点但稳态精度好很多。低速HFI本来就不追求动态响应稳态精度才是第一位的。第三个反直觉的发现是带通滤波器的中心频率不一定要严格等于注入频率。因为注入频率可能因为时钟误差有微小偏移如果带通太窄信号会被衰减。我一般把带通中心频率设得比注入频率高5%左右带宽取注入频率的15%这样既能滤掉基波和低次谐波又能容忍一定的频率偏移。9.3 给后来者的几条实操建议第一调试顺序很重要。先开环注入用示波器确认解调链路通了再闭合PLL最后闭合转速环。不要一上来就全闭环出了问题根本不知道是哪一环。第二参数标定要留记录。每次改Vh、wh、Kp、Ki都要记录对应的位置误差和转速波形。HFI的参数之间耦合很强凭感觉调很容易绕圈子。第三注意温度影响。电机运行一段时间后绕组电阻和永磁体磁链都会随温度变化虽然HFI主要依赖电感但电阻变化会影响高频模型的精度。如果应用场景温度变化大要考虑温度补偿。第四多凸极电机的处理要特别小心。如果你的电机是分数槽集中绕组电感波形可能不是纯正弦解调出来的误差信号会有谐波。这时候要么做谐波补偿要么换用对多凸极不敏感的注入方案。第五别忘了安全。HFI注入会在电机里产生额外损耗和噪音长时间大电流注入可能导致过热。调试时一定要监控绕组温度设置过温保护。我见过有人调试时忘了这茬把电机烧了。这套d轴正弦波高频注入方案我从第一次跑通到现在前后迭代了大概五六个版本。每一次出问题回头看都是对某个细节理解不到位。HFI的公式不复杂难的是把公式和实际系统的非理想因素对上。希望这些推导和踩坑记录能让你少走一些弯路。