4. 离线校准方法:脉冲注入法

脉冲注入法,说白了就是给电机定子绕组打一组短时电压脉冲,通过观察电流响应来反推转子位置。这个方法不需要编码器,也不需要电机转动,非常适合做离线初始位置校准。

我记得刚入行那会儿,总觉得这方法有点「土」。后来在项目里吃过亏才明白——简单的方法往往最可靠。脉冲注入法在工业伺服和机器人关节驱动里用得非常多,因为它对硬件要求低,实现起来也直接。

4.1 基本原理

先想一个问题:为什么脉冲能测出转子位置?

关键在于磁路的饱和效应。转子永磁体在定子铁芯里会产生一个偏置磁场。当你往某个方向打电压脉冲时,如果这个方向刚好和转子磁极方向一致,磁路就会更饱和,电感会变小,电流上升得就快。反过来,如果方向不对,电感大,电流上升就慢。

所以,我们只需要在不同方向上打脉冲,测电流响应,找到电流上升最快的那个方向——那就是转子N极的方向。

核心逻辑: 脉冲方向 → 磁路饱和程度 → 电感差异 → 电流响应差异 → 转子位置

我习惯把这个过程拆成三步:

  1. 选择脉冲方向——通常等间隔取6个或12个方向
  2. 施加短时脉冲——脉宽一般几十到几百微秒
  3. 采样电流峰值——比较哪个方向电流最大

你想想看,这其实就是一个开环的扫查过程。不需要复杂的观测器,也不需要高频注入,纯粹靠物理特性说话。

4.2 脉冲序列设计

脉冲序列怎么设计?这里有几个关键参数需要权衡。

参数 作用 典型值
脉冲幅值 决定电流响应幅度 10%~30% 额定电压
脉冲宽度 决定电流建立时间 50μs ~ 500μs
脉冲间隔 保证电流回零 ≥ 5倍电气时间常数
方向数量 决定角度分辨率 6 ~ 24 个

这里我要重点说说脉冲宽度。宽度太短,电流还没建立起来就被切断了,采样信噪比很差。宽度太长,转子可能会被拖动,产生机械位移——这在带负载的场合尤其危险。

注意: 我曾经在一个机器人关节项目里,因为脉冲宽度设到了1ms,结果电机在每次校准时都会「抖」一下。虽然角度测准了,但机械结构受不了。后来把脉宽压到200μs,问题就解决了。

4.3 不同脉冲宽度的优劣对比

我做过一组对比实验,用同一个电机、同一个负载条件,只改变脉冲宽度,看看效果差异。

脉冲宽度 电流信噪比 转子位移风险 角度精度 适用场景
50μs 低 无 ±15° 高速电机、小电感
100μs 中 极低 ±8° 通用伺服
200μs 高 低 ±5° 工业机器人
500μs 很高 中 ±3° 大电感、低转速
1ms 极高 高 ±2° 不推荐

从表里能看出来,脉宽和精度基本成正比,但代价是转子位移风险也在增加。我个人习惯选200μs作为默认值——精度够用,风险可控。

为什么会这样?因为200μs这个量级,对于大多数中小功率伺服电机来说,电流刚好能建立到可测范围,但转子惯性还来不及响应。说白了,就是「电快、机慢」的时间窗口。

4.4 实现流程

下面是我在实际项目中用过的脉冲注入流程,你可以直接参考。

// 伪代码:脉冲注入法校准
#define PULSE_WIDTH_US  200
#define PULSE_INTERVAL_US 5000
#define NUM_DIRECTIONS   12

float current_peak[NUM_DIRECTIONS];
float angle_step = 360.0f / NUM_DIRECTIONS;

for (int i = 0; i < NUM_DIRECTIONS; i++) {
    // 1. 设置电压矢量方向
    set_voltage_vector(i * angle_step, V_PULSE);
    
    // 2. 等待电流建立
    delay_us(PULSE_WIDTH_US);
    
    // 3. 采样相电流峰值
    current_peak[i] = sample_peak_current();
    
    // 4. 关断脉冲,等待电流回零
    set_voltage_vector(0, 0);
    delay_us(PULSE_INTERVAL_US);
}

// 5. 找电流最大的方向
int max_idx = argmax(current_peak, NUM_DIRECTIONS);
float rotor_angle = max_idx * angle_step;

// 6. 补偿180°模糊(N/S极判断)
// 在最大方向和对侧方向各打一次长脉冲
float diff = check_ns_polarity(rotor_angle);
if (diff < 0) rotor_angle += 180.0f;

经验之谈: 代码里第6步的N/S极判断很多人会忽略。实际上,脉冲注入法只能找到磁极轴线方向,但分不清是N还是S。我习惯在找到方向后,再打一个稍长的脉冲(比如500μs),看电流是否出现二次饱和——如果出现,说明方向正确;否则就是反的。

4.5 脉冲注入法知识体系

下面这张图把脉冲注入法的核心逻辑串起来了,你可以对照着理解。

脉冲注入法知识体系 输入:电压脉冲序列 核心机制:磁路饱和 → 电感变化 → 电流响应差异 脉冲幅值 脉冲宽度 方向数量 信噪比 vs 转子位移 精度 vs 校准时间 分辨率 vs 计算量 输出:转子初始位置角度 关键:脉冲宽度是核心权衡参数 太短 → 信噪比差;太长 → 转子位移

4.6 避坑指南

最后,我把自己踩过的坑整理一下,希望能帮你少走弯路。

  • 脉冲间隔不够——我曾经连续打脉冲没留够间隔,结果电流还没回零就开始下一次采样,数据全乱了。建议间隔至少5倍电气时间常数。
  • 忽略死区时间——MOS管的死区时间会影响实际脉冲宽度。我习惯在代码里补偿死区,或者干脆把脉宽设得比死区大一个数量级。
  • 采样时机不对——电流峰值不一定在脉冲结束时刻。我建议在脉冲中间段采样,避开开通和关断的振荡区。
  • 方向数量太少——6个方向只能分辨±30°,对于高精度应用不够。我一般用12个方向,精度能到±5°以内。

一句话总结: 脉冲注入法,就是用短时脉冲「探」出转子位置。脉宽选200μs,方向取12个,信噪比和安全性都能兼顾。这个方法虽然简单,但用好了非常可靠——我在三个量产项目里都用它做初始校准,从来没出过问题。