☰
无感FOC高频注入HFI代码级拆解:从信号链路到IIR滤波器与极性判断
2026/10/7 14:54:03 网站建设 项目流程

无感 FOC 的启动阶段,最让人头疼的从来不是稳态运行,而是转子静止或极低速时那一段"睁眼瞎"的状态。反电动势观测器在零速附近增益趋近于零,滑模观测器同样依赖足够高的转速才能收敛,于是高频注入(HFI)就成了绕不开的一条路。但很多工程师第一次接触 HFI 时,代码看得云里雾里:一会儿是带通滤波,一会儿是同步解调,一会儿又冒出个 IIR 滤波器,最后还要判断磁极极性。这篇内容就把这套链路从代码层面彻底拆开,讲清楚每一步在干什么、为什么这么干、参数怎么定,以及我在实际调试中踩过的那些坑。

1. 为什么零低速必须靠高频注入而不是观测器

1.1 反电动势观测器的物理天花板

永磁同步电机的反电动势和转速成正比,公式是 e = ωe · λpm,其中 λpm 是永磁磁链。当转速趋近于零时,反电动势也趋近于零。观测器本质上是从电压方程里"抠"出反电动势,再反推转子位置。电压方程里还有电阻压降 iR 和电感压降 L·di/dt,当反电动势小到和噪声、参数误差同一个量级时,观测器就彻底失效了。

这不是算法不够好,而是物理层面的信噪比问题。你可以在仿真里把观测器增益调到很大,让它在零速也"假装"收敛,但一上真实电机,参数误差、采样噪声、死区效应立刻把它打回原形。所以业界共识是:零速和极低速用 HFI,中高速切回观测器,中间做一个平滑过渡。

1.2 高频注入的核心思路:给电机"问一个问题"

HFI 的思路其实很朴素。既然转子静止时反电动势给不了信息,那就主动往定子绕组里注入一个高频电压信号,让电机在高频下"回答"一个问题:你的凸极在哪个方向?

永磁同步电机分两类:表贴式(SPM)交直轴电感基本相等,凸极效应很弱;内置式(IPM)交直轴电感差异明显,Ld < Lq。HFI 主要针对有凸极效应的电机,利用 Ld 和 Lq 的差异来提取位置信息。注入高频电压后,高频电流的幅值会随转子位置变化,因为高频阻抗 Z = jωh·L,电感大的方向电流小,电感小的方向电流大。

这个"电流幅值随位置变化"的规律,就是位置信息的来源。你要做的,就是设计一套信号处理链路,把这个微弱的幅值调制信息解调出来。

1.3 注入方式的选择:旋转电压 vs 脉振电压

常见的注入方式有两种。旋转电压注入是在 αβ 轴上注入一个旋转的高频电压矢量,频率通常在 500Hz 到 2kHz 之间。脉振电压注入是在估计的 d 轴方向注入高频信号,通常配合位置跟踪环路使用。

旋转注入实现简单,不需要预先知道转子大概位置,适合完全未知的初始位置检测。脉振注入的信噪比更好,但需要一个初始位置估计,通常用在已经粗略知道位置后的持续跟踪阶段。实际项目里我一般先用旋转注入做初始位置检测,锁定大概方向后再切脉振注入做低速跟踪。

选择哪种方式,取决于你的应用场景。如果是风机、水泵这类对启动平稳性要求不高的场合,旋转注入足够。如果是伺服、机械臂这类要求零速大转矩、启动无抖动的场合,脉振注入配合极性判断是标配。

2. HFI 信号链路的代码级拆解

2.1 从注入到电流采样:信号到底长什么样

假设我们在 αβ 轴注入旋转高频电压:

// 注入高频电压,Vh 为注入幅值,wh 为注入角频率 float theta_h = wh * t; // 注入相位 float Valpha_h = Vh * cosf(theta_h); float Vbeta_h = Vh * sinf(theta_h);

这个电压叠加在基波电压上,一起送给 SVPWM。电机响应后,采到的 αβ 电流里就包含了基波电流和高频响应电流。高频响应电流的表达式(在转子 dq 坐标系下推导后转到 αβ)大致是:

