4、编码器与触发同步:编码器原理(增量式/式)、触发模式(上升沿/下降沿)、编码器与相机行频匹配计算
做线扫相机项目,编码器这块要是没搞明白,后面全是坑。我见过太多人把相机接上,图像拉出来一看——要么拉伸变形,要么图像断层,折腾半天发现是编码器信号没配好。
说白了,编码器就是线扫相机的“心跳”。它告诉相机:该走一步了。没有这个信号,线扫相机就是一坨废铁。
4.1 编码器原理:增量式 vs 式
编码器分两种:增量式和式。咱们做线扫标定,绝大多数场景用的是增量式。为什么?便宜、够用、接口简单。
| 对比项 | 增量式编码器 | 式编码器 |
|---|---|---|
| 输出信号 | A、B、Z 三路脉冲 | 格雷码/二进制并行或串行 |
| 断电记忆 | 不记忆位置 | 记忆位置 |
| 分辨率 | 可做很高(几万线/转) | 受位数限制 |
| 成本 | 低 | 高 |
| 线扫适用性 | ★★★★★ | ★★★☆☆ |
增量式编码器怎么工作的?
它内部有个码盘,上面刻着明暗相间的条纹。光通过条纹,被接收器检测到,就产生脉冲。A相和B相相差90度相位,用来判断正反转。Z相每转一圈出一个脉冲,用来归零。
我记得有一次在现场调试,编码器接上去,相机触发乱跳。查了半天,发现是A/B相接反了。你想想看,A相和B相一旦接反,方向就反了,触发时序全乱套。
式编码器什么时候用?
如果设备断电后需要知道当前位置,或者运动控制精度要求极高,那就得上式。但线扫相机标定场景里,增量式完全够用。我个人很少在线扫项目里用式,除非客户指定。
4.2 触发模式:上升沿 vs 下降沿
编码器信号进相机,相机怎么响应?这就涉及到触发模式。
大多数线扫相机支持两种触发边沿:
- 上升沿触发:信号从低电平跳变到高电平时,相机采集一行
- 下降沿触发:信号从高电平跳变到低电平时,相机采集一行
你可能会问:选哪个?
其实没有的对错。关键看编码器输出信号的特性。如果编码器输出的是差分信号(RS-422),上升沿和下降沿都很陡峭,选哪个都行。但如果编码器是集电极开路输出,上升沿可能比较缓,这时候选下降沿更稳定。
还有一个细节:触发脉宽。相机对触发信号的最小脉宽有要求,一般是几微秒到几十微秒。如果编码器转速很高,脉冲宽度变窄,可能低于相机的最小要求,导致丢行。
怎么算?举个例子:编码器分辨率1000线/转,转速3000转/分,那每转周期是20ms,每线周期是20μs。如果相机要求最小脉宽5μs,那20μs的脉冲宽度是够的。但如果转速提到6000转/分,每线周期变成10μs,脉宽只有5μs,刚好卡在临界点。这时候就得小心了。
4.3 编码器与相机行频匹配计算
这是整个编码器同步的核心。匹配不对,图像要么拉伸、要么压缩、要么断层。
核心公式:
行频 (Hz) = 编码器分辨率 (线/mm) × 运动速度 (mm/s)
或者反过来:
编码器分辨率 (线/mm) = 行频 (Hz) / 运动速度 (mm/s)
举个例子:
- 运动速度:100 mm/s
- 相机最大行频:80 kHz
- 需要的像素精度:0.05 mm/pixel
那编码器分辨率应该设多少?
先算需要的行频:
行频 = 100 mm/s ÷ 0.05 mm/pixel = 2000 Hz
2000 Hz 远低于80 kHz,相机完全扛得住。
编码器分辨率:
编码器分辨率 = 2000 Hz ÷ 100 mm/s = 20 线/mm
也就是每毫米20个脉冲。换算成常见的编码器参数,大概是508线/英寸(20 × 25.4 ≈ 508)。
实际项目中的匹配步骤:
- 确定目标像素精度(比如0.05 mm/pixel)
- 确定最大运动速度(比如200 mm/s)
- 计算所需行频:200 ÷ 0.05 = 4000 Hz
- 确认相机最大行频是否大于4000 Hz(一般线扫相机都支持)
- 计算编码器分辨率:4000 ÷ 200 = 20 线/mm
- 选型:找接近的编码器规格,比如500线/英寸(≈19.7线/mm)
嗯,这里要注意:编码器分辨率通常用“线/转”或“线/英寸”表示。做计算时一定要统一单位。我见过有人把线/转和线/毫米搞混,结果图像拉伸得一塌糊涂。
4.4 知识结构图:编码器与触发同步
下面这张图把编码器、触发、行频匹配的关系串起来了。你可以把它当作调试时的检查清单。
4.5 实战中的几个坑
坑一:编码器信号抖动
编码器在低速时,信号抖动会比较明显。尤其是机械振动大的场合,抖动会导致相机误触发。解决办法:在相机里设置触发信号去抖(debounce)时间,一般设10-50μs就够了。
坑二:编码器分辨率与相机行频不匹配
我遇到过一个人,编码器分辨率设得特别高,结果相机行频跟不上,图像直接断层。后来把编码器分辨率降了一半,问题解决。记住:行频 = 分辨率 × 速度,这个公式要刻在脑子里。
坑三:Z相没用对
增量式编码器的Z相是每转一个脉冲,用来归零。如果做多圈扫描,Z相可以用来对齐每圈的起始位置。但很多人把Z相当普通触发信号用,结果每圈开始的位置都在漂。