
做无感FOC的人应该都有过这样一段经历代码照着参考工程抄好了电流环也能转电机在几百转的时候跟手得很但只要一把速度降到零附近要么抖要么不能自启动要么一加载就失步。问题往往不是某个公式写错而是几个关键词之间的关系没理顺——FOC中断怎么安排、Ud/Uq到底代表什么、控制频率该定多少、HFI高频注入频率又怎么选。标题里这几个概念看着独立实际是一套互相咬合的时序和坐标系体系。这篇文章我打算把它们从下到上理一遍顺带给出可以落地的配置思路适合正在调PMSM无感FOC、卡在零低速启动、或者刚接触高频注入的工程师。1. FOC中断到底在跑什么一个控制周期的完整时间线1.1 PWM、ADC与电流环为什么必须咬在一起很多刚开始写FOC的人会问控制代码非得放中断里吗我放在主循环行不行答案是行但你要能接受电流波形没法看。FOC的电流环本质上是一个跟PWM载波同步的采样-计算-更新过程不是随便隔几百微秒跑一次就行的。为什么必须同步因为三相电流是通过母线采样电阻或者下桥臂采样的采样的最佳时刻是PWM载波的波峰或者波谷中点。这个时刻开关管处于确定的开关状态相电流等于该周期的平均电流电流纹波最小。你要是在开关动作的边沿去触发ADC采到的是一堆毛刺滤波都救不回来。所以工程上的标准做法是这样的PWM定时器产生载波在载波中点或者边沿触发ADC采样。ADC转换完成之后触发中断中断里执行电流环计算。计算完的电压指令写回PWM比较寄存器下一个载波周期生效。这个链路里的所有动作都必须在一次PWM周期内完成。换句话说PWM频率决定了ADC采样频率ADC采样频率决定了电流环中断频率电流环中断频率又等于电流环控制频率。这四个数字本质上是一个数字。我见过有人在10kHz的PWM下硬把电流环放到1kHz去跑说“反正电机也能转”。电机确实能转但那是靠机械惯量在硬撑动态响应、弱磁、观测器全都会出问题。1.2 中断里的执行顺序与“堵车”风险一个典型的FOC电流环中断服务程序执行顺序大致是这样读取ADC转换结果获得两相或者三相电流做Clark变换把三相电流变成静止坐标系的Iα、Iβ读取当前转子电角度θ做Park变换得到旋转坐标系的Id、Iq分别执行d轴和q轴的电流PI调节器得到Ud、Uq做反Park变换得到Uα、Uβ送入SVPWM模块计算三个比较值写PWM比较寄存器更新占空比如果这个周期还轮到速度环或者观测器再往下执行。这套流程看似简单但每一步都吃CPU时间。我实测过一个常见的STM32F4工程在10kHz中断频率下纯电流环大约占40到50微秒。如果还要在中断里跑滑模观测器再加20到30微秒。算下来100微秒的周期已经用掉百分之七十以上。这里最大的坑叫“中断溢出”。如果中断里的总执行时间超过了PWM周期下一次ADC中断到来时上一次还没跑完中断就会嵌套重入或者被硬件强制挂起。表现是电流波形偶尔出现一个异常尖峰速度环数据错乱严重的直接hardfault。后面我会专门讲怎么测中断负载这里先记住一个原则每个PWM周期里只做该做的事能分出去的都分出去别让电流环中断变成一个什么都往里塞的大杂烩。从这一步开始Ud和Uq这两个值就出现了。中断里用到的转子角度、电流变换、PI输出全部都在为这两个值服务。所以下一节必须把它们彻底搞清楚。2. Ud/Uq到底是什么名字背后那套旋转坐标系2.1 为什么最终电压指令是U_d/U_q而不是Uα/Uβ先说结论Ud/Uq是转子同步旋转坐标系下的电压指令不是物理上实际存在的电压。实际施加到电机端子上的是三相PWM电压或者等效成静止坐标系下的Uα、Uβ。那为什么控制回路非要绕一圈把指令换算到旋转坐标系里因为电流也是这么变换的。三相正弦电流在静止坐标系下是交流量你用PI调节器去跟踪交流量带宽不够就追不上带宽太高又容易放大噪声。但把它通过Park变换放到转子坐标系下转速恒定的时候Id和Iq都是直流量。PI调节器对直流量天生友好可以实现无静差跟踪。电压作为电流环的输出自然也在同一个坐标系里表示这就是U_d/U_q的来历。这里有一个很多初学者会踩的误区把U_d/U_q当成了可以用万用表量出来的东西。它不是。U_d/U_q只是控制算法内部的中间量要经过反Park变换和SVPWM之后才会变成真正的相电压。调试的时候如果你想确认电压指令有没有问题正确做法是看Uα、Uβ的合成矢量幅值或者看最终PWM的占空比而不是盯着U_d/U_q单独一个轴说事。顺带说一句写法问题。U_d/U_q和Ud/Uq在文献里都有一般约定下标表示物理量所在坐标系小写d/q指瞬时值大写D/Q有时指直流量或者标幺值。绝大多数应用里它们是一回事你只要在工程里统一一种写法别混用就行。2.2 从母线电压到U_d/U_q的完整换算手把手算一遍做FOC移植的时候最容易错的就是这个换算链。我把从母线电压到U_d/U_q的完整路径写出来每一步都带实际数值。首先从逆变器侧看。假设母线电压Udc24VSVPWM采用常见的七段式调制。三相桥臂的开关状态合成一个电压矢量对应的相电压幅值最大可以达到U相_peak_max Udc / √3 ≈ 13.86V也就是说在24V母线下面你最多只能让电机相电压的峰值到13.86V左右再高就进入过调制区波形开始失真。假设电流环PI输出了一组电压指令Ud4VUq8V。当前转子电角度θ30°反Park变换得到Uα Ud·cosθ - Uq·sinθ 4×0.866 - 8×0.5 ≈ -0.54V Uβ Ud·sinθ Uq·cosθ 4×0.5 8×0.866 ≈ 8.93V合成矢量幅值|Us| √(Uα² Uβ²) √(0.29 79.7) ≈ 8.94V这个值没超过13.86V的极限所以当前指令是正常的。接着SVPWM会根据Uα、Uβ计算相邻两个基本矢量的作用时间再映射成三个桥臂的比较值。从电流采样那边看三相电流换算成Id/Iq用的是同样的坐标变换只是把电压换成电流。工程里最容易出错的地方是Park变换里的角度符号。同样是θ30°有的资料定义为从α轴逆时针转有的使用电角度负方向一旦方向反了Id和Iq的极性就错电流环会直接把电压推到饱和电机嗡嗡响但不转。我建议调试的时候先在低速下开环给一个固定角度手动给Uq一个正的小电压看电机轴是否朝预期方向转、电流是否和指令一致。这一步通过之后再切闭环能省掉后面大量排查时间。2.3 电压极限与调制比PI输出不是想给多少给多少电流环PI调节器的输出是U_d/U_q但它并不会自己限制幅值。如果负载突变电流误差很大PI积分项可能一路增长输出的U_d/U_q合成矢量会超过逆变器能提供的最大电压。超过之后会发生什么反Park变换得到的Uα/Uβ依然能算出来SVPWM也会输出占空比但实际合成的电压矢量不再是你想要的形状而是被限制在六边形边界上等效输出电压变小。这个时候电流环的实际增益下降Id/Iq跟不上指令表现出来就是弱磁段电流拉不住重载时失步。解决方法是加电压限幅。常规做法是限制合成矢量幅值|Us| √(Ud² Uq²) ≤ Udc / √3如果超了按比例缩小Ud和Uq保持矢量方向不变。还有一个更细致的问题是不同角度下逆变器能达到的最大电压不是一个圆而是六边形。严格做过调制控制时会用六边形限幅不过对大多数应用来说圆形限幅实现简单、表现稳定足够用了。理解U_d/U_q的物理含义和限幅逻辑之后下一个问题自然浮出来电流环跑多快合适控制频率定多少这直接关系到整个中断链路的设计。3. 控制频率怎么定电流环、速度环与中断的取舍3.1 电流环频率为什么必须跟着PWM走前面说过了电流环频率等于PWM频率因为采样是由PWM触发的。那PWM频率本身怎么选我见过有人直接拍脑袋定个10kHz也有很多资料推荐8k到20k。实际选择要同时看几个因素。第一是电机的电气时间常数。电流环要能有效控制电流开关周期至少要比电流环期望的上升时间小一个数量级以上。对常见的低压PMSM相电感在几百微亨到几毫亨之间相电阻几十到几百毫欧电气时间常数大致在几毫秒到几十毫秒。8kHz以上的开关频率足够覆盖绝大多数场景。第二是电频率。极对数多、转速高的电机电频率高PWM频率要留出足够倍数通常至少是电频率的15到20倍。比如一个10极对的电机最高转速3000rpm电频率是3000/60×10500Hz。用8kHz PWM倍数是16倍临界能用但电流纹波会明显一些上到12kHz或16kHz就从容很多。第三是开关损耗和死区影响。频率越高开关损耗越大死区时间占整个开关周期的比例也越大电流波形更容易失真。工业上大功率驱动器常用4kHz甚至更低小型伺服常用16kHz。具体选多少本质是在响应速度和损耗之间做权衡没有绝对正确答案。我在实际项目中给过一个路径先根据电频率确定下限再根据死区和谐振点微调。比如某项目电机额定3000rpm8极对电频率最高400Hz我试过8kHz、10kHz、12kHz三档。8kHz在低速时能听到明显的高频噪声12kHz噪声人耳基本听不到但IGBT温度上升了约6度。最后选了10kHz噪声还能接受效率损失也在预算内。3.2 速度环频率为什么只能慢半拍电流环定完之后速度环频率就好定了一般是电流环频率的1/5到1/10也就是1kHz到2kHz这个范围。为什么不能直接让速度环跟电流环一样快机械系统的时间常数远大于电气系统。转子惯量决定了速度不可能在几百微秒内突变你把速度环频率拉到10kHz等于在用一个快速控制器去跟踪一个慢速物理量结果只是放大了速度估算噪声。速度估算本身就带噪声。无论是霍尔传感器还是无感观测器速度信号都要经过滤波而滤波器带来的相位延迟在频率高的时候会显著影响稳定性。举个例子同样的速度环PI参数在1kHz下稳定直接改到4kHz电机可能就开始嗡嗡振动甚至出现转速波动。这不是PI参数没调好是控制周期和估算噪声根本不匹配。所以常见的级联结构是外环速度环在较低频率运行输出q轴电流指令Iq_ref内环电流环在较高频率运行快速跟踪电流指令。这样既保证动态响应足够快又不会被估算噪声坑到。位置环如果需要频率更低通常在几百赫兹以内。3.3 中断负载怎么实测先算清楚CPU预算再叠功能前面反复提到中断时间这里给一个可操作的方法。用示波器或者逻辑分析仪量中断负载最直观的方式是GPIO翻转。具体做法在进入FOC中断时把一个GPIO引脚拉高退出中断时拉低然后用示波器量这个引脚的占空比。如果你的中断频率是10kHz周期100微秒示波器上高电平宽度显示70微秒那中断负载就是70%。这是所有方法里最接近真实情况的因为它包含了中断响应时间、代码执行时间、以及可能的嵌套延迟。测完之后给自己留余量。我用过的项目里如果中断负载长期超过80%我基本不会继续往上加功能。因为还有别的中断要跑比如通信、故障保护、速度环分频。而且随着代码优化和编译选项变化执行时间会有波动80%看起来勉强能跑一遇到浮点异常或者缓存命中率下降立刻就溢出了。过了这一关你手里已经有了一个稳定的电流环中断架构和明确的控制频率。这时如果项目要求零速启动或者极低速带载下一步要面对的就是高频注入HFI。4. 高频注入HFI怎么插进FOC零低速的救命稻草4.1 反电动势观测器在零低速为什么失效常规的无感FOC在中高速段很好用核心基于反电动势观测器。滑模观测器、龙伯格观测器本质都是在估算反电动势矢量E ≈ Ke·ω转速越高反电动势越大信噪比越好。但到了零速和极低速反电动势正比于转速直接趋近于零。电流里的有效信号被噪声淹没观测器输出一个随机跳变的角度速度环根本没法稳定。高频注入的思路是既然我没有反电动势可用那我主动往电机里塞一个已知的高频激励然后从电流响应里把转子位置信息解调出来。这个方案依赖的是电机的凸极效应也就是d轴电感和q轴电感不相等。对内置式永磁同步电机IPMSM转子磁钢的布置使得Ld明显小于Lq天然是凸极。对表贴式SPMSMLd和Lq本来相等但大电流下磁路饱和会让两个轴的电感发生差异形成“饱和凸极”。高频注入的发明早期主要针对IPMSM后来通过注入策略的改进也能用在SPMSM上。位置信息就藏在电感差异里。当你往一个非对称的电感结构里施加高频电压时高频电流的幅值和相位会根据转子角度变化。把这个变化解出来就能恢复转子位置。整个过程不依赖于转速所以零速也能工作。4.2 注入频率的选择采样率、控制带宽与滤波器三方博弈HFI的注入频率不是随便选的它同时受到好几个约束这也是很多人调了很久解调不好信号的原因。第一个约束是奈奎斯特采样定理。这个没有商量余地注入频率必须小于采样频率的一半。我们的采样频率就是电流环中断频率也就是PWM频率。比如PWM频率10kHz注入频率理论最大值是5kHz。但这只是数学极限实际上你要给带通滤波器和同步解调留出频率间隔注入频率取采样频率的四分之一到十分之一比较稳妥。也就是10kHz的PWM注入频率选1kHz到2.5kHz区间。第二个约束是电流环控制带宽。电流环PI会让注入频率处的电流指令被放大或者衰减如果注入频率落在电流环带宽内电流环会把它当成真实指令去跟踪产生不必要的转矩脉动。一般电流环带宽在开关频率的十分之一到五分之一也就是1kHz到2kHz。所以注入频率要高于这个带宽。综合第二和第一条你会发现注入频率落在一个窗口里高于电流环带宽低于采样率的四分之一。第三个约束是速度环和机械谐振。注入频率如果跟机械谐振点重合可能激起明显的振动和噪音。这个需要通过实验观察听电机声音、看速度波形必要时微调注入频率避开谐振峰。我实际用过的一组参数PWM频率12kHz电流环带宽约1.2kHz注入频率取1.5kHz。这个频率距离电流环带宽不太远滤波器容易实现电机噪音也在可接受范围。后来又降到1kHz试过解调出来的位置信号更干净但低速重载时动态响应变差最后还是回到1.5kHz。4.3 注入电压幅值与信号解调链路不是发个正弦波就行注入电压幅值怎么定可以反过来推。你先定一个期望的高频电流幅值I_h然后根据高频阻抗估算电压Vh ≈ 2π·f_h·L·I_h这里的L是d轴或者q轴电感具体用哪个取决于注入方式。假设注入频率1.5kHz相电感2mH想要高频电流幅值0.5A电压幅值大约Vh ≈ 2×3.14×1500×0.002×0.5 ≈ 9.4V这个值在24V母线系统里约占调制范围的68%已经不小了。实际上高频电流幅值不需要给到0.5A那么大0.1到0.3A足够。否则高频电流会产生额外损耗、噪音和转矩脉动。解调链路是另一个容易翻车的地方。完整的信号流是这样给定子注入高频电压→电枢电流里出现高频分量→用带通滤波器把高频电流从基波里分离出来→乘以一个同步解调参考信号→低通滤波器滤掉高频载波和2倍频分量→得到位置误差信号→送进PLL锁相环→输出转子角度和速度。带通滤波器的设计很关键。通带中心频率对准注入频率带宽太宽会把基波和开关噪声放进来带宽太窄会引入额外相移。我调试时的经验是先用离线数据看电流频谱确认注入频率点上的信噪比再定滤波器阶数和带宽。不要在没看频谱的情况下盲目调PLL参数。解调之后的位置误差信号大小正比于凸极率也就是(Ld-Lq)/Ld的比值。IPMSM的这个值通常在10%到30%信号强度足够。SPMSM的饱和凸极可能只有百分之几信号弱很多解调更容易失败所以对滤波器和PLL的要求更高。这也解释了为什么同样一套HFI代码换到不同电机上表现差别巨大。5. 把三者拧在一起一套能落地的配置实例5.1 中断、控制频率与注入频率的协同方案前面单独讲了三个东西现在把它们放在一个具体的配置里看。假设一个典型的低压无感FOC项目母线电压24VPMSM额定转速3000rpm4极对相电感2mH相电阻0.5Ω主控芯片是STM32F4系列。我的配置表格大致如下参数取值选择理由PWM频率/电流环频率10kHz电频率最高200Hz噪声可接受开关损耗可控电流环采样方式PWM中点触发ADC采样点纹波最小速度环频率1kHz电流环的1/10机械时间常数匹配HFI注入频率1.25kHz高于电流环带宽约1kHz低于采样率1/4HFI注入电压3V在高频电流约0.2A量级信噪比和损耗平衡速度估算方式低速HFIPLL高速滑模观测器切换点设在5%额定转速附近中断优先级安排我建议这样ADC完成中断最高因为它是电流环的节拍器其次是故障保护类的快速中断速度环分频计算可以放低一点HFI解调如果计算量太大不要全部塞进电流环中断而是分解到数个周期里逐步完成。注入频率1.25kHz这里有个细节它和10kHz的采样率正好是8倍关系。这意味着每个注入周期有8个采样点带通滤波器和解调算法都能比较从容地工作。如果注入频率取1kHz就是10倍关系更保险但离电流环带宽太近了。1.25kHz是我在这组参数下的折中结果。5.2 低速HFI与高速观测器怎么切换无感FOC项目里HFI和反电动势观测器通常不是同时用到底的。低速用HFI因为反电动势太弱中高速用观测器因为反电动势强、信噪比好而且HFI在中高速会带来额外的损耗和噪音。两个算法之间需要平滑过渡。最简单的做法是设置一个切换速度点。比如额定转速的5%低于这个值用HFI高于这个值用反电动势观测器。直接切换的问题是切换瞬间两个观测器输出的角度可能有偏差速度也会跳电流环一颤电机就可能失步。更稳的做法是加权过渡。在切换点附近的一段速度区间内比如额定转速的4%到6%两个观测器同时运行最终角度按速度权重混合。这个方案对CPU要求更高因为两个观测器要同时跑中断负载会明显上升。所以你先要确认第一节里说的CPU预算还有没有余量。我做过一个项目切换点设在120rpm附近过渡区间20rpm。HFI给低速段位置反电动势观测器给高速段位置权重从0线性变到1。实测下来切换过程电机转速波动大约10rpm带载也能稳定过渡。如果直接硬切同样工况下转速波动能达到60rpm以上。切换之前必须做一件事确认两个观测器的角度定义一致。有些代码里HFI算出来的是转子N极角度反电动势观测器算出来的也是转子电角度但一个带符号补偿一个不带直接混合就乱套了。我在第一次联调时就是在没有对齐角度定义的情况下做加权结果过渡区电机抽搐排查了很久才发现两边差了电角度30度。6. 常见问题与排查技巧实录6.1 中断溢出导致的波形毛刺与失步症状很典型电机运行一段时间后电流波形上偶尔出现一个毛刺然后速度开始波动紧接着失步。这时候先别怀疑观测器量一下中断负载。我用GPIO翻转的方法实测过一个案例。原始工程电流环中断耗时约55微秒10kHz周期下负载55%。后来为了支持零速启动我在中断里加了HFI解调没做分解直接一个周期算完中断耗时飙到95微秒负载95%。结果就是电机静态能稳住一加载就偶尔窜动最后hardfault。解决方法有三个层面。第一层把HFI解调拆开每个中断周期只做一部分计算把峰值耗时降回70微秒以内。第二层降低注入频率从1.5kHz降到1kHz滤波器阶数降一阶计算量有明显下降。第三层换主频更高的芯片这是最后的选择。这里多说一句中断溢出不一定会立刻触发hardfault。大多数时候是中断嵌套把栈吃掉或者数据还没来得及写入寄存器就被下一次采样覆盖表现为随机性的波形异常。所以排查时优先看时序再看数据。6.2 HFI解调结果跳动滤波与PLL参数错配HFI解调出来的位置信号在示波器上看正常情况是一条平滑的直线波动在几度以内。如果你看到的是大范围跳变或者干脆是乱转的角度大概率是解调链路里某个环节的信噪比不足。我调试时的顺序是固定的。第一步不看PLL直接看带通滤波后的高频电流波形确认它的幅值是否稳定、有没有被基波污染。第二步看同步解调后的误差信号确认它是否经过零附近、周期是否为电角度的两倍。第三步才去调PLL的带宽和PI参数。PLL带宽太低位置环响应慢电机低速时会感觉“肉”带宽太高解调噪声被放大位置抖动明显。一般从几十赫兹开始调逐步往上加直到位置波动刚好在可接受范围。我手上这个项目最终PLL带宽约50Hz位置波动小于3度。还要提防一个隐蔽问题低通滤波器把2倍注入频率的纹波滤干净了没。如果没滤干净解调出来的误差信号上会叠着一个明显的二倍频纹波PLL输出角度也会跟着抖动。检查方法很简单把PLL关掉直接看误差信号频谱如果有明显的注入频率二倍分量说明低通带宽还得降。6.3 常见问题速查表现象可能原因处理建议电机能转但电流波形在固定角度炸刺采样时刻和PWM边沿没对齐检查ADC触发相位用中点采样Id/Iq指令不为零但实际电流跟不上电压指令超过Udc/√3限幅检查电压限幅加大母线电压或降低指令低速带载时失步反电动势观测器在零低速失效切换到HFI方案HFI角度乱跳注入频率低于电流环带宽或被PI跟踪提高注入频率或降低电流环带宽切换点附近转速波动大两个观测器角度定义不一致对齐角度符号和偏置后再加权过渡中断频繁溢出中断负载过高用GPIO翻转实测分解计算或降频电机高频噪音明显注入频率落在机械谐振点微调注入频率避开谐振峰以上表格里的每一条我都踩过或者帮别人排查过。看上去是各种独立的问题根子上都是中断频率、控制频率、注入频率这三者之间的匹配出现了偏差。调FOC和调其他控制系统的区别在于这里每个参数都有物理意义你不能孤立地调某一个必须从整个时序链路去审视。先让电流环在中断里稳定运行再考虑速度环最后再上HFI是我这几年调无感FOC下来最坚持的顺序。跳过任何一步后面都会以更隐蔽的方式还回来。