编码器接入电脑:从 A/B 脉冲到串口坐标
编码器买回来,一头是几根线,一头是展厅主机。中间差的那一段——把脉冲数成坐标、再把坐标送进电脑——恰恰是滑轨屏项目里最容易”外包给厂家”、出了问题又没人说得清的环节。这篇把这段链路拆开讲。
为什么不能把编码器直接插电脑
常见情形:软件工程师拿到一个增量式编码器,问硬件同事”这个怎么接到电脑上”,得到的回答是”接个 USB 转串口就行”。接上以后,串口里什么也读不到,或者读到一堆乱码。
原因很简单:增量式编码器输出的是 A、B 两路方波脉冲,它不是串口数据,没有起始位、没有字节格式,就是高低电平在不停翻转。电脑的串口、USB 口都是按协议收发数据的,它们不会替你”数脉冲”。所以编码器和电脑之间,一定要有一个计数环节:负责实时盯着 A、B 两相的每一次翻转,累加成计数值,再把计数值按电脑能读的格式发出去。
整条链路可以画成这样:
编码器 → 电平匹配 → 计数器(四倍频) → 通信接口 → 上位机软件
编码器本身怎么选(滚轮、拉线还是测距),见滑轨屏编码器怎么选;本文只管从编码器出线之后的事。
第一段:电平匹配,先把信号接对
编码器的输出类型决定了这一段怎么接。拿欧姆龙 E6B2-C 系列规格书当例子学读法:它的供电范围是 5–24 VDC,输出分两类——
- 集电极开路输出:编码器内部只负责把信号线”拉低”,高电平要靠外部的上拉电阻接到逻辑电平来提供。不接上拉电阻,计数器那边读到的就是悬空信号,时有时无。上拉电阻接到哪个电压,要和计数器能接受的输入电平一致,不能随手接到编码器的电源上就完事——编码器用较高电压供电、计数器输入却只能接受较低电平时,直接上拉到电源会把输入口顶坏。
- 线驱动输出(RS-422A 差分):每一相用两根线传一对相反的信号,接收端看两根线的差值。它抗干扰强,适合长线缆,但规格书写明线驱动版必须用 5 VDC 供电。接收端要用差分接收芯片把它还原成普通逻辑电平,不能只接其中一根线凑合用。
这里只是借这份规格书演示该看哪几栏:供电范围、输出类型、分辨率(P/R)、以及”哪个转向计数增加”。换任何一款编码器,看的都是这几项。器件本身的原理,见旋转编码器图鉴。
线缆怎么走
滑轨屏现场最常见的干扰源,是电动轨道的电机动力线。编码器信号线和电机线同槽敷设,电机一启动计数就乱跳。能做到的几条:
- 编码器信号线用屏蔽线,屏蔽层按一端接地的原则处理;
- 信号线和动力线分槽走,实在要同走拖链,也尽量分开隔离;
- 线长、干扰大时,优先选线驱动差分输出。
如果编码器装在移动的小车上(滚轮编码器就是这样),信号线要跟着屏跑,走拖链时还要考虑弯曲寿命。走线方式对照滑轨屏供电与信号怎么走。
第二段:计数器,把脉冲数成位置
三种常见的计数硬件
| 计数方式 | 大致做法 | 适合的情况 | 要留意的地方 |
|---|---|---|---|
| 单片机 | 用带正交编码接口或外部中断的单片机数脉冲,自己写串口输出 | 集成商有嵌入式开发能力,想完全掌握协议 | 软件轮询太慢会漏计数,要用硬件接口或中断 |
| 专用计数模块 | 市售的编码器计数模块,一般直接输出串口或网口数据 | 不想自己开发硬件 | 协议以厂商手册为准,要问清数据格式和回零接口 |
| PLC 高速计数 | 用 PLC 的高速计数输入口,上位机通过通信读寄存器 | 电动轨道本来就用 PLC 控制 | 上位机读取周期受通信影响,画面跟随可能有延迟 |
无论哪种,核心都是一件事:四倍频计数。
四倍频是怎么数出来的
A、B 两相相位差 1/4 周期,把两相的上升沿和下降沿都拿来计数,每个脉冲周期就能得到 4 个计数。1000 P/R 的编码器,四倍频后每圈 4000 个计数。
实现上最稳的做法是状态表法:把 A、B 两相当前的电平组合看成一个状态(共 4 种),每次任意一相翻转时,用”旧状态”和”新状态”去查一张表,表里直接写着这一步是加一、减一还是无效。下面是示意性的伪代码:
// 示意代码:四倍频状态表法
// 状态 = (A << 1) | B,取值 0~3
// 表下标 = (旧状态 << 2) | 新状态
const int8 TABLE[16] = {
0, +1, -1, 0,
-1, 0, 0, +1,
+1, 0, 0, -1,
0, -1, +1, 0
};
int32 count = 0;
uint8 oldState = 读取AB();
// 在 A 或 B 任一相电平变化时调用(中断或硬件接口)
void onEdge() {
uint8 newState = 读取AB();
count += TABLE[(oldState << 2) | newState];
oldState = newState;
}
表里为 0 的格子有两种含义:状态没变,或者 A、B 同时翻转。后者在正常转动时不该出现,出现了往往说明信号有干扰或者采样太慢漏掉了中间状态——调试时可以专门统计这类”非法跳变”的次数,它是判断信号质量的好指标。
哪个方向算”加”,取决于接线和安装方向。屏往正方向推、计数却在减小,交换 A、B 两相接线或者把整个结果取反即可。
原点开关也接在这里
原点开关最好和编码器接在同一个计数器上:开关动作时,由计数器自己把计数清零,而不是等上位机收到”原点到了”的消息再清。上位机那边有通信延迟,屏在这段时间里已经又走了一截,清零位置就不准了。回零的动作要领,见滑轨定位精度怎么调整。
第三段:通信,把坐标送进电脑
发什么:计数还是坐标
计数器可以直接发原始计数,也可以发换算好的坐标。建议发原始计数,换算放在上位机做:换算系数、分段校正表都在上位机配置里,现场复标时只改配置,不用给单片机重新烧程序。
数据格式怎么定
自己定协议时,几条原则比具体格式更重要:
- 有帧头、有结束符:上位机中途接入时能找到一帧的起点;
- 带校验:长线传输偶尔会出错,错帧直接丢掉;
- 带状态位:比如”是否已回零”、“是否检测到非法跳变”,上位机据此决定显示待机还是正常画面;
- 主动上报还是一问一答:主动按固定周期上报,上位机处理简单;一问一答便于多个设备共用一条总线。滑轨屏只有一个编码器时,主动上报更常见。
一个便于调试的文本格式示意:
$POS,<计数>,<回零标志>,<校验>\r\n
文本格式用串口调试工具就能直接看懂,现场排查方便;二进制格式更紧凑,但调试时得配解析工具。串口参数(波特率、校验位等)两端设成一致即可,具体取值看计数硬件的手册和上报频率的需要。
USB、串口还是网口
- USB 转串口:主机就在屏旁边、线很短时最省事;但 USB 线不适合拉长,也怕热插拔后端口号变化,软件要能按设备识别重新连接。
- RS485:差分传输,适合较长距离,主机那头需要一个 RS485 转换器。
- 网口:计数器本身有网口,或者经串口服务器把串口转成网口。主机可以放在机房,通过交换机拿数据,距离不再是问题。串口服务器一般提供虚拟串口和 TCP 两种用法,上位机软件改动很小。
第四段:上位机,读坐标时别踩的坑
上位机读到计数后,还要做几件事才能驱动画面:
- 单独线程读串口:别在渲染线程里阻塞读取,否则串口一卡画面就卡;
- 按帧解析,校验不过就丢:别把半帧数据当坐标用;
- 判断数据是否中断:一段时间收不到数据,说明线断了或者计数器掉电,画面应停在最后可信位置并记录报警;
- 合理性过滤:相邻两帧坐标差出”屏物理上走不了那么快”的范围,当作干扰丢掉。
上位机按位置播放的三种实现方式,见滑轨屏软件开发;坐标跳动引起的画面反复切换,处理方法见滑轨屏触发区间与防抖。
接好之后的调试步骤
- 断开主机,先测电平:用万用表或示波器看 A、B 两相,手转编码器时能看到高低翻转;集电极开路的,确认上拉后高电平正常。
- 手转一整圈,看计数:四倍频下应该接近 4 × P/R,明显偏少说明漏计数,要查采样方式。
- 正反转各转一圈:计数能回到原值,说明方向判断正确、没有丢步。
- 打开串口工具看原始帧:确认格式、校验和上报频率符合预期。
- 装上轨道推一个来回:坐标方向和墙面方向一致,回到原点时计数回零。
- 开电机再推:电动轨道要在电机运行时再测一遍,排查动力线干扰。
常见问题
能不能用普通的 USB 数据采集卡数脉冲? 要看它有没有硬件计数功能。只能定时采样电平的采集卡,采样跟不上脉冲翻转时就会漏计数,而且判向也不可靠。选之前确认手册里写明支持正交编码或高速计数。
编码器装在移动小车上,信号线太长怎么办? 一种思路是把计数器也装到小车上,就近数脉冲,再用串口或网口把坐标送出去,长线上走的是抗干扰更好的通信信号;另一种是主机随屏移动,只需要给小车供电。两种都要结合供电方案一起考虑。
上位机收到的坐标偶尔跳一下,是编码器坏了吗? 先别换编码器。统计一下计数器里的非法跳变次数,如果和电机启停同步出现,多半是走线干扰;如果只在上位机侧出现,查串口校验和帧解析。编码器真坏的情况,通常是某一相完全没有信号,而不是偶尔跳。
延伸阅读
编码器、拉线、测距三种方案怎么选,看滑轨屏编码器怎么选;点位感应和连续定位的整体取舍,看滑轨屏定位方式对比;电动轨道里电机侧的位置反馈怎么用,看电动滑轨怎么控制;接好之后怎么标定和回零,看滑轨定位精度怎么调整;整套软硬件链路的全景,看互动滑轨屏系统组成。
参考资料:欧姆龙 E6B2-C 增量式旋转编码器规格书(PDF,英文,含输出类型与相位关系)。
编码器已经到手,却卡在怎么接进电脑、怎么定协议?把编码器型号、主机位置和走线条件发给我们,联系我们一起过接线方案。更多滑轨屏的结构、定位与内容做法,逛滑轨屏技术方案。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。