// 高频电流响应,包含位置信息 // Ialpha_h = Ih * cos(2*theta_r - theta_h) 形式 // Ibeta_h = Ih * sin(2*theta_r - theta_h) 形式

注意这里出现了 2·theta_r,也就是转子位置的两倍频。这是凸极效应的典型特征——电感随位置变化的周期是电角度周期的一半。这个 2 倍频关系是后面所有处理的基础,也是很多人第一次看代码时最困惑的地方:为什么解调出来的角度要除以 2?

2.2 带通滤波:把高频响应从基波里捞出来

采到的电流是基波和高频的混合。基波频率低(和转速相关),高频注入频率高,两者在频域上分得比较开,所以用带通滤波器就能把高频分量提取出来。

带通滤波器的中心频率就是注入频率 wh,带宽要覆盖注入频率附近的边带。带宽太窄,动态响应差;带宽太宽,基波泄漏进来会污染位置估计。我一般把带宽设在注入频率的 ±20% 左右。

实现上可以用一个高通加一个低通级联,也可以直接设计一个二阶带通。在嵌入式里,为了计算效率,通常用双二阶(biquad)结构。下面是一个典型的带通 biquad 实现:

typedef struct { float b0, b1, b2, a1, a2; float x1, x2, y1, y2; } Biquad; float biquad_process(Biquad *f, float x) { float y = f->b0 * x + f->b1 * f->x1 + f->b2 * f->x2 - f->a1 * f->y1 - f->a2 * f->y2; f->x2 = f->x1; f->x1 = x; f->y2 = f->y1; f->y1 = y; return y; }

这段代码本身很简单,关键在于系数怎么算。系数由采样频率、中心频率、带宽(或者说 Q 值)决定。采样频率通常是 PWM 频率,比如 10kHz 或 20kHz。注入频率如果选 1kHz,那采样率至少要是注入频率的 10 倍以上,否则离散化误差会很大。

注意:带通滤波器的系数必须在初始化时算好,不要在中断里实时计算三角函数,那会吃掉大量 CPU 时间。如果注入频率需要动态调整,也要在低频任务里算好再更新。

2.3 同步解调:把位置信息从载波上"卸"下来

带通滤波之后,你拿到的是中心频率为 wh 的高频信号,位置信息以相位调制的形式藏在里面。要把它提取出来,需要做同步解调,也就是乘以一个和注入信号同频的参考信号。

// 同步解调,乘以注入相位的 cos 和 sin float Ialpha_h = biquad_process(&bp_alpha, Ialpha); float Ibeta_h = biquad_process(&bp_beta, Ibeta); float demod_d = Ialpha_h * cosf(theta_h) + Ibeta_h * sinf(theta_h); float demod_q = -Ialpha_h * sinf(theta_h) + Ibeta_h * cosf(theta_h);

解调之后,高频载波被搬移到直流和两倍频附近。直流分量里就包含了位置误差信息,两倍频分量是解调产生的杂散,需要滤掉。

这一步的物理意义是:把旋转坐标系下的高频响应投影到注入方向上,得到同相和正交两个分量。同相分量和位置误差的余弦相关,正交分量和位置误差的正弦相关。当位置估计准确时,正交分量应该为零。

2.4 低通滤波与位置误差提取

解调后的信号还要过一次低通,把两倍频分量滤掉,留下直流分量。这个低通滤波器的截止频率要远低于注入频率,通常在几十赫兹到一两百赫兹之间。

// 低通滤波提取直流分量 float err_d = lpf_process(&lpf_d, demod_d); float err_q = lpf_process(&lpf_q, demod_q); // 位置误差信号,通常用 err_q 或 err_d 的某种组合 float pos_error = err_q; // 具体用哪个取决于解调坐标系定义

这里有个容易搞混的地方:到底用 err_d 还是 err_q 作为位置误差?这取决于你的解调坐标系定义和注入方式。旋转注入下,通常解调后得到的正交分量正比于 sin(2·Δθ),其中 Δθ 是位置估计误差。当 Δθ 很小时,sin(2·Δθ) ≈ 2·Δθ,所以这个信号可以直接作为位置误差输入给锁相环。

