
做 PMSM 无感 FOC 调试的人多半都经历过这么一段电机能转电流闭环也稳但一看到 Ud/Uq 的波形就开始犯嘀咕——这两个数到底怎么解释为什么有些工程把控制频率提上去之后电机更安静了有些工程一加高频注入HFI反而开始发烫等做到零低速带载启动更是被“注入频率选多大”卡得死死的。这篇文章我打算把 FOC 中断、Ud/Uq、控制频率和 HFI 注入频率这四件事一次讲透。它们不是彼此孤立的参数而是一条链路中断决定了控制频率控制频率决定了电流环带宽而 HFI 注入频率必须在这个带宽和采样能力之间找位置。适合正在做无感 FOC 低速域、或者例程能跑但想真正掌握参数调优的朋友。1. 先把 FOC 的中断链路捋清楚1.1 为什么 FOC 控制离不开中断FOC 算法本质上是离散的“采样-计算-输出”循环。每个控制周期控制器都要完成电流采样、坐标变换、PI 运算、SVPWM 占空比更新这一整套动作。这套动作必须在严格固定的时间节点上完成而这个节点就是 PWM 定时器中断。很多新手会问我不用中断主动写个 while 循环跑 FOC 不行吗当然能转但有两个致命问题一是采样时刻无法与 PWM 载波对齐。FOC 电流采样最好在 PWM 中心点或谷底进行这个时刻相电流等于母线电流的瞬时均值谐波最小。如果采样时刻漂移采到的电流携带大量开关纹波电流环带宽和稳定性都会大打折扣。二是执行周期不固定。中断 A 还没算完下一次采样就该发生了控制周期抖动会让电流环闭环特性变得不可预测尤其在高频注入时注入信号的相位都会乱掉。所以工程上普遍的做法是用高级定时器产生 PWM同时由定时器事件触发 ADC 注入采样ADC 转换完成后再触发中断中断里执行完整的 FOC 运算。整个过程以 PWM 周期为节拍一个 PWM 周期就是一次控制节拍。1.2 一个典型中断周期里到底干了什么以 STM32 平台的经典配置为例TIM1 工作在中心对齐模式输出 6 路互补 PWM。计数器计到 0 或计到 ARR 时硬件自动触发 ADC 采样 ABC 三相电流。采样转换完成后进入中断中断服务函数按顺序执行这些事// TIM1 更新/DMA 中断入口 // 1. 读取 ADC 转换结果得到 Iu、Iv、Iw // 2. Clarke 变换Iα (2Iu - Iv - Iw)/3, Iβ (Iv - Iw)/√3 // 3. Park 变换Id Iαcosθe Iβsinθe, Iq -Iαsinθe Iβcosθe // 4. 电流环 PI 运算输出 Ud_ref、Uq_ref // 5. 如果处于 HFI 模式在 Ud_ref 上叠加高频注入电压 // 6. 反 ParkUα Ud_ref*cosθe - Uq_ref*sinθe, Uβ Ud_ref*sinθe Uq_ref*cosθe // 7. SVPWM 扇区判断、占空比计算写入影子寄存器这个顺序是经过多年验证的标准流水线。重点在于第 7 步占空比不是直接写入比较寄存器本身而是写入影子寄存器等下一个 PWM 周期开始时硬件同步加载。这样就能保证整个 PWM 周期内输出的电压矢量完全一致不会出现“算到一半突然改占空比”导致的波形毛刺。中断里还有一个细节转子位置 θe 必须用当前时刻的电角度。如果由编码器提供位置直接读取计数器即可如果是无感控制θe 来自观测器或高频注入的锁相环在每个控制周期更新。更新时刻与控制周期严格同步这是后面讨论控制频率的基础。1.3 控制频率与 PWM 频率是不是一回事在大多数 FOC 工程里控制频率等于 PWM 频率。比如 PWM 20kHz那么控制周期就是 50μs电流环每 50μs 更新一次。这对绝大多数电机控制场景都够用。判断控制频率是否够用可以算这么一笔账设电机极对数为 p最高转速为 n max则最高电气频率 f_e n_max × p / 60。每个电周期至少要有 20~50 个控制点否则 Park/反 Park 在电角度大步跳跃时会出现明显的离散化误差。比如一个 4 对极电机最高 8000rpmf_e533Hz20kHz 控制频率下每电周期约 37 个控制点没问题。但如果转速提到 12000rpmf_e800Hz控制点降到 25 个动态响应已经开始吃紧。这时候你就得考虑把 PWM 频率提到 30kHz 甚至更高或者接受动态性能损失。低频 PWM比如 5kHz不是说不能跑 FOC只是电流环带宽上不去。电流环带宽理论上不可能超过控制频率的 1/2工程上为了稳定一般取到控制频率的 1/10~1/15。20kHz 控制频率能做 1.5~2kHz 电流环带宽但 5kHz 控制频率能做出 300~500Hz 带宽就算不错了。这个带宽会直接影响电机的动态响应和抗负载扰动能力。所以“控制频率”不是拍脑袋定的它是整个系统响应能力的第一块天花板。2. Ud/Uq 到底是什么控制频率如何牵制它2.1 Ud/Uq 不是随便调出来的两个数打开调试器看 Ud、Uq很多人会以为这是电机两相绕组的电压其实不是。Ud 和 Uq 是经过 Park 变换后d 轴励磁轴和 q 轴转矩轴上的电压指令值。在电流环闭环时Ud、Uq 是电流 PI 控制器的输出。比如 d 轴电流给定为 0实际 Id 出现偏差PI 就会产生一个 Ud 来纠正它。稳态时如果电机运行在某个固定转速Uq 主要用来平衡反电动势Ud 则很小除非做弱磁需要 Ud 去抵消直轴磁链。打个比方FOC 里你会做两个 PI 环一个管励磁电流 Id一个管转矩电流 Iq输出电压指令 Ud、Uq。这个抽象和直流电机完全不同它的优点是让交流电机在数学上被“解耦”成两个独立的直流环节。调的时候你不需要关心当前转子角度下哪个绕组该吃多少电压你只需要确保 Id、Iq 跟随给定即可。调试中有一个非常实用的规律电机空载运行时Uq 的幅值大约等于反电动势 阻抗压降而 Ud 应该在零附近波动。如果电机运行中 Ud 的绝对值很大说明 Id 不为零——要么是给定没设好要么是转子位置观测有偏差把一部分电压“串”到了 d 轴。所以 Ud 偏大不是单纯的参数问题它往往是指向位置观测误差的一个重要线索。2.2 控制频率如何影响 Ud/Uq 的更新节奏你可能会问PI 输出 Ud/Uq 与控制频率有什么关系关系大了。FOC 的每个控制周期都要采样电流、计算角度、更新电压指令。控制频率越高角度更新越密电压指令“看到”的转子位置越接近真实。在我们前面提到的 8000rpm、4 对极电机例子里20kHz 控制频率下每个电周期 37 步角度步进约 9.7°如果控制频率降到 10kHz步进约 19.4°反 Park 出来的电压矢量方向误差就明显了动态过程中可能带来额外的电流脉动和噪声。还有一层容易被忽略的约束PI 输出需要限幅。Ud、Uq 最终要通过反 Park 变换合成空间电压矢量而 SVPWM 可输出的最大相电压幅值受母线电压限制。如果电流环给定太大PI 积分累积到饱和Ud、Uq 就会被“削顶”。这种电压饱和在从高速到低速、或者负载突加时经常出现表现形式是电流超调、抖动。调试时遇到波形畸变先盯一下 Uq 是否长时间顶在限幅值上。2.3 电压饱和与注入信号的冲突进入 HFI 场景之后Ud/Uq 多了一层任务不仅要输出基波电流环指令还要叠加高频注入信号。常用的做法是在 Ud_ref或 Uα/Uβ上叠加正弦电压u_d_inj Um cos(ω_h t)。叠加之后如果原来 Ud_ref 已经接近电压限幅注入信号会被截断产生大量谐波。所以设计 HFI 参数时必须把注入幅值 Um 和电流环最大输出电压预留空间同时考虑。我习惯的做法是把电压限幅的裕量留出至少 1.5 倍的注入幅值。假设母线电压折算后最大相电压幅值为 13V注入幅值 Um 取 1.5V那么电流环本身的输出限幅就应该控制在 10.5V 以内。这个余量不预留高频注入的谐波会让你在电流检测里看到一片“毛刺”而且无论你怎么调解调参数都压不掉。3. HFI 高频注入频率选择逻辑与计算流程3.1 高频注入的基本原理与信号路径高频注入法HFI是零低速无感 FOC 的主流方案。原理并不复杂在转子轴上叠加一个高频电压激励由于转子凸极性Ld ≠ Lq的存在高频电流响应中会携带转子位置信息。通过特定的信号处理路径可以解算出转子位置误差交给锁相环或观测器收敛到真实位置。信号路径是电压注入 → 电流响应 → 带通滤波BPF → 解调 → 低通滤波LPF → 位置误差信号 → 观测器/锁相环。这里值得展开的是表贴式电机SPM的 Ld 和 Lq 基本相等按教科书理解是“没有凸极性无法用高频注入”。但实际上表贴电机在负载增大时磁路饱和会让 d 轴电感发生变化产生“饱和凸极”这使得 HFI 在车用表贴电机上依然广泛可用。代价是位置误差信号较小对注入幅值和信号提取的要求更高。你如果做的是内置式电机IPM凸极率通常有 1.1~1.3HFI 明显更友好。高频注入的另一个分类是脉振高频注入在 d 轴叠加正选电压和旋转高频注入在 αβ 轴叠加旋转电压。d 轴脉振注入在 PMSM 无感低速域更常见因为它实现简单、所需计算量小而且和支持弱磁的电压分配不冲突。本文讨论的 HFI 默认指 d 轴脉振注入。3.2 注入频率的约束条件与设计公式选 HFI 注入频率时有一个三角约束需要同时满足注入频率要有足够的采样密度要远低于电流环带宽否则会被电流环当成基波指令强行跟随又不能低到让位置观测带宽受限。工程上我通常用这四条规则第一采样密度约束每个高频注入周期内至少要 6~10 个采样点。如果控制频率也就是采样/计算频率是 f_ctrl那么注入频率 f_hfi 应满足 f_ctrl / f_hfi ≥ 6。也就是说 f_hfi ≤ f_ctrl / 6。采样点太少数字化解调的波形会严重失真带通滤波器也不容易实现。第二电流环带宽约束注入频率应当高于电流环带宽的 2~3 倍以上。电流环带宽 f_bw 大约是控制频率的 1/10~1/15也就是 f_hfi ≈ (0.2~0.3) f_ctrl。结合第一条f_hfi 的实际取值范围会被压缩到 f_ctrl / 10 ~ f_ctrl / 6 附近。第三位置带宽约束HFI 位置观测环路的带宽大约在 f_hfi 的 1/10 以内。比如注入 1kHz位置观测环路能跟上 100Hz 以内的位置变化这对零低速场景是够用的。如果你要求启动加速很快、动态响应很猛注入频率就要往上限选f_hfi f_ctrl / 6 ~ f_ctrl / 8。第四采样定理的基础约束采样率至少是注入频率的 2 倍以上。这条在前面已经隐含满足毕竟 f_ctrl / f_hfi ≥ 6 远大于 2。但实际工程中还要考虑 PWM 开关噪声如果注入频率刚好落在 PWM 谐波边带上带通滤波器压力巨大所以选数时尽量避开 f_pwm 的明显谐波点。把这些约束合并成一个能让参数一锤定音的公式f_hfi f_ctrl / NN 取 6~12当控制频率 f_ctrl 20kHz 时注入频率可选 1.67kHz~2kHz。如果控制频率 f_ctrl 10kHz注入频率就要降到 830Hz~1kHz。注意一个误区不是 PWM 频率越高HFI 注入频率就可以随便放宽。注入频率高低同时受位置观测带宽需求决定而位置观测带宽只有几十到两百赫兹。所以即便 PWM 提到 50kHz大多数人依然会把注入频率压在 1.5~3kHz 范围内而不是一味往上抬。3.3 一套可以直接套用的参数组合根据我的经验不同 PWM/控制频率下推荐如下配置控制频率 f_ctrl注入频率 f_hfi注入幅值 Um位置观测带宽10kHz833Hz ~ 1kHz5%~10% Udc50~100Hz20kHz1.67kHz ~ 2kHz5%~12% Udc100~200Hz30kHz2.5kHz ~ 3kHz7%~15% Udc150~300Hz注入幅值用母线电压百分比表示。比如 Udc24V、控制频率 20kHz 的小电机Um 常取 2~3V也就是 8%~12% Udc。Um 太小时位置误差信号不明显信噪比差太大则电机有明显的“滋滋”声发热也会上升。建议从偏大的幅值12%开始确认位置收敛波形再逐步下调到噪音与性能的平衡点。还有一个细节注入频率和电流环带宽的关系决定了你是否需要在电流环里做陷波器。如果注入频率接近电流环带宽电流环会对注入电压产生明显的闭环跟随等效注入阻抗变小响应电流就不好测了。这时候要么把注入频率往f_ctrl/8以上提要么在电流环 PI 输出到叠加点之间加一个中心频率为 f_hfi 的陷波器把注入频率附近的增益压下去。多数 MCU 上跑 20kHz 控制周期直接在电流环里加陷波器会占掉不少 MIPS所以我更推荐一开始就把频率拉开不要等失控了再补陷波。4. 中断、控制频率、注入频率三者的协同实施4.1 代码层面怎么布置中断与注入信号高频注入的代码并不复杂但放置位置很讲究。按我常用的架构注入电压生成放在电流环 PI 之后、反 Park 之前核心就是一个正弦表累加器// HFI 注入模块每个控制周期调用 hfi_inj_d HFI_AMPLITUDE * hfi_sin_table[hfi_index]; hfi_index HFI_STEP; // 对应 N f_ctrl/f_hfi // 电流环输出叠加 ud_ref ud_pi_out hfi_inj_d; uq_ref uq_pi_out;HFI_STEP 怎么算如果正弦表长度是 1024注入频率 f_hfi 2kHz控制频率 20kHz每个控制周期应前进 1024 × (2000/20000) 102.4四舍五入取 102 或 103 即可。注意这里也可以直接用浮点累加再查表但在中断里我建议用整数累加并控制好取模避免 64 位除法拖慢执行时间。初始化提醒正弦表要在启动前生成不要让中断里调用 sin() 函数否则一次三角函数调用可能吃掉 10~20μs在 50μs 控制周期里极为致命。中断代码里尽量只做加法和乘法查表、定点化都是必备手段。4.2 调试时先看哪几个量HFI 一开你面对的调试量会突然变多。我建议按优先级看四个东西第一是 d 轴注入电流响应。用示波器钳电流探头或者在代码里直接把 Id 通过 DAC 输出。如果注入频率选得合适Id 上应该能看到清晰的高频正弦分量幅度在几百毫安到一两安。完全没有高频分量说明电压被电流环“吃掉”了或者采样时刻对不上。第二是位置误差信号。解调之后的误差信号经过 LPF 后应该接近零并且随转子转动呈现正弦变化。如果误差信号乱跳先检查解调用的正弦/余弦相位是否正确再看注入信号是否和采样信号对齐。第三是估计角度与真实角度的偏差。前期用编码器做对拖测试最方便编码器给真实角度HFI 观测器给估计角度两者作差。正常情况下偏差应该被锁相环拉在 ±5° 电角度以内。偏差过大或振荡优先调位置观测器的 P 增益。第四才是 Ud、Uq 波形。此时已能看出问题类型Uq 饱和说明电流环输出能力不够Ud 偏大说明位置偏差、电流给定或弱磁策略有问题。4.3 从启动到全速的参数切换完整的无感 FOC 启动流程通常分三阶段预定位/初始位置检测 → HFI 闭环零低速 → 切换中高速观测器滑模或磁链。初始位置检测有两种主流做法一种是给一个固定方向的电压矢量强制磁极定位优点是简单缺点是会造成 180° 反向风险启动时可能倒转半个电周期另一种就是用 HFI 直接测初始位置不产生强制对轴启动更平滑。如果你做的是泵类或风机类负载预定位带来的轻微反转无所谓选前者省事。但如果是压缩机或者要求严格单向启动的场合初始位置检测必须用 HFI。切换逻辑是另一个容易翻车的地方。HFI 观测器在中高速下容易被反电动势淹没所以通常在中速比如额定转速的 10%~20%切到滑模观测器或磁链自适应观测器。切换时速度要做到滞环控制并同时输出两个观测器的估计角度按速度权重过渡避免直接硬切导致角度突变电流震一下大坑就出来了。5. 实战中的常见问题与排查记录5.1 注入频率选得再对电流噪声还是大先检查是不是采样点不足。控制频率 10kHz、注入频率选 2kHz一个注入周期只有 5 个采样点这已是混叠边缘基本没法用。把注入频率降到 1kHz 以下再看。如果采样点充足噪声仍然大查一下注入频率是否落在 PWM 开关频率的小数倍谐波附近。比如 PWM 20kHz注入 4kHz 恰好是 5 次谐波带通滤波器很难干净分离。避开 1/5、2/5、3/5 这些靠近 PWM 谐波的频率点选 1.67kHz 或 2.5kHz 这类“非整倍数”频率往往更干净。5.2 电机不发烫但嗡嗡声异常高频注入的音频噪声来自注入频率本身。如果人耳听到尖锐的哨音那就对应 2~5kHz 的注入频率。车用项目对噪音极度敏感通常会把注入频率压低到人耳不敏感或正好被结构件过滤的频段。1kHz 以下更安静但位置带宽会下降。折中方案是把注入幅值减到能接受的最低值或改用随机频率注入把噪音频谱打散。5.3 零速启动时位置收敛慢或反转位置收敛慢优先查解调信号的 LPF 带宽。LPF 截止频率太低位置环路只能慢吞吞爬行LPF 太高噪声和载波泄漏混进来收敛点抖动。LPF 截止频率经验值通常在 f_hfi / 10 到 f_hfi / 20 之间。反转和“初始位置差 180°”问题多出在磁极极性辨识上。脉振高频注入得到的凸极位置存在 180° 极性模糊需要额外的磁极判断策略施加 d 轴电压脉冲观察电流响应方向。如果没做极性辨识启动时 50% 概率反向。我之前遇到过一次看似“随机反转”的故障查到最后就是磁极判别代码在电机负载变化后误判重新校准后解决。5.4 中断溢出和 HardFault 的常见坑高频注入会增加不少计算量带通滤波器、解调乘法、低通滤波器再加上位置观测器中断任务一下重不少。20kHz 控制频率下中断总时长必须控制在 20~30μs 以内否则留不住余量。踩过几个坑给你避雷不要在中断里跑浮点除法尤其整型 MCU软件浮点库一个除法几十个周期就没了。尽量用定点数或查表。滤波器实现优先用 IIR 二阶节级联比 FIR 省计算量。中断函数的调用层级不要过深避免栈溢出导致的 HardFault尤其注意在中断里调用带重入问题的库函数。确保 ADC 完成标志和中断优先级正确配置不要让低优先级任务把 FOC 控制节拍拖乱。5.5 常见问题速查表现象可能原因检查顺序高频电流响应异常注入频率靠近 PWM 谐波换非整倍频率位置收敛慢LPF 带宽太低 / 注入幅值太小调 LPF、调 Um启动反转磁极极性辨识错误加压观察 Id 响应方向电机发烫注入幅值过大 / 频率过高降幅值、降频率电流环啸叫注入频率落在电流环带宽附近提注入频率或加陷波HardFault中断耗时过长 / 栈溢出精简中断、查栈空间高速段失控切换速度过晚或切换逻辑太猛提前切换、加角度过渡说点我自己的体会。高频注入这套东西看着是数学模型实际上每一步都和时序强相关。有一次我把注入频率从 1kHz 调到 1.25kHz只因想看位置带宽能否提高结果电流波形一下变得毛糙。查了半天才发现 1.25kHz 和 PWM 的 5 次谐波 4kHz 有调制混叠把解调信号污染了。从那以后我调 HFI 频率一定先用频谱工具看注入点和谐波边带的位置再上板实测。另外还要提醒一句HFI 只是低速工具不是包治百病。到了中高速反电动势足够强老老实实用滑模或磁链观测器。只要你能把控制频率的底气打足、把注入频率的落点选准、把 Ud/Uq 的物理含义放在脑子里而不是当调试器里的“两个玄学数字”无感 FOC 的零低速难题就已经解决了一大半。