首页 / 驱动算法 / 高级篇

无感六脉冲定位方法

无感 FOC 启动前,转子位置完全未知——如果直接强拖,可能拖不动、拖反甚至失步。六脉冲定位(Six-Pulse Alignment)是工业界最常用的转子初始位置预定位方法:向定子注入六个固定方向的短时电压脉冲,利用磁饱和效应比较电流响应峰值,判定转子磁极轴线所在的 60° 扇区,再用正反脉冲判别 N/S 极。本文讲解定位原理、扇区划分、工程参数,配交互式定位仿真器。

1. 无感启动为什么先要"定位"?

无感 FOC 的完整启动序列通常是:初始定位 → 强拖升速 → 切换闭环。上一篇文章《无感强拖过程负载角度分析》讲了强拖,而强拖有一个前提:要么转子已经被拉到已知位置,要么至少知道它大致在哪

如果完全不知道转子位置就强行拖:

因此无感启动的第一道工序,就是用一个不依赖反电动势的机制把转子位置"测"出来。六脉冲定位就是其中成本最低、最鲁棒的一种。

💡 初始定位的三类主流方法
方法原理特点
对齐法(直流注入)注入固定 d 轴电流把转子"吸"到已知角度简单,但会转动、耗时,带载时可能拉不到位
六脉冲定位6 个短脉冲比较电流响应,利用磁饱和判方向不转动(近零速)、几十 ms 完成、抗负载能力好,本文主角
高频注入注入高频载波,解调凸极位置精度最高、无噪声,但实现复杂、依赖 Ld≠Lq

2. 物理基础:磁饱和效应

六脉冲定位不依赖反电动势,也不依赖转子转动,它利用的是磁路的饱和非线性。定子绕组电感不是常数,而是随"脉冲磁场方向与转子磁极方向的关系"变化:

对同一电压幅值 U、同一脉宽 tp 的短脉冲,电流峰值近似为 ipeak ≈ U·tp/L:电感越小,电流峰值越大。因此"哪个方向脉冲电流最大",就说明哪个方向最接近转子 N 极轴线。

脉冲电流响应(磁饱和模型)

ipeakp) = I0·[ 1 + k·cos(θp − θr) ]

θp:脉冲电压矢量电角度;θr:转子 N 极电角度;k:磁饱和系数(0.1~0.5,随磁路饱和程度增大);I0:基准电流

注意:ipeak 对 θr 是 cos 函数而非 cos²——这意味着同向电流大、反向电流小,天然具备 N/S 判别能力。这是它与"高频注入测凸极(cos² 对称)"的本质区别:六脉冲不需要额外步骤就能区分磁极极性。

3. 定位流程:六脉冲粗定位 → N/S 判别

完整定位分两步:

第一步:粗定位——六个方向的脉冲电压矢量

脉冲方向(电角度):0°、60°、120°、180°、240°、300°
对应电压矢量:U1(100)、U2(110)、U3(010)、U4(011)、U5(001)、U6(101)

依次向六个方向施加相同的短脉冲(幅值 Upulse、脉宽 tp),采样每个脉冲的电流峰值,得到 i1…i6。电流最大的脉冲方向 θmax 最接近转子 N 极——转子磁极轴线就落在 θmax±30° 的 60° 扇区内。这就是"六脉冲"名字的由来:六个方向刚好把 360° 电角度等分成六个 60° 扇区。

第二步:N/S 判别——同向与反向脉冲对比

ifwd = ipeakmax)    ibwd = ipeakmax+180°)
ifwd > ibwd → N 极在 θmax 方向;否则在 θmax+180° 方向

原理:磁饱和使同向脉冲电流更大。若需要更高精度(如 <5°),可在判定的方向附近再注入更细密的小幅脉冲做细分扫描(例如 ±30° 内每 5° 一个脉冲,找响应峰值)。

4. 扇区划分与定位结果

响应最大方向 θmax 对应电压矢量 转子磁极轴线所在扇区
U1 (100)−30° ~ +30°
60°U2 (110)30° ~ 90°
120°U3 (010)90° ~ 150°
180°U4 (011)150° ~ 210°
240°U5 (001)210° ~ 270°
300°U6 (101)270° ~ 330°

粗定位误差 ≤ ±30° 电角度。对无感启动而言,±30° 的初始误差完全可接受——后续强拖时负载角从这个小误差起步,转矩立即建立,电机平稳转起来;切闭环后观测器会快速收敛到真实角度。如果应用对启动方向有严格要求(如防止反转),再加 N/S 判别与细分。

5. 工程参数与实现要点

