4. 离线校正方法(二):脉冲注入法原理与实现

上一章我们聊了磁链观测法,这次来说说另一种离线校正的思路——脉冲注入法。我个人觉得,这个方法在电机静止或极低速场景下特别好用,尤其是那些对初始位置精度要求高的场合。

说白了,脉冲注入法就是给电机定子绕组施加一系列高频电压脉冲,然后通过检测电流响应来反推转子位置。你想想看,电机绕组是个电感,电感值会随着转子位置变化而变化——这就是我们能利用的物理基础。

核心思想: 利用电机凸极效应(或饱和凸极效应),通过高频激励下的电流响应差异,解算出转子位置。

4.1 为什么需要脉冲注入?

我记得刚做电机控制那会儿,遇到一个问题:电机上电时转子位置完全未知,直接启动很容易失步甚至反转。用霍尔传感器吧,精度不够;用编码器吧,成本上去了。后来接触到脉冲注入法,发现它不需要额外硬件,纯软件就能搞定。

脉冲注入法的几个典型应用场景:

  • 初始位置检测:电机静止时,确定转子d轴方向
  • 低速无传感器控制:反电动势太弱,无法用观测器
  • 电角度偏差离线校正:标定传感器安装偏差

这里要特别说明一下:脉冲注入法属于离线校正方法,它不依赖电机模型参数,鲁棒性比磁链观测法强不少。但代价是需要额外的注入时间,不适合在线实时运行。

4.2 原理:高频脉冲如何"看见"转子位置

我们先从数学上理解一下。永磁同步电机的定子电感矩阵,在静止坐标系下可以写成:

L(θ) = L₀ + L₂·cos(2θ)    L₂·sin(2θ)
       L₂·sin(2θ)    L₀ - L₂·cos(2θ)

其中L₀是平均电感,L₂是电感波动幅值,θ是转子电角度。你看,电感值随2θ变化——这就是凸极效应。

当我们施加一个电压脉冲时,电流变化率di/dt = u/L。电感大的方向,电流上升慢;电感小的方向,电流上升快。通过比较不同方向上的电流响应,就能判断出转子位置。

我的经验: 实际项目中,我通常选择在αβ坐标系下施加6个或12个方向的电压矢量。方向越多,位置分辨率越高,但检测时间也越长。6方向一般够用,精度大约在±15°电角度以内。

4.3 算法流程:一步一步来

下面是我在实际项目中验证过的脉冲注入流程,一共6步:

  1. 施加预定位脉冲:先给一个固定方向的电压矢量,把转子拉到已知位置。这一步不是必须的,但能提高后续检测的一致性。
  2. 注入检测脉冲序列:依次在N个方向(通常N=6或12)上施加等宽等幅的电压脉冲。每个脉冲持续约0.5~2ms。
  3. 采样电流响应:在每个脉冲结束时,采样相电流值。注意要在脉冲结束前采样,避开开关噪声。
  4. 计算电流幅值:对每个方向的电流响应求幅值或峰值。我习惯用电流矢量的模长。
  5. 拟合位置曲线:将电流幅值按角度绘制,找到最大值对应的方向——那就是d轴方向。
  6. 计算偏差:将检测到的d轴方向与传感器读数对比,得到电角度偏差。

嗯,这里要注意:步骤5中找最大值时,如果只有6个点,直接取最大值精度有限。我建议用二次插值或正弦拟合,能把精度提升到±3°以内。

4.4 参数选择:这些坑我踩过

参数选不好,脉冲注入法效果会大打折扣。我把关键参数整理成了一张表:

参数 推荐范围 选大/选小的影响 我的建议
脉冲电压幅值 10%~30% 母线电压 太大→电流过冲、噪声;太小→信噪比低 先试20%,看电流响应再调
脉冲宽度 0.5ms ~ 2ms 太宽→转子可能转动;太窄→电流未建立 1ms是个不错的起点
脉冲方向数 6 或 12 6方向够用,12方向精度更高 量产用6方向,标定用12方向
脉冲间隔 2ms ~ 5ms 太短→电流未衰减;太长→浪费时间 等电流衰减到5%以下再发下一个
采样时刻 脉冲结束前100μs 太早→电流未稳定;太晚→开关噪声 用ADC触发同步采样

