2、增量式编码器核心原理:A/B/Z三相信号解析,相位差与方向判断,零位脉冲的作用
增量式编码器,说白了就是个“计数器”。它不告诉你绝对位置,只告诉你“动了多少”和“往哪动”。我刚开始接触这玩意儿时,总觉得它不如绝对式编码器“聪明”。但后来发现,在大多数运动控制场景里,增量式才是性价比之王。
今天咱们就把它最核心的三根线——A、B、Z——彻底讲透。
2.1 A/B两相信号:位置与方向的“密码”
先看A和B。这两根线输出的是方波脉冲,频率代表转速,脉冲数代表位移。但关键是它们的相位关系。
我习惯把A相看作“主时钟”,B相是“移相90°的副本”。你想想看,如果电机正转,A相上升沿时,B相是高电平;反转时,A相上升沿时,B相是低电平。就这么简单。
核心判断逻辑:
- 正转:A相领先B相90°(A上升沿 → B为高)
- 反转:B相领先A相90°(A上升沿 → B为低)
我在项目中遇到过一个问题:电机抖动时,A/B信号会在临界区反复跳变,导致方向误判。后来加了硬件滤波和软件去抖,才算稳住。
2.2 方向判断的两种常用方法
实际写代码时,判断方向有两种主流做法。我个人偏爱第一种,因为代码更直观。
方法一:边沿触发法(推荐)
每次检测A相的上升沿,然后读B相的电平。高电平为正转,低电平为反转。
// 伪代码示例
void encoder_irq_a_rising(void) {
if (read_pin(B) == HIGH) {
position++; // 正转
} else {
position--; // 反转
}
}
方法二:状态机法
同时检测A和B的四个边沿(上升沿+下降沿),用查表法确定方向。精度更高,但代码量稍大。
我的建议:如果只是普通电机控制,方法一完全够用。如果是伺服或高精度定位,建议用状态机法,能捕捉到更细微的抖动。
2.3 零位脉冲Z:回家的“灯塔”
Z相信号,每转一圈只输出一个脉冲。它的作用就是“归零”。
你想想看,增量式编码器断电后,位置值就丢了。重新上电时,你只知道“当前位置”,但不知道“这是第几圈”。Z相就是用来校准这个的。
我曾经做过一个龙门铣床项目,两个轴各有一个增量式编码器。每次开机后,必须让两个轴都找到Z相脉冲,才能开始加工。否则,两个轴的零点对不上,铣出来的零件就是歪的。
注意:Z相脉冲通常很窄(几微秒到几十微秒),如果MCU中断响应不及时,很容易漏掉。我建议用硬件捕获或DMA来读取Z相,别用普通GPIO中断。
2.4 三相信号的时序关系图
下面这张图,是我用SVG画的,把A/B/Z三者的时序关系展示得清清楚楚。正转时A领先B,反转时B领先A,Z在固定位置出现一个窄脉冲。
2.5 实际项目中的避坑指南
讲完原理,咱们聊聊实战中容易踩的坑。我踩过不少,说几个典型的。
- 信号毛刺:电机启停时,A/B信号上会有毛刺。我曾经用示波器一看,好家伙,一个上升沿上抖了三四次。解决办法:硬件加RC滤波,软件里做连续采样确认。
- Z相丢失:转速太高时,Z相脉冲太窄,MCU来不及响应。我建议用定时器捕获模式,或者用FPGA/CPLD做硬件解码。
- 方向误判:如果A/B信号线接反了,方向就反了。我习惯在调试阶段先手动转一圈,看看位置值是增加还是减少,不对就交换A/B。
一个小技巧:如果你用的是STM32,它的定时器自带编码器模式。配置好之后,硬件自动处理A/B相位差和方向判断,CPU几乎零负担。我几乎所有项目都这么用。
2.6 总结一下
增量式编码器的核心就三句话:
- A/B相差90°,用来判断方向和计算位移。
- Z相每圈一个脉冲,用来归零和校准。
- 硬件滤波+软件去抖,是稳定工作的前提。
嗯,这些搞清楚了,后面讲位置测量算法时,你就不会觉得乱了。
公众号:蓝海资料掘金营,微信deep3321