4、编码器与换相对齐:零位校准、电角度对齐、换相表生成与验证

好,咱们进入第四章。这一章是编码器换相里最核心、也最容易出问题的一环。

说白了,就是让编码器告诉控制器:「电机转子现在在哪个位置,该给哪一相通电了。」

如果这一步没对齐,电机要么抖得像筛子,要么直接堵转,甚至烧驱动。我在项目里见过太多次了。

4.1 零位校准:找到那个「绝对零点」

零位校准,就是找到编码器的物理零点。这个零点对应电机转子的一个固定位置。

我习惯把零位校准分成两步走:

  1. 硬件找零:手动转动电机,找到编码器输出的 Z 信号(索引脉冲)位置。
  2. 软件锁零:在控制器里把这个 Z 信号位置记录为角度 0。

嗯,这里要注意:增量式编码器每次上电后的位置都是随机的,必须通过 Z 信号来「归零」。绝对式编码器虽然上电就有位置,但它的零点也需要和电机转子对齐。

我的习惯:上电后先让电机低速转一圈,捕获 Z 信号,然后锁存当前计数值作为零位偏移。这样后续的位置计算就有了基准。

4.2 电角度对齐:编码器角度与反电动势的「握手」

电角度对齐,是编码器换相里最微妙的一步。为什么?因为编码器测量的是机械角度,而电机换相需要的是电角度。

对于一对极的电机,机械角度等于电角度。但对于多对极电机,电角度 = 机械角度 × 极对数。而且,电角度的零点必须与反电动势的过零点对齐。

我常用的对齐方法有两种:

方法 原理 适用场景 精度
直流注入法 给某相通直流电,让转子锁死在一个已知位置 调试阶段、无负载 中等
反电动势观测法 拖动电机旋转,观测反电动势过零点 量产阶段、带负载 高

直流注入法最简单。给 A 相通正电,B、C 相通负电,转子会锁死在电角度 0° 的位置。这时候把编码器角度清零,就完成了对齐。

但我在项目里发现一个问题:如果电机有齿槽转矩,锁死位置会有偏差。所以后来我改用反电动势法,精度更高。

关键点:电角度对齐的误差不能超过 ±5°(电角度)。超过这个范围,电机的转矩输出会明显下降,噪音也会变大。

4.3 换相表生成:从角度到开关序列的映射

换相表,本质上是一个查找表。输入是电角度,输出是六个开关管的通断状态。

对于方波驱动(六步换相),换相表很简单:每 60° 电角度切换一次。但对于 FOC(磁场定向控制),换相表其实是连续的,通过 SVPWM 实时计算。

我以六步换相为例,给你看看典型的换相表:

电角度范围 导通开关管 相电压状态
0° ~ 60° Q1, Q4 A+ B-
60° ~ 120° Q1, Q6 A+ C-
120° ~ 180° Q3, Q6 B+ C-
180° ~ 240° Q3, Q2 B+ A-
240° ~ 300° Q5, Q2 C+ A-
300° ~ 360° Q5, Q4 C+ B-

生成换相表时,我习惯用枚举类型,而不是直接写死数值。这样代码可读性更好,也方便后期修改。

// 换相表枚举定义
typedef enum {
    STEP_0_60   = 0b001001,  // Q1, Q4
    STEP_60_120 = 0b001100,  // Q1, Q6
    STEP_120_180= 0b010100,  // Q3, Q6
    STEP_180_240= 0b010010,  // Q3, Q2
    STEP_240_300= 0b100010,  // Q5, Q2
    STEP_300_360= 0b100001   // Q5, Q4
} CommutationStep_t;

// 根据电角度查表
CommutationStep_t GetCommutationStep(float elecAngle) {
    uint8_t index = (uint8_t)(elecAngle / 60.0f);
    const CommutationStep_t table[6] = {
        STEP_0_60, STEP_60_120, STEP_120_180,
        STEP_180_240, STEP_240_300, STEP_300_360
    };
    return table[index % 6];
}
我曾经踩过的坑:换相表的顺序必须与电机绕线方式匹配。有一次我拿了一个三角形接法的电机,用了星形接法的换相表,结果电机反转且电流巨大。后来花了半天才排查出来。

4.4 换相表验证:不转起来,你怎么知道对不对?

换相表生成后,必须验证。我一般做三步验证:

  • 静态验证:手动转动电机,用示波器看相电压波形。正常应该是六个清晰的台阶。
  • 动态验证:给一个开环速度指令,看电机是否平稳旋转。如果抖动或异响,说明换相时序有问题。
  • 负载验证:带负载运行,看电流波形是否正弦(对于 FOC)或梯形(对于方波)。

这里我分享一个实用技巧:在验证阶段,把换相表输出和编码器角度同时打印出来。用串口或者 DAC 输出,可以直观看到角度和换相状态的对应关系。

我的调试口诀:「一转二听三看波」。一转(手动转电机),二听(听有没有异响),三看波(示波器看相电压)。这三步走完,换相表基本就稳了。

4.5 核心流程:零位校准 → 电角度对齐 → 换相表生成 → 验证

为了让你更直观地理解整个流程,我画了一张图。这张图把四个步骤串起来,每一步的输入输出都标清楚了。

编码器换相对齐核心流程 编码器换相对齐核心流程 步骤1:零位校准 捕获Z信号,锁存零位 步骤2:电角度对齐 直流注入或反电动势法 步骤3:换相表生成 角度→开关序列映射 步骤4:换相表验证 静态/动态/负载验证 验证失败,回退调整 输出:对齐的换相表 可直接用于位置环控制 ⚠️ 关键注意事项 • 电角度对齐误差 ≤ ±5° • 换相表顺序必须与电机绕线方式匹配 • 验证时先空载,再带载

这张图里,我特意画了一条反馈回路。为什么?因为验证失败是常态。我做过一个项目,前三次验证都失败了,最后发现是编码器安装有偏心,导致角度读数不准。所以,验证不是终点,而是迭代的起点。

4.6 实战避坑指南

最后,我总结几个实战中容易踩的坑:

  • 编码器安装偏心:会导致角度周期性误差。解决办法是提高安装精度,或者在软件里做偏心补偿。
  • Z 信号抖动:如果 Z 信号有毛刺,零位会漂移。我习惯在捕获 Z 信号后加一个 10μs 的软件去抖。
  • 极对数设置错误:电角度 = 机械角度 × 极对数。如果极对数设错了,换相时序会完全乱掉。
  • 换相表与驱动板不匹配:不同驱动板的开关管排列可能不同。换相表必须与硬件一一对应。
我曾经犯过的错:有一次我忘了在换相表里处理角度溢出。当电角度从 359° 变到 0° 时,换相表直接跳到了错误的状态,电机瞬间抖动了一下。后来我加了一个角度归一化函数,问题就解决了。

好了,这一章的内容就到这里。零位校准、电角度对齐、换相表生成与验证,这四个步骤环环相扣。只要每一步都做到位,编码器换相这块就稳了。