2.5 锁相环:把误差信号积分成位置和速度

拿到位置误差后,用一个锁相环(PLL)或者龙伯格观测器把它积分成位置和速度。PLL 的结构很经典:

// 锁相环 float kp_pll = ...; // 比例增益 float ki_pll = ...; // 积分增益 float pll_integral += ki_pll * pos_error * Ts; float speed_est = kp_pll * pos_error + pll_integral; float theta_est += speed_est * Ts;

PLL 的带宽决定了位置跟踪的动态性能。带宽高,跟踪快,但对噪声敏感;带宽低,平滑但响应慢。我一般把 PLL 带宽设在几十赫兹,具体要看注入频率和电机的时间常数。

提示:PLL 的输出角度要记得做归一化,防止长时间运行后数值溢出。另外,PLL 的积分器要有抗饱和处理,否则在位置误差大的时候会积累错误的积分量。

3. IIR 滤波器在 HFI 里的角色与参数设计

3.1 为什么是 IIR 而不是 FIR

在 HFI 的信号链里,滤波器的计算效率至关重要,因为整个链路跑在电流环中断里,通常每个 PWM 周期都要执行一次。FIR 滤波器要达到同样的频率选择性,需要几十甚至上百阶,而 IIR 滤波器用二阶或四阶就能实现很陡的滚降。

IIR 的代价是相位非线性,但对于 HFI 来说,我们关心的是特定频率分量的幅值和相位关系,只要滤波器在注入频率附近的相位特性稳定,就不会影响位置估计。而且 IIR 有反馈,定点实现时要注意数值稳定性,浮点实现基本不用担心。

3.2 双二阶结构的参数计算

一个二阶 IIR 带通滤波器的传递函数可以写成:

H(z) = (b0 + b1·z⁻¹ + b2·z⁻²) / (1 + a1·z⁻¹ + a2·z⁻²)

系数由中心频率 f0、采样频率 fs、品质因数 Q 决定。常用的设计公式(双线性变换法)是:

// 带通 biquad 系数计算 float w0 = 2.0f * PI * f0 / fs; float alpha = sinf(w0) / (2.0f * Q); float b0 = alpha; float b1 = 0; float b2 = -alpha; float a0 = 1 + alpha; float a1 = -2 * cosf(w0); float a2 = 1 - alpha; // 归一化 b0 /= a0; b1 /= a0; b2 /= a0; a1 /= a0; a2 /= a0;

Q 值决定了带宽,Q 越高带宽越窄。对于 HFI,我一般取 Q 在 1 到 5 之间。Q 太高,滤波器对注入频率的微小漂移很敏感;Q 太低,基波泄漏严重。

3.3 低通滤波器的截止频率怎么定

解调后的低通滤波器截止频率,直接决定了位置估计的带宽。截止频率高,位置响应快,但高频噪声和两倍频残余会进来;截止频率低,平滑但相位滞后大。

我的经验是:低通截止频率取 PLL 带宽的 2 到 5 倍。比如 PLL 带宽 50Hz,低通截止取 100 到 250Hz。这样既保证了 PLL 有足够的信号带宽,又能有效抑制解调杂散。

3.4 定点实现时的注意事项

如果 MCU 没有 FPU,或者为了省时间用定点运算,IIR 的系数和状态变量都要做 Q 格式定标。这里最大的坑是系数的动态范围:b0 可能很小,a1 可能接近 2,如果定标不当,中间结果会溢出。

我的做法是:先把滤波器在浮点下仿真验证,记录中间变量的最大值,再根据这个最大值确定定标位数。另外,IIR 的反馈结构对舍入误差敏感,建议用直接II型(Direct Form II)而不是直接I型,因为直接II型的中间状态更少,舍入噪声更低。

// 直接II型 biquad,定点实现更友好 float w = x - f->a1 * f->w1 - f->a2 * f->w2; float y = f->b0 * w + f->b1 * f->w1 + f->b2 * f->w2; f->w2 = f->w1; f->w1 = w; return y;

