4. 高频注入法:利用凸极效应实现无传感器初始位置辨识

聊到无传感器初始位置辨识,很多工程师第一反应就是高频注入法。这个方法,说白了就是利用电机自身的凸极效应来“摸”出转子的位置。我最早接触这个技术是在一个伺服项目上,当时编码器坏了,客户又急着要样机,硬着头皮用高频注入把位置估了出来。嗯,从那以后我就对这个方法有了信心。

4.1 凸极效应是什么?

先说说凸极效应。你想想看,有些电机转子不是圆的——比如内置式永磁同步电机(IPMSM),它的d轴和q轴电感不一样。d轴电感小,q轴电感大。这种电感的不对称,就是凸极效应。

为什么会这样?因为转子磁钢嵌在铁芯里,d轴方向磁路经过永磁体,磁阻大,电感就小;q轴方向磁路全是铁,磁阻小,电感就大。这个差异,就是我们做位置辨识的“抓手”。

关键点:凸极率 ρ = Lq / Ld。ρ 越大,位置辨识的信噪比越高。一般IPMSM的ρ在1.5~3之间,表贴式(SPMSM)几乎为1,所以高频注入法对SPMSM效果很差。

我在项目中遇到过一台电机,标称是IPMSM,但实测凸极率只有1.1。折腾了两天,最后发现是磁钢退磁了。所以拿到电机先测一下Ld和Lq,心里才有底。

4.2 高频注入的基本原理

高频注入法的思路很简单:在定子绕组上叠加一个高频电压(或电流)信号,然后从响应电流(或电压)中提取位置信息。

我们通常往估计的d轴注入高频正弦电压:

u_dh = V_h · cos(ω_h · t)
u_qh = 0

其中 V_h 是幅值,ω_h 是高频角频率。这个高频信号会在电机里产生高频电流响应。由于凸极效应,d轴和q轴的高频阻抗不同,所以响应电流的幅值会随转子位置变化。

我习惯把注入频率选在500Hz~2kHz之间,具体看电机的时间常数。频率太低,会和基波耦合;频率太高,逆变器开关损耗大,电流采样也容易出问题。

4.3 信号解调与位置提取

注入高频信号后,我们采样三相电流,然后变换到估计的dq坐标系。这时候电流里既有基波分量,也有高频分量。我们需要把高频分量滤出来。

常用的方法是带通滤波器(BPF)加同步解调。流程如下:

  1. 采样电流:采集 ia、ib、ic,变换到估计的 αβ 坐标系。
  2. 带通滤波:提取注入频率附近的电流分量 iαh、iβh。
  3. 同步解调:乘以 sin(ωht) 或 cos(ωht),把高频分量搬到直流。
  4. 低通滤波:滤掉2倍频分量,得到包含位置误差的信号 ε。

这个误差信号 ε 和实际位置与估计位置的差值 Δθ 成正比:

ε ≈ K · sin(2Δθ)

当 Δθ 很小时,ε ≈ 2K · Δθ。把这个误差送进锁相环(PLL),就能收敛到真实位置。

我的经验:PLL的带宽要设得比注入频率低一个数量级。比如注入频率1kHz,PLL带宽设100Hz左右。带宽太高,噪声会进来;带宽太低,收敛太慢,启动时容易抖。

4.4 注入信号的选择

注入信号不是随便选的。我整理了一个对比表,方便你参考:

注入方式 信号形式 优点 缺点 适用场景
旋转高频电压注入 在αβ坐标系注入旋转电压矢量 实现简单,对凸极率要求低 会产生转矩脉动 低速、零速辨识
脉振高频电压注入 在估计d轴注入脉振电压 转矩脉动小,信噪比高 需要准确的初始估计方向 初始位置辨识
高频方波注入 注入方波电压代替正弦波 无需乘法解调,计算量小 谐波多,滤波要求高 资源受限的MCU

我个人最常用的是脉振高频电压注入。原因很简单——转矩脉动小,电机不会在辨识过程中乱转。有一次我在一个精密转台上用旋转注入,结果电机抖了5度,客户当场就不高兴了。换成脉振注入后,问题解决。

4.5 实现中的避坑指南