曾经踩过的坑: 有一次我把脉冲宽度设成了5ms,结果电机在脉冲期间转了将近10°机械角度。检测出来的位置偏差完全不准。后来我加了一条规则:脉冲宽度必须保证转子转动角度小于0.5°机械角度。

4.5 代码实现:核心逻辑

下面是一个简化的脉冲注入检测函数。实际项目中还要加滤波、保护逻辑,但核心思路都在这里了:

// 脉冲注入法检测转子位置
// 输入:脉冲方向数N,脉冲宽度T_pulse_us,脉冲占空比duty
// 输出:检测到的电角度theta_est

float pulse_injection_detect(int N, int T_pulse_us, float duty) {
    float I_max = 0;
    float theta_max = 0;
    float I_samples[N];
    
    for (int i = 0; i < N; i++) {
        // 1. 计算当前脉冲方向角度
        float theta_pulse = (float)i / N * 2 * PI;
        
        // 2. 施加电压矢量(SVPWM实现)
        svpwm_set_voltage(theta_pulse, duty * Vbus);
        
        // 3. 等待电流建立
        delay_us(T_pulse_us - 100);
        
        // 4. 采样电流
        float Ia = get_phase_current_A();
        float Ib = get_phase_current_B();
        float Ic = -(Ia + Ib);
        
        // 5. 计算电流矢量幅值
        float I_alpha = Ia;
        float I_beta = (Ib - Ic) / SQRT3;
        float I_mag = sqrt(I_alpha*I_alpha + I_beta*I_beta);
        I_samples[i] = I_mag;
        
        // 6. 零矢量续流,等待电流衰减
        svpwm_set_zero_vector();
        delay_us(3000);  // 等待电流衰减
        
        // 7. 记录最大值
        if (I_mag > I_max) {
            I_max = I_mag;
            theta_max = theta_pulse;
        }
    }
    
    // 二次插值提高精度
    float theta_fine = quadratic_interpolation(I_samples, N, theta_max);
    
    return theta_fine;
}

个人习惯: 代码里我用了二次插值函数,它利用最大值点及其左右两个点的电流值,拟合出一条抛物线,取顶点位置。这样即使只有6个方向,也能把精度做到±3°以内。具体插值公式网上有现成的,我就不展开了。

4.6 脉冲注入法的知识体系

我把这一章的核心逻辑画成了流程图,方便你理解整体脉络:

脉冲注入法知识体系 物理基础:凸极效应 + 电感随位置变化 核心原理:高频脉冲 → 电流响应 → 电感差异 → 位置解算 分支一:初始位置检测 分支二:电角度偏差校正 实现步骤 ① 预定位 → ② 注入脉冲序列 ③ 采样电流 → ④ 拟合位置 关键参数 脉冲幅值 / 宽度 / 方向数 采样时刻 / 间隔时间 输出:电角度偏差值 Δθ

4.7 实际项目中的注意事项

最后,我结合自己的项目经验,总结几个容易出问题的地方:

  • 电流采样噪声:脉冲注入时电流变化很快,采样时刻稍微偏差一点,结果就差很多。我建议用差分采样,并在ADC前端加RC滤波,截止频率设在10kHz左右。
  • 转子微动问题:如果脉冲幅值太大或宽度太长,转子会轻微转动。检测完成后,转子位置已经变了。解决办法是限制脉冲能量,或者检测完成后重新定位。
  • 饱和效应:大电流注入会导致磁路饱和,电感变化规律偏离理想模型。我一般把电流控制在额定电流的30%以内,避开饱和区。
  • 多脉冲平均:单次脉冲检测受噪声影响大。我习惯在每个方向重复3~5次,取平均值,信噪比能提升不少。

一句话总结: 脉冲注入法离线校正,就是用高频脉冲"扫描"电感分布,找到d轴方向。参数调好了,精度能做到±3°电角度以内,足够满足大多数工程需求。