4. 位置估计与磁极极性判断的完整实现

4.1 从 2 倍频到真实角度:除以 2 的陷阱

前面提到,凸极效应的位置信息是 2 倍频的。解调出来的角度 θ_est_2x 对应的是 2·θ_r,所以真实角度是 θ_r = θ_est_2x / 2。但这里有个致命问题:除以 2 之后,角度范围变成了 0 到 π,而不是 0 到 2π。也就是说,你无法区分 N 极和 S 极,因为两者对应的凸极方向是一样的。

这就是为什么 HFI 单独用凸极效应只能得到转子轴向,但分不清磁极极性。要确定极性,必须额外做磁极极性判断。

4.2 磁极极性判断的两种主流方法

第一种是脉冲注入法。在估计的 d 轴方向注入一个短时正脉冲,再注入一个负脉冲,比较两次电流响应的幅值。由于永磁体的饱和效应,当注入方向与磁极方向一致时,铁芯饱和程度更高,电感更小,电流上升更快。通过比较正负脉冲的电流响应,就能判断极性。

// 脉冲注入极性判断(简化示意) // 在估计 d 轴注入正脉冲 apply_voltage_d(Vpulse); delay_ms(1); float I_pos = read_current_d(); // 注入负脉冲 apply_voltage_d(-Vpulse); delay_ms(1); float I_neg = read_current_d(); // 比较电流幅值 if (fabsf(I_pos) > fabsf(I_neg)) { // 估计方向与磁极一致 polarity = 1; } else { // 估计方向与磁极相反,需要加 pi polarity = -1; }

第二种是高频注入法。在估计的 d 轴方向注入高频脉振信号,观察电流响应的二次谐波。由于饱和效应的非线性,磁极方向不同时,二次谐波的相位不同。这种方法不需要额外的脉冲,可以和位置跟踪同时进行,但信号处理更复杂。

实际项目里我一般用脉冲注入法,因为它简单可靠,判断一次就够了。但要注意脉冲的幅值和持续时间:幅值太小,饱和效应不明显;幅值太大,可能引起机械抖动或过流。我通常取额定电流的 50% 到 100% 作为脉冲幅值,持续时间在几百微秒到几毫秒之间。

4.3 极性判断的时机与流程

极性判断不能随便做,要在位置估计已经稳定之后再做。如果位置估计还在收敛过程中,极性判断的结果不可靠。

典型的启动流程是:

  1. 旋转高频注入,运行 PLL,等位置估计收敛(通常几十毫秒)
  2. 在估计的 d 轴方向做脉冲注入,判断极性
  3. 根据极性修正角度,如果极性相反就加 π
  4. 切换到脉振注入或直接切换到观测器

注意:极性判断的脉冲注入会引起电流冲击,如果电机连接了机械负载,可能会听到"咔"的一声。这是正常的,但如果声音很大或者电流超限,要减小脉冲幅值。

4.4 位置估计的收敛判据

怎么知道位置估计已经收敛了?我一般看两个指标:一是 PLL 的位置误差信号,如果持续小于某个阈值(比如 0.05 rad),就认为收敛;二是估计速度的波动,如果速度估计的波动小于某个范围,也说明收敛。

// 收敛判据 if (fabsf(pos_error) < 0.05f && fabsf(speed_est) < 10.0f) { converge_count++; if (converge_count > 100) { hfi_converged = 1; } } else { converge_count = 0; }

这个判据要根据实际电机的噪声水平调整。噪声大的系统,阈值要放宽,否则永远等不到收敛。

5. 调试中那些文档不会告诉你的坑

5.1 注入频率和 PWM 频率的"打架"

注入频率不能随便选,它和 PWM 频率、电流采样频率有直接关系。如果注入频率接近 PWM 频率的整数分之一,采样时会产生混叠,位置估计会周期性抖动。