参数 推荐取值 说明
脉冲幅值 Upulse 0.2 ~ 0.6 × Udc 太小则响应差异淹没在噪声里;太大会使转子产生可见转动(脉冲宽度内转子移动超过数度)
脉宽 tp 0.2 ~ 2 ms 短到转子来不及显著转动(近零速定位),长到电流稳定可采样;与电气时间常数 L/R 同量级
电流采样时刻 脉冲末端 峰值电流在脉冲末尾达到最大;需避开开关噪声(采样窗口放脉冲中后段)
脉冲间隔 ≥ 3~5 倍电气时间常数 让电流衰减回零再发下一个脉冲,避免相互叠加
限流保护 软件限流 ≤ 额定电流 1.5 倍 六脉冲本质是"短时直通",必须硬件/软件双重限流防烧功率管
总耗时 20 ~ 60 ms 6~8 个脉冲 × (脉宽+衰减),远快于对齐法的百毫秒级

6. 六脉冲 vs 高频注入 vs 对齐法

维度 六脉冲定位 高频注入 直流对齐法
转子是否转动几乎不转不转转动并对齐
定位耗时20~60 ms10~50 ms100 ms+
实现复杂度(6 个脉冲 + 峰值比较)高(载波注入/解调)
抗负载能力(不依赖转动)弱(重载拉不到位)
精度±30°(细分后可 ±5°)±1°~5°取决于对齐是否到位
对电机要求需磁饱和效应(通用)需凸极 Ld≠Lq通用
典型用途无感启动前定位低速/零速闭环观测简单场合

7. 交互式仿真器:六脉冲定位过程演示

下面这个仿真器演示完整定位过程。拖动滑块设定转子的真实 N 极角度,点击"开始定位":仿真器依次向 0°~300° 六个方向注入脉冲(左侧画布高亮当前脉冲方向,右侧柱状图实时显示电流响应),然后自动做 N/S 判别,最终输出定位结果并与真实角度对比误差。你也可以调节磁饱和系数 k,观察响应差异大小对定位成功率的影响。

六脉冲定位仿真:电流响应比较与 N/S 判别
设定 θr=123°,点击"开始定位"开始演示

仿真器观察要点:

8. C 代码骨架:六脉冲定位核心逻辑

💡 代码结构(伪代码骨架,适配你的控制框架)

核心流程:六个方向 → 发脉冲采样峰值 → 找最大值 → 正反脉冲判 N/S → 输出角度。

// 六脉冲定位:返回转子 N 极电角度(0~360°)
// 依赖:SetPulseVector(deg, width_ms) 施加指定方向电压脉冲;GetPeakCurrent() 读脉冲电流峰值
static float SixPulseAlign(void)
{
    const int    N = 6;
    const float  STEP = 60.0f;              // 脉冲方向步进 60°
    const uint16_t PULSE_US = 800;          // 脉宽 0.8ms
    float ipeak[N];
    float iMax = 0.0f;
    int   iBest = 0;

    // 1) 粗定位:六个方向脉冲,找电流峰值最大的方向
    for (int i = 0; i < N; i++) {
        float theta = (float)i * STEP;      // 0,60,120,180,240,300°
        SetPulseVector(theta, PULSE_US);
        ipeak[i] = GetPeakCurrent();
        if (ipeak[i] > iMax) { iMax = ipeak[i]; iBest = i; }
        WaitCurrentDecay();                 // 等待电流衰减回零
    }
    float thetaMax = (float)iBest * STEP;   // 磁极轴线所在 60° 扇区中心

    // 2) N/S 判别:同向 vs 反向脉冲,电流大的方向为 N 极
    SetPulseVector(thetaMax, PULSE_US);
    float iFwd = GetPeakCurrent();
    WaitCurrentDecay();
    SetPulseVector(thetaMax + 180.0f, PULSE_US);
    float iBwd = GetPeakCurrent();
    WaitCurrentDecay();

    float thetaN = (iFwd > iBwd) ? thetaMax : thetaMax + 180.0f;
    if (thetaN >= 360.0f) thetaN -= 360.0f;
    return thetaN;                          // 转子 N 极电角度(误差 ≤ ±30°)
}

// 可选:细分扫描,把误差从 ±30° 缩小到 ±5°
static float SixPulseAlignFine(float thetaCoarse, float k)
{
    const float RANGE = 30.0f, GRID = 5.0f;
    float thetaBest = thetaCoarse, iBest = 0.0f;
    for (float d = -RANGE; d <= RANGE; d += GRID) {
        float theta = thetaCoarse + d;
        SetPulseVector(theta, 400);         // 更小的脉宽,避免转动
        float i = GetPeakCurrent();
        WaitCurrentDecay();
        if (i > iBest) { iBest = i; thetaBest = theta; }
    }
    return thetaBest;
}

小结:六脉冲定位利用磁饱和效应,用 6 个短时电压脉冲比较电流响应峰值,先锁定转子磁极轴线所在的 60° 扇区,再通过正反脉冲判别 N/S 极,总耗时几十毫秒、转子几乎不转、抗负载能力强,是无感启动最实用的预定位方案。配合上一篇《无感强拖过程负载角度分析》,即可完整覆盖"定位 → 强拖 → 切闭环"的无感启动链路。