3、增量式编码器详解:A/B相正交信号、Z相零位信号、倍频技术(1x、2x、4x)、方向判断

增量式编码器,说白了就是编码器家族里的「老实人」。它不告诉你绝对位置,只告诉你「动了多少」和「往哪动」。我最早接触它是在一个伺服电机项目里,当时觉得这东西简单,结果一上手才发现,里面的门道还真不少。

今天咱们就把增量式编码器彻底聊透。从最基础的A/B相正交信号,到Z相零位,再到倍频技术和方向判断,我一个一个给你拆开讲。

3.1 A/B相正交信号:编码器的「心跳」

增量式编码器最核心的输出,就是两路方波信号——A相和B相。这两路信号相位差正好90度,所以叫「正交信号」。

你想想看,为什么非要搞两路信号?一路不行吗?

嗯,这里要注意:一路信号只能测速度,测不了方向。两路信号一配合,方向就出来了。具体怎么判断?看A相和B相的先后顺序。

  • A相领先B相90度:编码器正转(顺时针)
  • B相领先A相90度:编码器反转(逆时针)

我在项目中遇到过一个问题:信号线太长,导致A/B相边沿抖动,方向判断偶尔出错。后来加了施密特触发器整形,问题就解决了。所以信号质量真的很重要。

关键参数:每转脉冲数(PPR)。比如一个1000 PPR的编码器,转一圈输出1000个A相脉冲和1000个B相脉冲。注意,是每相1000个,不是两相加起来1000个。

3.2 Z相零位信号:回家的「灯塔」

增量式编码器有个天生的缺点——掉电后位置丢失。你重新上电,不知道轴在哪儿。这时候Z相就派上用场了。

Z相信号,也叫零位信号或索引信号。编码器每转一圈,在固定的机械位置输出一个脉冲。这个脉冲很窄,通常只有1/4个A相周期那么宽。

我习惯的做法是:系统上电后,先让电机低速转一圈,找到Z相脉冲,把这个位置设为机械原点。这样后面的位置计算就有了基准。

小技巧:Z相脉冲的宽度和A/B相有关。有些编码器的Z相是「高电平有效」,有些是「低电平有效」。选型时一定要看数据手册,别搞反了。

3.3 倍频技术:1x、2x、4x 到底怎么选?

倍频技术,说白了就是「一个脉冲当多个用」。你想想看,如果编码器只有1000 PPR,转一圈只能测1000个位置,分辨率太低了。怎么办?用倍频。

常见的倍频方式有三种:

倍频方式 原理 分辨率提升 适用场景
1x(单倍频) 只检测A相上升沿 1倍 低速、对分辨率要求不高
2x(双倍频) 检测A相上升沿和下降沿 2倍 中速、需要一定精度
4x(四倍频) 检测A相和B相的上升沿和下降沿 4倍 高速、高精度定位

举个例子:一个1000 PPR的编码器,用4倍频后,分辨率变成4000线/圈。也就是说,转一圈能测4000个位置。精度直接翻了4倍。

我曾经在一个贴片机项目里用过4倍频。当时要求定位精度0.01mm,编码器本身只有500 PPR,4倍频后变成2000线/圈,配合丝杠螺距5mm,刚好满足要求。嗯,这个方案我到现在还在用。

注意:倍频不是越高越好。4倍频虽然分辨率高,但脉冲频率也高了4倍。如果MCU的定时器捕获频率跟不上,反而会丢脉冲。我见过有人用4倍频跑高速,结果计数器溢出,位置全乱了。

3.4 方向判断:硬件还是软件?

方向判断有两种做法:硬件判断和软件判断。

硬件判断:用D触发器或专用解码芯片(比如LS7083、HCTL-2020)。A相接时钟端,B接数据端。正转时输出高电平,反转时输出低电平。简单粗暴,适合对实时性要求高的场合。

软件判断:在MCU中断里读取A/B相状态。我习惯用状态机法——记录上一次的A/B相状态,和当前状态对比,查表得出方向。

下面是我常用的方向判断代码(伪代码):

// 状态表:上一次状态 + 当前状态 = 方向
// 状态编码:00=A低B低, 01=A低B高, 10=A高B低, 11=A高B高
const int8_t dir_table[4][4] = {
    // 上一次状态: 00  01  10  11
    /*当前00*/ { 0,  1, -1,  0},
    /*当前01*/ {-1,  0,  0,  1},
    /*当前10*/ { 1,  0,  0, -1},
    /*当前11*/ { 0, -1,  1,  0}
};

// 在A相或B相中断中调用
void encoder_isr(void) {
    uint8_t curr_state = (GPIO_ReadPin(A_PIN) << 1) | GPIO_ReadPin(B_PIN);
    int8_t dir = dir_table[prev_state][curr_state];
    if (dir == 1) position++;
    else if (dir == -1) position--;
    prev_state = curr_state;
}

这段代码我用了好多年,从来没出过问题。核心思想就是:状态变化必须合法,非法变化(比如从00直接跳到11)说明有干扰,直接忽略。

避坑指南:我曾经在电机启停瞬间遇到过方向误判。原因是电机振动导致A/B相边沿抖动。后来我在中断里加了20μs的去抖延时,问题就解决了。记住,编码器信号一定要做硬件滤波或软件去抖。

3.5 知识体系总览

下面这张图把增量式编码器的核心知识点串起来了。你可以把它当作一个快速参考。

增量式编码器知识体系 增量式编码器 A/B相正交信号 相位差90°,判断方向 Z相零位信号 每圈一个,定位原点 倍频技术 1x / 2x / 4x 方向判断 硬件/软件实现 PPR参数 信号整形 机械原点校准 分辨率提升 频率上限 硬件解码(D触发器) 软件解码(状态机) 选型要点:PPR、倍频方式、信号电平、响应频率

这张图把增量式编码器的四个核心知识点——A/B相、Z相、倍频、方向判断——以及它们之间的关系都画出来了。你可以看到,倍频技术直接影响分辨率,而方向判断又依赖于A/B相的正交特性。Z相则是一个独立的「锚点」,用来校准位置。

好了,增量式编码器的核心内容就这些。记住一句话:选型看PPR和倍频,调试看信号质量,方向判断看状态机。把这三点吃透了,增量式编码器你就玩转了。