4. 离线标定方法二:脉冲注入法

上一章我们聊了旋转电压矢量法,这次换个思路。脉冲注入法,说白了就是给电机定子绕组打一组短脉冲,通过观察电流响应来判断磁极位置。

我个人习惯在项目初期先用这个方法做快速验证。为什么?因为它不需要电机连续旋转,静止状态下就能干活。你想想看,有些场合电机还没装负载,或者系统刚上电,这时候用脉冲注入法就很方便。

4.1 基本原理:电感饱和效应

先讲清楚一个物理现象——电感饱和。永磁同步电机的定子电感不是恒定的,它跟转子位置有关。

当定子磁场方向和转子永磁体方向一致时,磁路容易饱和,电感值变小。反过来,方向相反时,磁路不容易饱和,电感值变大。

我刚开始做这个的时候,总觉得这个效应很微弱,怕测不准。后来发现,只要脉冲宽度和幅值选对了,电感变化量足够被检测到。

核心逻辑:

  • 定子磁场与转子磁场同向 → 磁路饱和 → 电感 L 小 → 电流上升快
  • 定子磁场与转子磁场反向 → 磁路不饱和 → 电感 L 大 → 电流上升慢

通过比较不同方向脉冲下的电流峰值或电流变化率,就能反推出转子磁极的指向。

4.2 脉冲注入的步骤

实际操作中,我一般分三步走。嗯,这里要注意,每一步的时序都很关键。

  1. 选择注入方向:通常沿 α-β 坐标系,等间隔取 6 个或 12 个方向。比如 0°、60°、120°、180°、240°、300°。
  2. 施加高频脉冲:每个方向施加一个短脉冲,脉宽一般在 50μs ~ 200μs。电压幅值建议取母线电压的 30%~50%。
  3. 采样电流响应:在脉冲结束时刻采样相电流,记录每个方向对应的电流峰值。

我曾经在一个项目里把脉宽设成了 500μs,结果电流直接冲到过流保护阈值。后来改成 100μs,数据就正常了。所以脉宽别贪大,够用就行。

4.3 数据处理与方向判定

采样完 6 个方向的电流值后,怎么找到磁极方向?

最简单的方法:找电流最大的那个方向。因为电感最小,电流上升最快,那个方向就是转子磁极的指向。

但这里有个坑——你找到的方向可能是 N 极,也可能是 S 极。因为电感饱和效应在 N 极和 S 极下是对称的,电流响应几乎一样。

避坑指南:

我曾经在第一次做脉冲注入时,只找到了磁极轴线方向,没区分 N/S 极。结果电机一转就反了。后来我加了一组正反脉冲对比:在初步判定方向 ±180° 各打一个脉冲,电流大的那个才是真正的 N 极方向。

完整的判定流程可以总结为:

  • 第一步:粗定位,找电流峰值最大的方向 θrough
  • 第二步:精定位,在 θrough 附近 ±30° 范围内加密脉冲,找到更精确的角度
  • 第三步:极性判别,在 θrough 和 θrough+180° 各打一个脉冲,电流大的为 N 极

4.4 参数选择经验

参数怎么选?我直接给出一组经过验证的参考值。这些值来自我做过的一个 400W 伺服电机项目。

参数 推荐范围 我的常用值 说明
脉冲电压 0.3 ~ 0.5 × Vbus 0.4 × Vbus 电压太低信噪比差,太高容易过流
脉冲宽度 50 ~ 200 μs 100 μs 取决于电机电感量,L 大的可适当加宽
注入方向数 6 ~ 12 6 方向越多精度越高,但耗时也长
脉冲间隔 ≥ 500 μs 1 ms 确保电流完全衰减到零

小技巧:

如果你用的 MCU 有双采样功能,可以在脉冲上升沿和下降沿各采一次电流,做差分处理。这样能有效抵消 ADC 偏置和温漂,数据更干净。

4.5 脉冲注入法的整体流程

下面这张图是我自己画的一个流程图,把整个脉冲注入标定的逻辑串起来了。你看一眼就能明白。

脉冲注入法离线标定流程 开始标定 步骤1:选择6个注入方向(0°,60°,120°...) 步骤2:依次施加高频脉冲并采样电流 步骤3:比较各方向电流峰值 找到电流最大方向? 是 否 返回步骤2加密方向 步骤4:极性判别(N/S极) 输出电角度 θ 说明:极性判别时,在 θ 和 θ+180° 各打一个脉冲,电流大的为 N 极方向

4.6 代码实现示例

下面给出一段伪代码,你移植到具体 MCU 时只需要改一下 ADC 和 PWM 的底层接口。

// 脉冲注入法离线标定
#define PULSE_VOLTAGE  0.4f    // 0.4倍母线电压
#define PULSE_WIDTH_US 100     // 100μs
#define NUM_DIRECTIONS 6       // 6个方向

float current_peaks[NUM_DIRECTIONS];
float angles[NUM_DIRECTIONS] = {0, 60, 120, 180, 240, 300};

void pulse_injection_calibration(void)
{
    uint8_t i;
    float max_current = 0;
    uint8_t max_idx = 0;
    
    // 步骤1: 遍历所有方向
    for(i = 0; i < NUM_DIRECTIONS; i++)
    {
        // 设置SVPWM输出方向
        set_svpwm_angle(angles[i]);
        
        // 施加高压脉冲
        set_pwm_duty(PULSE_VOLTAGE);
        delay_us(PULSE_WIDTH_US);
        
        // 采样电流(脉冲结束时刻)
        current_peaks[i] = adc_sample_current();
        
        // 关断PWM,等待电流衰减
        set_pwm_duty(0);
        delay_us(1000);
        
        // 记录最大值
        if(current_peaks[i] > max_current)
        {
            max_current = current_peaks[i];
            max_idx = i;
        }
    }
    
    // 步骤2: 粗定位角度
    float theta_rough = angles[max_idx];
    
    // 步骤3: 极性判别
    set_svpwm_angle(theta_rough);
    set_pwm_duty(PULSE_VOLTAGE);
    delay_us(PULSE_WIDTH_US);
    float i_pos = adc_sample_current();
    set_pwm_duty(0);
    delay_us(1000);
    
    set_svpwm_angle(theta_rough + 180);
    set_pwm_duty(PULSE_VOLTAGE);
    delay_us(PULSE_WIDTH_US);
    float i_neg = adc_sample_current();
    set_pwm_duty(0);
    
    // 电流大的为N极
    if(i_pos > i_neg)
        motor_theta = theta_rough;
    else
        motor_theta = theta_rough + 180;
    
    // 保存标定结果
    save_calibration_result(motor_theta);
}

4.7 脉冲注入法的优缺点

最后总结一下这个方法的特点。我个人的使用感受是:

优点 缺点
电机静止即可标定,无需旋转 需要额外的极性判别步骤
实现简单,代码量小 对 ADC 采样精度要求较高
不受电机转速影响 脉冲会产生 audible noise(可闻噪声)
适合批量产线快速标定 电感饱和效应弱的电机可能测不准

经验之谈:

如果你发现电流峰值差异很小(比如不到 10%),可以试试加大脉冲电压到 0.5×Vbus,或者把脉宽延长到 150μs。但一定要监控母线电流,别触发硬件过流保护。

脉冲注入法是我在量产项目中用得最多的离线标定方法。它可靠、简单,而且调试起来很直观。你只要用示波器抓一下电流波形,就能看到不同方向下的电流上升速度差异,心里就有底了。