我的经验是:注入频率取 PWM 频率的 1/10 到 1/20。比如 PWM 10kHz,注入频率取 500Hz 到 1kHz。同时要避开电流采样时刻和注入信号的特定相位关系,否则采样到的高频电流可能正好在过零点,信噪比极差。

5.2 死区效应对高频信号的污染

逆变器的死区效应会在输出电压里引入误差,这个误差在基波频率下影响不大,但在高频注入下会直接污染高频响应。死区补偿如果做得不好,HFI 的位置估计会出现 6 倍频的脉动。

解决办法有两个:一是做好死区补偿,二是选择注入频率时避开死区效应最严重的频段。实测下来,死区补偿对 HFI 的改善非常明显,尤其是低速小电流的时候。

5.3 电感饱和导致的凸极效应变化

HFI 依赖凸极效应,但电感会随电流饱和而变化。如果注入幅值太大,或者基波电流本身很大,电感饱和会让 Ld 和 Lq 的差异变小,甚至反转,位置估计直接失效。

所以注入幅值要适中,既要保证信噪比,又不能引起饱和。我一般从额定电压的 10% 到 20% 开始试,观察位置估计的稳定性,再逐步调整。

5.4 负载对极性判断的影响

脉冲注入法判断极性时,如果电机带着负载,负载的机械惯性会影响电流响应。重载下,正负脉冲的电流差异可能被负载转矩掩盖,导致极性判断错误。

这种情况下,可以增大脉冲幅值,或者改用高频注入法判断极性。另外,极性判断最好在电机完全静止时做,如果电机还在惯性转动,判断结果也不可靠。

5.5 从 HFI 切换到观测器的过渡

HFI 只在零低速有效,转速升高后要切换到反电动势观测器。切换点通常在额定转速的 5% 到 10%。切换时如果两个估计器的角度不一致,会产生转矩冲击。

我的做法是:在切换区间内,用一个加权系数把两个估计器的角度和速度平滑混合,而不是硬切换。加权系数随转速线性变化,低速时 HFI 权重大,高速时观测器权重大。

// 平滑切换 float blend = (speed - speed_low) / (speed_high - speed_low); blend = clamp(blend, 0.0f, 1.0f); float theta_final = (1 - blend) * theta_hfi + blend * theta_obs; float speed_final = (1 - blend) * speed_hfi + blend * speed_obs;

注意角度混合时要处理 0 和 2π 的跳变,否则会在边界处产生错误。我一般先把角度转到连续空间再混合,或者用 sin/cos 表示角度再混合。

5.6 参数整定的顺序

HFI 的参数不少:注入幅值、注入频率、带通 Q 值、低通截止、PLL 带宽、极性判断脉冲幅值。这些参数不能一起调,要有顺序。

我的顺序是:先定注入频率和幅值,保证带通滤波后能看到干净的高频信号;再调带通和低通,让解调后的位置误差信号干净;然后调 PLL 带宽,让位置跟踪既快又稳;最后做极性判断,调脉冲参数。每一步都要用示波器或者 DAC 输出观察波形,不要盲调。

6. 一套可复现的 HFI 代码框架

6.1 整体架构与执行时序

HFI 的代码通常分布在两个地方:电流环中断里做信号处理和 PLL 更新,低频任务里做参数计算和状态机切换。电流环中断的执行顺序是:

  1. 采样三相电流,Clarke 变换到 αβ
  2. 带通滤波提取高频分量
  3. 同步解调
  4. 低通滤波提取位置误差
  5. PLL 更新位置和速度
  6. 注入电压叠加到基波电压上
  7. SVPWM 输出

这个顺序不能乱,因为每一步都依赖上一步的结果。而且整个链路要在每个 PWM 周期内完成,计算量不小,需要优化。

6.2 关键数据结构的定义

