2. 增量式编码器原理:A/B/Z信号解析、正交信号与相位差、脉冲计数与方向判断
增量式编码器,说白了就是一把「电子尺」。它不告诉你绝对位置,只告诉你「动了多少」和「往哪动」。我刚开始接触这玩意儿时,总觉得它不如绝对式编码器高级。后来做项目多了才发现,增量式在很多场景下才是真香——成本低、响应快、结构简单。
这一节,咱们就把A/B/Z信号、正交信号、脉冲计数和方向判断这些核心概念,一个一个掰开揉碎了讲清楚。
2.1 A/B/Z信号:三根线的故事
增量式编码器通常输出三路信号:A相、B相、Z相。嗯,就这三根线,承载了所有位置信息。
- A相和B相:这是正交信号,相位差90°。它们负责提供位置增量和方向信息。
- Z相:也叫零位信号或索引信号。每转一圈,Z相输出一个脉冲。用于绝对位置的参考点校准。
我在一个伺服电机项目里遇到过一个问题:电机上电后,位置总是对不齐。后来发现是Z相脉冲没用好。每次上电后,让电机先找一次Z相,位置就准了。这个习惯我一直保留到现在。
核心要点:A/B相负责「增量」,Z相负责「归零」。两者配合,才能实现可靠的绝对位置测量。
2.2 正交信号与相位差:为什么是90°?
正交信号,就是两路频率相同、相位相差90°的方波。你想想看,为什么非得是90°?
因为90°相位差,能让我们同时判断方向和实现四倍频细分。如果相位差是0°或180°,那两路信号就完全同步或完全反向,啥也判断不出来。
举个例子:
- A相上升沿时,B相是高电平 → 正转
- A相上升沿时,B相是低电平 → 反转
就这么简单。我当年第一次用示波器看A/B信号时,盯着那两条错开的方波看了半天,才恍然大悟——原来方向判断就藏在这90°里。
个人经验:实际项目中,A/B信号的占空比不一定是完美的50%。我遇到过占空比偏差到40%的编码器,照样能用,只是细分精度会受影响。选型时别太纠结这个参数。
2.3 脉冲计数与方向判断:怎么算位置?
脉冲计数,就是数A相或B相的上升沿和下降沿。每检测到一个边沿,位置值就加1或减1。
方向判断的逻辑是这样的:
- 如果A相领先B相90° → 正转,计数器加1
- 如果B相领先A相90° → 反转,计数器减1
代码实现起来也很直接。我贴一段我常用的伪代码,你们感受一下:
// 增量式编码器位置采集(伪代码)
int position = 0;
int last_A = 0, last_B = 0;
void encoder_interrupt() {
int A = read_pin(A_PIN);
int B = read_pin(B_PIN);
if (A != last_A) { // A相变化
if (A == HIGH) {
if (B == LOW) position++; // 正转
else position--; // 反转
} else {
if (B == HIGH) position++; // 正转
else position--; // 反转
}
}
last_A = A;
last_B = B;
}
这段代码的核心逻辑就是:在A相边沿触发时,检查B相的电平状态。B相电平决定了方向。我曾经在一个项目中,因为没处理好B相的抖动,导致方向误判。后来加了20ms的去抖延时,问题就解决了。
避坑指南:我曾经在高速脉冲(超过10kHz)场景下,直接用软件轮询读取A/B信号,结果丢脉冲丢得一塌糊涂。后来改用硬件中断+定时器捕获,才搞定。记住:高速场景,硬件方案是王道。
2.4 四倍频细分:让精度翻四倍
四倍频,就是同时检测A相和B相的上升沿和下降沿。每个完整的脉冲周期,原本只能计1个数,现在能计4个数。
举个例子:
- 编码器物理分辨率:1000脉冲/转
- 四倍频后:4000计数/转
- 角度分辨率:360°/4000 = 0.09°
嗯,精度直接翻四倍。我在做机器人关节位置反馈时,就靠这个四倍频,把编码器的分辨率从0.36°提升到了0.09°,效果立竿见影。
四倍频的实现逻辑:
// 四倍频计数逻辑
void quadrature_decode() {
int A = read_pin(A_PIN);
int B = read_pin(B_PIN);
int state = (A << 1) | B; // 组合成2位状态
// 状态转移表:前一个状态 -> 当前状态 -> 方向
// 正转:00->01->11->10->00
// 反转:00->10->11->01->00
int direction = direction_table[last_state][state];
position += direction;
last_state = state;
}
这里用了一个状态转移表,比if-else判断要高效得多。我建议你们在实际项目中也用查表法,代码简洁,执行也快。
2.5 Z相信号:归零与参考点
Z相信号,每转一圈输出一个脉冲。它的作用有两个:
- 归零校准:每次检测到Z相脉冲,将位置计数器清零或设为预设值
- 消除累积误差:增量式编码器没有绝对位置记忆,Z相提供了每圈的绝对参考点
我记得有一次,一个客户反馈说他们的设备运行几个小时后就偏位了。排查下来,就是没做Z相归零。累积误差一点点变大,最后偏得离谱。加上Z相归零后,问题就再没出现过。
实用建议:在系统初始化时,让电机先低速转一圈,找到Z相脉冲,完成位置校准。之后每转一圈,用Z相脉冲修正一次位置。这样能保证长期运行的精度。
2.6 知识体系总览
下面这张图,把增量式编码器的核心逻辑串起来了。你们可以对照着看,理解会更清晰。
从这张图可以看出来,增量式编码器的工作流程其实很清晰:编码器输出A/B/Z信号 → 正交信号解析出方向 → 脉冲计数得到增量位置 → Z相提供每圈归零。每一步都环环相扣。
我的建议:刚开始学的时候,别急着上硬件。先用示波器看A/B/Z信号的波形,理解它们的时序关系。我当年就是这么干的,看懂了波形,后面的代码实现就水到渠成了。