
1. 为什么低速下反电动势观测器会失效搞过PMSM无感FOC的人都有一个共识中高速区间用滑膜观测器或者龙伯格观测器基本能跑得不错但一旦转速掉到额定转速的5%以下甚至接近零速那些依赖反电动势的观测器就集体罢工了。这不是算法写得不好而是物理层面的硬伤。1.1 反电动势与转速的线性关系决定了观测下限PMSM的相反电动势公式是 E Ke × ω其中 Ke 是反电动势常数ω 是电角速度。假设一台电机的额定转速是3000rpm额定反电动势幅值是311V那么在30rpm的时候反电动势只有3.11V。而逆变器的死区效应、管压降、电流采样噪声叠加起来轻松就能淹没这个量级的信号。你让观测器从信噪比不到1的信号里提取转子位置这本身就是强人所难。我实测过一台750W的伺服电机在50rpm时用滑膜观测器位置误差已经飘到±30°电角度以上电机开始出现明显的转矩脉动和电流畸变。到了20rpm观测器直接发散电机堵转。这不是调参能解决的问题是反电动势信噪比的物理下限。1.2 高频注入为什么能绕开这个限制高频注入的思路很巧妙既然反电动势在低速时不可靠那我就不靠反电动势了。我往电机里注入一个高频电压信号利用电机的凸极效应Ld ≠ Lq来提取转子位置。这个位置信息藏在电流响应的高频分量里跟转速无关所以低速甚至零速都能工作。打个比方反电动势观测器像是听一个人在远处说话距离越远越听不清高频注入则像是你主动去敲一面墙然后听回声来判断墙后面的结构——你不依赖对方发声你自己制造激励。但高频注入也有代价注入信号会带来额外的电流谐波、转矩脉动和噪声。怎么在保证位置估计精度的同时把副作用压到最低就是算法设计的核心矛盾。1.3 方波注入与正弦波注入的路线之争高频注入按注入波形分主流有两条路线方波注入和正弦波注入。方波注入的优势是实现简单对ADC采样时序要求相对宽松在低电感电机上表现也不错。但方波的谐波频谱很宽会激发更多的高频噪声而且方波注入的电流响应中包含大量低次谐波滤波设计比较麻烦。正弦波注入的优势是频谱干净注入信号只在一个特定频率上有能量滤波器设计可以非常有针对性。缺点是正弦波注入通常需要更复杂的解调过程而且对注入频率和幅值的选取更敏感。我个人的经验是如果MCU算力够、对噪声要求高比如家电、医疗设备优先选正弦波注入如果算力紧张、成本敏感比如风机、水泵方波注入更务实。这篇主要聊正弦波注入的d轴方案后面会详细推导。2. d轴正弦波高频注入的数学本质很多人看高频注入的公式推导时容易晕因为里面涉及坐标变换、滤波器、锁相环一大堆东西。但如果抓住核心——凸极效应导致d轴和q轴的高频阻抗不同——后面的推导就是水到渠成。2.1 从PMSM高频模型说起在静止坐标系下PMSM的电压方程考虑高频注入时可以忽略反电动势和电阻压降因为注入频率通常在1kHz以上ωL远大于R。简化后的高频电压方程在dq旋转坐标系下是这样的[udh] [Ld 0 ] [didh/dt] [ ] [ ] [ ] [uqh] [0 Lq] [diqh/dt]其中 udh、uqh 是注入的高频电压idh、iqh 是高频电流响应Ld、Lq 是dq轴电感。这个模型说明一个关键事实如果在d轴注入高频电压电流响应主要在d轴如果在q轴注入响应主要在q轴。但这是建立在转子位置估计准确的前提下。如果估计位置有偏差注入信号就会“泄漏”到另一个轴上而这个泄漏量正好包含了位置误差信息。2.2 d轴注入时电流响应的完整推导假设我们在估计的d轴记为d̂轴注入一个高频正弦电压udh Vh × cos(ωh × t) uqh 0其中 Vh 是注入幅值ωh 是注入角频率。实际转子位置是 θ估计位置是 θ̂位置误差 Δθ θ - θ̂。通过坐标变换把估计dq轴的电压变换到实际dq轴[ud] [cos(Δθ) sin(Δθ)] [udh] [ ] [ ] [ ] [uq] [-sin(Δθ) cos(Δθ)] [ 0 ]得到实际dq轴电压ud Vh × cos(ωh × t) × cos(Δθ) uq -Vh × cos(ωh × t) × sin(Δθ)然后根据高频模型求电流idh ∫ (ud / Ld) dt (Vh × cos(Δθ) / (Ld × ωh)) × sin(ωh × t) iqh ∫ (uq / Lq) dt -(Vh × sin(Δθ) / (Lq × ωh)) × sin(ωh × t)再把实际dq轴电流变换回估计dq轴[idh_hat] [cos(Δθ) -sin(Δθ)] [idh] [iqh_hat] [ ] [ ] [sin(Δθ) cos(Δθ)] [iqh]展开后得到估计q轴的高频电流响应iqh_hat Vh × sin(ωh × t) × sin(Δθ) × cos(Δθ) × (1/(Ld × ωh) - 1/(Lq × ωh))整理一下iqh_hat (Vh × sin(2Δθ) / (2 × ωh)) × (1/Ld - 1/Lq) × sin(ωh × t)这个公式是整个算法的核心。它告诉我们估计q轴的高频电流幅值正比于 sin(2Δθ)。当 Δθ 0 时iqh_hat 0当 Δθ 很小时sin(2Δθ) ≈ 2Δθ电流幅值与位置误差近似线性。2.3 为什么选d轴注入而不是q轴从上面的推导可以看到d轴注入时位置误差信息出现在q轴电流里。那为什么不直接在q轴注入从d轴电流提取误差原因有两个。第一q轴注入会产生直接的转矩脉动因为q轴电流对应转矩分量注入高频信号会让电机产生高频抖动。d轴注入主要影响励磁分量转矩脉动小得多。第二很多PMSM的凸极率Lq/Ld在1.2到2.0之间d轴电感通常小于q轴电感意味着d轴注入时电流响应幅值更大信噪比更好。我实测过同一台电机d轴注入和q轴注入的位置估计精度差不多但q轴注入时电机噪声明显大一个档次尤其是在低速轻载时能听到刺耳的高频啸叫。所以工程上几乎清一色选d轴注入。2.4 凸极率对注入效果的影响从公式 iqh_hat 的幅值项 (1/Ld - 1/Lq) 可以看出凸极率越大同样注入电压下的电流响应越大位置估计越容易。表贴式PMSMSPM的Ld ≈ Lq凸极率接近1高频注入几乎无效。这也是为什么高频注入主要用在内置式PMSMIPM上。但实际电机即使标称SPM由于饱和效应和制造偏差也会有微小的凸极。我见过凸极率只有1.05的电机用高频注入也能跑但需要把注入电压幅值加大、注入频率选得更精细而且位置估计的带宽很低动态响应很慢。凸极率 Lq/Ld注入效果适用场景 1.05极差信噪比不足不建议用HFI1.05 ~ 1.2勉强可用需优化滤波低速轻载1.2 ~ 1.5良好工程常用通用伺服 1.5优秀估计精度高高精度场合3. 信号解调与位置误差提取的工程实现推导出 iqh_hat 的公式只是第一步真正在MCU上跑起来还需要解决一系列工程问题怎么从高频电流里把位置误差解调出来滤波器怎么设计锁相环参数怎么整定3.1 同步解调的基本原理iqh_hat 的表达式是iqh_hat A × sin(2Δθ) × sin(ωh × t)其中 A Vh × (1/Ld - 1/Lq) / (2 × ωh)。这是一个被 sin(ωh × t) 调制过的信号包络是 A × sin(2Δθ)。要提取包络最直接的方法是用一个同频的正弦参考信号去乘iqh_hat × sin(ωh × t) A × sin(2Δθ) × sin²(ωh × t) A × sin(2Δθ) × (1 - cos(2ωh × t)) / 2这个结果包含两部分直流分量 A × sin(2Δθ) / 2 和两倍频分量 A × sin(2Δθ) × cos(2ωh × t) / 2。用一个低通滤波器把两倍频滤掉剩下的直流分量就正比于 sin(2Δθ)。这就是同步解调也叫相干解调的核心思路。关键在于参考信号的相位必须和注入信号严格同步否则解调出来的直流分量会衰减甚至变号。3.2 低通滤波器的设计取舍低通滤波器的截止频率决定了位置估计的带宽和噪声抑制能力。截止频率越低噪声抑制越好但位置估计的动态响应越慢截止频率越高动态响应快但噪声容易让锁相环抖动。我的经验值是截止频率取注入频率的1/10到1/20。比如注入频率是2kHz低通截止频率取100Hz到200Hz。这样既能有效滤掉两倍频4kHz分量又能保证位置估计的带宽在几十赫兹量级对于低速运行足够了。滤波器的阶数也有讲究。一阶滤波器计算量小但衰减斜率只有-20dB/dec对两倍频的抑制不够干净。二阶滤波器衰减斜率-40dB/dec效果明显好很多计算量也在MCU可承受范围内。我一般用二阶巴特沃斯滤波器通带平坦相位延迟可控。注意滤波器的相位延迟会直接影响位置估计的实时性。如果你的应用对动态响应要求高可以考虑用带通滤波器替代低通只提取注入频率附近的信号这样相位延迟更小。3.3 锁相环的参数整定解调出来的直流分量是 A × sin(2Δθ) / 2当 Δθ 很小时近似为 A × Δθ。这个量直接反映了位置误差但不能直接拿来修正角度因为噪声和扰动会导致角度抖动。所以需要一个锁相环PLL来平滑地跟踪位置误差。锁相环的基本结构是误差信号经过一个PI调节器输出估计转速再积分得到估计角度。PI参数决定了锁相环的带宽和阻尼。整定PI参数时我通常先把积分增益设为0只调比例增益让锁相环有足够的带宽跟踪位置变化但又不至于振荡。然后慢慢加积分增益消除稳态误差。目标是在位置阶跃响应中超调量不超过10%调节时间在几十毫秒量级。有个容易踩的坑锁相环的带宽不能超过低通滤波器的截止频率否则会引入额外的相位滞后导致系统不稳定。我一般把锁相环带宽设为低通截止频率的1/3到1/2。3.4 从误差到角度的完整信号流把整个信号处理链路串起来在估计d轴注入 Vh × cos(ωh × t)采样三相电流Clarke/Park变换到估计dq轴提取估计q轴电流中的高频分量 iqh_hat用 sin(ωh × t) 同步解调低通滤波得到位置误差信号锁相环跟踪误差输出估计角度和转速这个链路里第3步的高频分量提取也很关键。如果直接用采样电流里面既有基波分量又有高频分量需要先用一个高通滤波器把基波滤掉。高通滤波器的截止频率一般取注入频率的1/3到1/2既能滤掉基波又不会过度衰减注入频率的信号。4. 注入参数选取与典型问题排查算法原理清楚了但实际调试时注入频率、注入幅值、滤波器参数这些怎么选才是决定成败的关键。这部分我结合自己踩过的坑把经验值分享出来。4.1 注入频率与开关频率的关系注入频率不能随便选它和PWM开关频率有硬约束。根据香农采样定理注入频率必须低于开关频率的一半。但实际工程中为了留出足够的采样和计算余量注入频率一般取开关频率的1/10到1/5。比如开关频率是10kHz注入频率取1kHz到2kHz比较合适。如果注入频率太高每个注入周期内的采样点数太少解调精度会下降如果注入频率太低会落入电流环的带宽内被电流调节器抑制掉而且会产生可听噪声。我试过在10kHz开关频率下注入500Hz结果电流环把注入信号吃掉了一大半位置估计信噪比很差。后来改成1.5kHz效果立刻好转。所以注入频率一定要高于电流环带宽一般至少是电流环带宽的5倍以上。开关频率电流环带宽推荐注入频率备注8kHz500Hz1.0 ~ 1.6kHz算力紧张时选低值10kHz800Hz1.5 ~ 2.0kHz最常用配置16kHz1.2kHz2.0 ~ 3.2kHz高性能伺服20kHz1.5kHz2.5 ~ 4.0kHz需考虑MCU算力4.2 注入幅值的折中信噪比 vs 噪声与损耗注入幅值越大电流响应越强位置估计信噪比越好。但注入幅值太大会带来几个问题额外的铜损和铁损、可听噪声、转矩脉动甚至可能触发过流保护。我的经验是注入电压幅值取额定电压的5%到15%。具体取值要看电机的凸极率和负载情况。凸极率小的电机需要更大的注入幅值轻载时可以用小一些的幅值来降低噪声。有个实用的调试方法从额定电压的5%开始逐步加大注入幅值同时观察位置估计的波动。当位置波动降到可接受范围时就停止加大。没必要追求极致精度而牺牲效率和噪声。另外注入幅值可以随转速自适应调整。低速时用大幅值保证信噪比转速升高后逐步减小注入幅值直到反电动势足够强时完全关闭高频注入平滑切换到反电动势观测器。这个过渡过程需要仔细设计否则切换瞬间容易失步。4.3 位置估计极性辨识一个容易被忽略的坑高频注入有一个固有缺陷它只能估计出转子的磁极位置但无法区分N极和S极。因为凸极效应在d轴正方向和负方向是对称的sin(2Δθ) 在 Δθ 0 和 Δθ π 时都等于零。这意味着上电时高频注入可能把转子位置锁定在错误的方向上偏差180°电角度。如果直接闭环运行电机会反转或者堵转。解决方法有两种。第一种是利用磁饱和效应在估计d轴注入正负两个方向的脉冲电压比较电流响应的幅值。由于永磁体的存在d轴正方向的电感会略小于负方向或者反过来取决于磁体方向通过比较可以判断极性。第二种是开环强拖到一定转速后用反电动势观测器判断极性再切换到高频注入。我一般用第一种方法在上电初始化阶段做一次极性辨识耗时几十毫秒对用户体验影响很小。但要注意极性辨识的脉冲幅值不能太小否则饱和效应不明显也不能太大否则会引起转子抖动。4.4 典型问题排查表实际调试中遇到的问题五花八门我整理了一个排查表覆盖了大部分常见情况。现象可能原因排查方法解决方案位置估计持续抖动注入幅值太小 / 滤波器截止频率太高示波器观察解调后误差信号加大注入幅值 / 降低截止频率电机启动时反转极性辨识错误检查极性辨识脉冲的电流响应调整辨识脉冲幅值 / 改用开环启动低速时电流畸变严重注入频率接近电流环带宽观察电流频谱提高注入频率高速切换时失步切换阈值设置不当记录切换时的转速和角度误差调整切换阈值 / 加入过渡区可听噪声大注入频率在音频范围内改变注入频率选15kHz以上或1kHz以下位置估计有稳态误差锁相环积分增益不足观察稳态角度误差加大积分增益4.5 从高频注入到反电动势观测的平滑切换高频注入只在低速有用高速时反电动势足够强应该切换到反电动势观测器否则注入信号会带来不必要的损耗和噪声。切换的关键是平滑不能有角度跳变。我的做法是设计一个过渡区在过渡区内同时运行高频注入和反电动势观测器用加权系数把两个角度估计值融合起来。加权系数随转速线性变化低速时高频注入占主导高速时反电动势观测占主导。这样切换过程中角度连续不会失步。过渡区的宽度一般取额定转速的5%到10%。太窄了切换太快容易出问题太宽了高频注入的损耗和噪声持续时间太长。具体取值要根据电机的凸极率和负载特性来调。5. 代码框架与实测波形分析理论推导和参数选取都聊完了最后落到代码上。我用一个简化的C语言框架来说明核心模块的实现然后分享一些实测波形的解读经验。5.1 核心模块的代码结构// 高频注入核心状态变量 typedef struct { float theta_est; // 估计电角度 float omega_est; // 估计电角速度 float pll_kp; // 锁相环比例增益 float pll_ki; // 锁相环积分增益 float pll_integral; // 锁相环积分项 float lpf_state[2]; // 低通滤波器状态 float hpf_state[2]; // 高通滤波器状态 float inject_phase; // 注入信号相位 float inject_freq; // 注入频率 float inject_amp; // 注入幅值 } HFI_State; // 高频注入主函数在每个PWM周期调用 void HFI_Run(HFI_State *hfi, float ia, float ib, float ic, float dt) { // 1. Clarke变换 float i_alpha ia; float i_beta (ia 2.0f * ib) * 0.577350269f; // 2. Park变换到估计dq轴 float cos_theta cosf(hfi-theta_est); float sin_theta sinf(hfi-theta_est); float i_d_hat i_alpha * cos_theta i_beta * sin_theta; float i_q_hat -i_alpha * sin_theta i_beta * cos_theta; // 3. 高通滤波提取q轴高频分量 float i_q_hf HPF_Update(hfi-hpf_state, i_q_hat, hfi-inject_freq * 0.5f, dt); // 4. 同步解调 float demod i_q_hf * sinf(hfi-inject_phase); // 5. 低通滤波提取位置误差 float error LPF_Update(hfi-lpf_state, demod, hfi-inject_freq * 0.1f, dt); // 6. 锁相环跟踪 hfi-pll_integral hfi-pll_ki * error * dt; float omega_correction hfi-pll_kp * error hfi-pll_integral; hfi-omega_est omega_correction; hfi-theta_est hfi-omega_est * dt; // 7. 角度归一化 if (hfi-theta_est 6.283185307f) hfi-theta_est - 6.283185307f; if (hfi-theta_est 0.0f) hfi-theta_est 6.283185307f; // 8. 更新注入相位 hfi-inject_phase 6.283185307f * hfi-inject_freq * dt; if (hfi-inject_phase 6.283185307f) hfi-inject_phase - 6.283185307f; }这个框架省略了很多细节比如滤波器具体实现、坐标变换的优化、定点数处理等但核心信号流是完整的。实际工程中cosf和sinf调用很耗时间通常用查表法或者CORDIC算法替代。5.2 实测波形的关键观察点调试高频注入时示波器是最好的朋友。我一般会观察以下几个信号第一估计q轴电流的高频分量。这个信号应该是一个清晰的正弦波频率等于注入频率。如果波形畸变严重或者幅值太小说明注入参数或者高通滤波器有问题。第二解调后的误差信号。这个信号应该是一个接近直流的缓变量波动越小越好。如果波动很大说明低通滤波器截止频率太高或者注入幅值不够。第三估计角度和实际角度的对比。如果有编码器做对比可以直接看角度误差。没有编码器的话可以观察电机运行是否平稳、电流是否正弦。我印象最深的一次调试位置估计一直有大约5°的稳态误差查了很久才发现是低通滤波器的相位延迟导致的。后来在锁相环里加了一个相位补偿项误差就消掉了。这个经验说明高频注入的每个环节都会影响最终精度不能只盯着一个地方调。5.3 不同工况下的性能边界高频注入不是万能的它有明确的性能边界。根据我的实测经验在零速和极低速 1%额定转速高频注入是唯一可行的无感方案位置估计精度可以做到±5°电角度以内但动态响应很慢不适合频繁加减速的场合。在低速1% ~ 5%额定转速高频注入和反电动势观测器可以配合使用位置估计精度±3°左右动态响应有所改善。在中高速 5%额定转速应该完全切换到反电动势观测器高频注入关闭。如果继续注入只会增加损耗和噪声对位置估计没有帮助。负载能力方面高频注入在额定负载以内都能工作但负载越重凸极效应受饱和影响越大位置估计精度会下降。如果电机严重饱和凸极率可能降到1.05以下高频注入就失效了。5.4 一个实用的小技巧注入频率的在线微调最后分享一个我在实际项目中用到的小技巧。注入频率不一定非要固定不变可以根据转速在线微调。低速时用较低的注入频率比如1kHz保证每个周期的采样点数足够转速升高后逐步提高注入频率比如到2kHz减少可听噪声。具体实现是把注入频率设为转速的函数用一个简单的线性关系或者查表法。这样既保证了低速时的估计精度又改善了高速时的噪声表现。当然注入频率变化时高通和低通滤波器的截止频率也要跟着调整否则滤波效果会变差。这个技巧在风机和水泵类应用中特别有用因为这些场合对噪声比较敏感而转速范围又比较宽。我试过在一台水泵上应用噪声降低了大约6dB位置估计精度没有明显下降。