typedef struct { // 注入参数 float Vh; // 注入幅值 float wh; // 注入角频率 float theta_h; // 注入相位 // 滤波器 Biquad bp_alpha; // α轴带通 Biquad bp_beta; // β轴带通 Biquad lpf_d; // d轴低通 Biquad lpf_q; // q轴低通 // PLL float kp_pll; float ki_pll; float pll_integral; float theta_est; float speed_est; // 状态 uint8_t state; // 状态机 uint8_t converged; // 收敛标志 int8_t polarity; // 极性 } HFI_Handle;

这个结构体把 HFI 的所有状态都封装在一起,方便管理。实际项目里我还会加一些调试变量,比如把中间信号输出到 DAC,方便用示波器观察。

6.3 中断服务函数的实现要点

void current_loop_isr(void) { // 1. 采样电流 float Ialpha, Ibeta; sample_and_clarke(&Ialpha, &Ibeta); // 2. 带通滤波 float Ialpha_h = biquad_process(&hfi.bp_alpha, Ialpha); float Ibeta_h = biquad_process(&hfi.bp_beta, Ibeta); // 3. 同步解调 float cos_h = cosf(hfi.theta_h); float sin_h = sinf(hfi.theta_h); float demod_d = Ialpha_h * cos_h + Ibeta_h * sin_h; float demod_q = -Ialpha_h * sin_h + Ibeta_h * cos_h; // 4. 低通滤波 float err_d = biquad_process(&hfi.lpf_d, demod_d); float err_q = biquad_process(&hfi.lpf_q, demod_q); // 5. PLL 更新 float pos_error = err_q; hfi.pll_integral += hfi.ki_pll * pos_error * Ts; hfi.speed_est = hfi.kp_pll * pos_error + hfi.pll_integral; hfi.theta_est += hfi.speed_est * Ts; // 6. 注入电压叠加 float Valpha_h = hfi.Vh * cos_h; float Vbeta_h = hfi.Vh * sin_h; // ... 叠加到基波电压,SVPWM 输出 // 7. 更新注入相位 hfi.theta_h += hfi.wh * Ts; if (hfi.theta_h > 2 * PI) hfi.theta_h -= 2 * PI; }

这段代码是 HFI 的核心,每个 PWM 周期执行一次。注意 cosf 和 sinf 比较耗时,如果 MCU 性能有限,可以用查表法或者 CORDIC 算法替代。

6.4 状态机设计

HFI 的启动过程是一个状态机:待机、注入收敛、极性判断、低速跟踪、切换观测器。每个状态的切换条件要明确,避免状态混乱。

switch (hfi.state) { case STATE_IDLE: // 等待启动命令 break; case STATE_HFI_CONVERGE: // 旋转注入,等 PLL 收敛 if (hfi.converged) hfi.state = STATE_POLARITY; break; case STATE_POLARITY: // 脉冲注入判断极性 // ... hfi.state = STATE_LOW_SPEED; break; case STATE_LOW_SPEED: // 脉振注入低速跟踪 if (speed > speed_switch) hfi.state = STATE_BLEND; break; case STATE_BLEND: // 平滑切换到观测器 break; }

状态机的设计要考虑到异常情况,比如收敛超时、极性判断失败、过流保护等。每个状态都要有超时退出机制,否则一旦卡住,电机就起不来了。

7. 实测波形与现象解读

7.1 带通滤波前后的电流波形

用 DAC 把带通滤波前后的电流输出到示波器,可以看到:滤波前是基波和高频的混合,波形比较"胖";滤波后只剩下高频分量,是一个干净的正弦波,幅值随转子位置缓慢变化。这个幅值变化就是位置信息的载体。

如果滤波后的波形不干净,说明带通参数不对,或者注入幅值太小。如果波形幅值不随位置变化,说明凸极效应太弱,或者注入频率选得不对。

7.2 位置误差信号的观察

解调后的位置误差信号,在位置估计收敛后应该是一个接近零的、小幅波动的信号。如果误差信号有明显的周期性脉动,通常是死区效应或者滤波器相位不对称导致的。

我一般会把位置误差信号和估计角度一起输出到示波器,观察两者的关系。如果误差信号在特定角度位置出现尖峰,说明那个位置有磁路不对称或者采样干扰。

7.3 极性判断的电流响应

脉冲注入时,用示波器看 d 轴电流的响应。正脉冲和负脉冲的电流上升斜率不同,这就是极性信息的来源。如果两个脉冲的电流响应几乎一样,说明饱和效应不明显,需要增大脉冲幅值或者换用其他极性判断方法。

7.4 切换过程的转矩波形

从 HFI 切换到观测器时,如果切换不平滑,转矩会有冲击。用转矩传感器或者观察 q 轴电流,可以看到切换瞬间的波动。平滑切换的目标就是让这个波动尽可能小。

8. 几个容易被忽略的工程细节

8.1 电流采样时刻与注入相位的对齐

电流采样通常在 PWM 周期的特定时刻进行,比如下桥臂导通时采样。如果采样时刻和注入信号的相位关系不合适,采到的高频电流可能正好在过零点附近,信噪比很差。

解决办法是调整注入相位,让采样时刻对应高频电流的峰值附近。这需要根据具体的 PWM 调制方式和采样方案来定,没有通用公式,要实测调整。

8.2 温度对电感的影响

电感随温度变化,尤其是铁芯材料的磁导率随温度漂移。高温下凸极效应可能变弱,HFI 的性能下降。如果应用场景温度变化大,要考虑温度补偿,或者设计对凸极效应依赖更小的方案。

8.3 多电机并联时的相互干扰

如果多个电机共用一个直流母线,一个电机的高频注入信号可能通过母线耦合到其他电机,干扰其他电机的控制。这种情况下,要么错开各电机的注入频率,要么增加母线滤波。

8.4 代码执行时间的优化

HFI 的信号链计算量不小,尤其是三角函数和多次滤波。如果电流环中断时间紧张,可以考虑:用查表代替三角函数、用定点代替浮点、把部分滤波放到低频任务里(如果带宽允许)、用 DMA 搬运数据减少 CPU 开销。

我在一个 10kHz 电流环的项目里,HFI 全链路浮点实现大约占用 8 微秒,定点优化后降到 3 微秒左右。这个开销在大多数 MCU 上是可以接受的,但如果你的电流环频率更高,就要仔细优化了。

8.5 初始位置检测的精度要求

HFI 初始位置检测的精度通常在 10 到 30 电角度之间,具体取决于凸极比和信噪比。对于要求高启动转矩的应用,这个精度可能不够,需要配合其他方法,比如高频脉振注入配合极性判断,可以把精度提高到 5 度以内。

如果应用对初始位置精度要求极高,还可以考虑在电机上安装霍尔传感器或者编码器,但那就不是无感方案了。无感 HFI 的精度和成本之间需要权衡。

8.6 噪声与电磁兼容

高频注入会在电机绕组和电缆上产生高频电压,可能引起电磁干扰。如果产品有电磁兼容要求,注入频率和幅值的选择要考虑到这一点。通常注入频率越高,辐射越容易控制,但开关损耗和铁损也越大。

我在实际项目里遇到过 HFI 注入频率干扰到附近传感器的情况,最后通过调整注入频率和增加屏蔽解决的。所以电磁兼容测试要早做,不要等到最后才发现问题。

9. 从 HFI 到全速域无感控制的演进思路

HFI 解决了零低速的问题,但要实现全速域无感控制,还需要和观测器配合。我通常的做法是:零速到 5% 额定转速用 HFI,5% 到 15% 用混合过渡,15% 以上用反电动势观测器。每个区间的切换点根据电机的凸极比和观测器性能来定。

凸极比大的电机,HFI 的有效范围可以更宽;凸极比小的电机,HFI 可能只在极低速有效,要尽早切换到观测器。观测器的选择也有讲究:滑模观测器鲁棒性好但抖振大,龙伯格观测器平滑但依赖参数准确,扩展卡尔曼滤波性能好但计算量大。实际选型要看应用需求和 MCU 性能。

这套东西说起来复杂,但拆开来看,每一步都有明确的物理意义和工程考量。HFI 的核心就是"注入-解调-滤波-跟踪"这条链路,IIR 滤波器是链路里的关键环节,位置估计和极性判断是最终目的。把这条链路吃透,无感 FOC 的零低速启动就不再是黑盒了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询