高频注入法看着简单,实际调试时坑不少。我踩过的几个,分享给你:

  • 滤波器延迟:BPF和LPF都会引入相位延迟,导致位置估计滞后。我曾经因为这个让电机在启动时反转了半圈。解决办法是补偿滤波器延迟,或者在PLL里加相位补偿。
  • 逆变器非线性:死区时间和管压降会产生低次谐波,和高频信号混在一起。我建议在注入前先做死区补偿,或者把注入频率选在开关频率的1/10以上,避开谐波集中区。
  • 饱和效应:大电流时磁路饱和,Ld和Lq都会变化,凸极率可能下降。我在一个重载启动项目里遇到过,空载时辨识很准,一带负载就偏了10度。后来在注入幅值上做了自适应,根据电流大小调整Vh。
  • 采样噪声:高频注入对电流采样精度要求高。我建议用差分采样,ADC采样率至少是注入频率的20倍。如果MCU资源够,还可以做过采样+均值滤波。

特别注意:高频注入法在零速和低速(<5%额定转速)效果很好,但转速一高,反电动势会淹没注入信号。所以高频注入通常只用于启动阶段,转速起来后要切换到反电动势法。切换时要做平滑过渡,否则电流会突变。

4.6 核心流程框图

下面这张图是我自己总结的高频注入法完整流程,从信号注入到位置输出,每一步都标清楚了:

高频注入法初始位置辨识流程图 高频注入法初始位置辨识流程图 注入高频电压信号 采样三相电流 i_a, i_b, i_c 变换到估计 dq 坐标系 带通滤波提取高频分量 同步解调 + 低通滤波 PLL 跟踪输出位置 θ 反馈估计位置 注意事项 • 注入频率:500Hz~2kHz • PLL带宽:< 注入频率/10 • 采样率 ≥ 20倍注入频率

4.7 代码实现要点

最后给一段核心代码片段,展示高频注入的实时计算部分。我用的是C语言风格,实际移植时注意适配你的MCU:

// 高频注入实时计算(主中断中执行,频率10kHz)
// 注入频率 1kHz,幅值 0.1 pu

#define VH_INJECT    0.1f      // 注入幅值
#define WH_INJECT    628.3f    // 2*pi*1000 rad/s
#define TS           0.0001f   // 采样周期 100us

static float theta_inject = 0.0f;

// 1. 生成注入电压(在估计d轴)
theta_inject += WH_INJECT * TS;
if (theta_inject > 2.0f * M_PI) theta_inject -= 2.0f * M_PI;

float vd_inject = VH_INJECT * cosf(theta_inject);
float vq_inject = 0.0f;

// 2. 叠加到基波电压指令
vd_ref += vd_inject;
vq_ref += vq_inject;

// 3. 采样电流并变换到估计dq(代码略,假设已得到 id_meas, iq_meas)

// 4. 带通滤波(二阶IIR,中心频率1kHz)
// 系数需根据采样率设计,这里仅示意
float id_hp = b0*id_meas + b1*id_meas_z1 + b2*id_meas_z2 
              - a1*id_hp_z1 - a2*id_hp_z2;
// 更新延迟状态
id_meas_z2 = id_meas_z1;
id_meas_z1 = id_meas;
id_hp_z2 = id_hp_z1;
id_hp_z1 = id_hp;

// 5. 同步解调:乘以 cos(theta_inject)
float epsilon = id_hp * cosf(theta_inject);

// 6. 低通滤波(一阶LPF,截止频率100Hz)
float alpha = 0.1f;  // 根据截止频率计算
epsilon_filtered = (1.0f - alpha) * epsilon_filtered + alpha * epsilon;

// 7. 送PLL
pll_update(epsilon_filtered);

调试技巧:第一次跑高频注入时,先把电机轴锁住(或者用手捏住),然后观察 epsilon_filtered 的值。如果它随你手动转动转子呈正弦变化,说明注入和解调都对了。如果信号乱跳,先检查滤波器系数和采样时序。

高频注入法是我做无传感器控制时最依赖的技术之一。它不依赖电机模型参数,鲁棒性好,在零速和低速下表现稳定。当然,它也有局限性——对凸极率敏感、会引入额外噪声、高速时失效。但作为初始位置辨识和低速段的主力方案,它完全够用。