3. 编码器基础
编码器是将旋转位移或直线位移转换为电信号的传感器,是伺服系统、运动控制卡、机器人关节和数控机床中不可或缺的反馈元件。在FPGA脉冲输出与编码器接口实战中,编码器信号的采集与解析是FPGA与外部运动机构建立闭环控制的第一步。本章将系统讲解增量式编码器与式编码器的工作原理、A/B/Z信号时序特征、分辨率与精度的本质区别,并结合FPGA接口设计中的常见问题给出工程化建议。
3.1 增量式编码器工作原理
增量式编码器通过检测码盘上的刻线或栅格来产生脉冲信号,其输出仅反映相对位置变化量,无法直接获知位置。码盘上均匀分布着透光和不透光的交替条纹,当码盘旋转时,光电发射管和接收管之间的光路被周期性切断,从而产生方波脉冲。增量式编码器通常输出两路相位相差90°的方波信号(A相和B相),以及每圈一个脉冲的Z相零位信号。
A/B两路正交信号是增量式编码器的核心输出。当编码器正转时,A相超前B相90°;反转时,B相超前A相90°。FPGA通过检测A/B信号的边沿顺序即可判断旋转方向。Z相信号在码盘旋转一圈时输出一个脉冲,通常与码盘上的零位标记对应,用于机械原点定位或位置清零。
3.2 式编码器工作原理
式编码器在码盘上刻有多圈同心码道,每圈码道对应一位二进制码或格雷码。码盘旋转时,光电读取装置同时读取所有码道上的明暗状态,直接输出当前位置的编码值。与增量式编码器不同,式编码器断电后位置信息不会丢失,上电即可读取当前位置,无需回零操作。
式编码器的输出方式主要有并行二进制输出、SSI同步串行接口和BiSS接口。并行输出占用FPGA引脚较多,但读取速度快;SSI和BiSS采用串行通信,引脚占用少,适合远距离传输。式编码器的码制通常采用格雷码,因为格雷码相邻两个数值之间只有一位变化,可以有效避免多码道同时切换时的读数错误。
| 对比维度 | 增量式编码器 | 式编码器 |
|---|---|---|
| 位置信息 | 相对位置,断电丢失 | 位置,断电保持 |
| 输出信号 | A/B/Z方波脉冲 | 并行二进制 / SSI / BiSS |
| 分辨率 | 取决于刻线数,可倍频 | 取决于码道数,单圈/多圈 |
| 回零操作 | 需要找Z相原点 | 无需回零 |
| 抗干扰能力 | 脉冲易受干扰 | 串行传输带校验 |
| 典型应用 | 伺服电机、步进反馈 | 机器人关节、数控机床 |
3.3 A/B/Z信号时序与FPGA解码
A/B/Z信号的时序解析是FPGA编码器接口设计的核心任务。A相和B相均为周期方波,相位差固定为90°。一个完整的A/B脉冲周期内包含四个边沿变化点,FPGA可以通过检测这些边沿实现4倍频计数,即每个脉冲周期计数4次,从而将编码器分辨率提高4倍。
方向判断逻辑基于A/B信号的相位关系。当A相上升沿到来时,若B相为低电平,则判定为正转;若B相为高电平,则判定为反转。FPGA中通常使用状态机或边沿检测逻辑实现该功能。Z相信号每圈出现一次,宽度通常为1/4个A相周期,用于位置清零或原点捕获。
// FPGA 4倍频计数核心逻辑(Verilog示例)
always @(posedge clk) begin
A_d1 <= A_in;
B_d1 <= B_in;
// 检测A相上升沿
if (A_in && !A_d1) begin
if (B_in) position <= position - 1; // 反转
else position <= position + 1; // 正转
end
// 检测A相下降沿
else if (!A_in && A_d1) begin
if (B_in) position <= position + 1;
else position <= position - 1;
end
// 检测B相上升沿
else if (B_in && !B_d1) begin
if (A_in) position <= position + 1;
else position <= position - 1;
end
// 检测B相下降沿
else if (!B_in && B_d1) begin
if (A_in) position <= position - 1;
else position <= position + 1;
end
end
3.4 分辨率与精度的本质区别
分辨率是指编码器能够分辨的最小位移量,由码盘刻线数或码道数决定。增量式编码器的分辨率等于360°除以每圈脉冲数,再除以倍频数。例如,一个2500线/圈的增量式编码器,经4倍频后分辨率为360°/(2500×4)=0.036°。式编码器的分辨率由码道数决定,17位单圈式编码器分辨率为360°/2^17≈0.0027°。
精度则是指编码器实际输出位置与真实位置之间的偏差,受多种因素影响:码盘制造误差、光电读取噪声、机械安装偏心、温度漂移、信号传输延迟等。高分辨率并不等于高精度,一个分辨率很高的编码器可能因为安装不良或信号干扰而实际精度并不理想。
3.5 实战场景:伺服电机位置反馈接口设计
以一款2500线增量式编码器配合FPGA实现伺服电机位置闭环为例。系统要求:电机最高转速3000rpm,位置采样周期1kHz,需要4倍频计数并实时输出位置值。
首先计算最大脉冲频率:3000rpm = 50rps,每圈2500线,4倍频后每圈10000个计数脉冲,最大计数频率为50×10000=500kHz。FPGA系统时钟50MHz,完全满足采样需求。接口设计包含以下步骤:
- 信号调理:A/B/Z信号经差分接收器(如AM26LS32)转换为单端TTL电平,再进入FPGA。
- 数字滤波:FPGA内部对A/B信号进行3级同步器处理,消除亚稳态和毛刺。
- 4倍频计数:使用状态机检测A/B边沿,实现方向判断和位置累加。
- Z相清零:检测到Z相脉冲时,将位置计数器清零或锁存当前值。
- 位置输出:每个采样周期(1ms)将当前计数值锁存到输出寄存器,供上层控制算法读取。
实际调试中遇到一个问题:电机高速旋转时,位置计数出现偶发跳变。通过示波器观察A/B信号,发现信号存在振铃和过冲,导致FPGA误判边沿。解决方案是在差分接收器输出端增加RC滤波(100Ω+100pF),并在FPGA内部增加边沿窗口检测,最终消除了误计数现象。
3.6 编码器选型与接口设计注意事项
在FPGA脉冲输出与编码器接口项目中,编码器选型需综合考虑分辨率、输出类型、电气接口和机械安装方式。增量式编码器适合成本敏感、断电后允许回零的场合;式编码器适合需要位置记忆、多轴协同的场合。电气接口方面,差分输出(RS-422)比单端输出抗干扰能力更强,适合长距离传输。
FPGA接口设计还需注意电平匹配问题。常见编码器输出电平有5V TTL、3.3V LVTTL和差分信号。如果编码器输出5V而FPGA引脚为3.3V,需要加电平转换电路或使用耐压引脚。此外,编码器供电电压(通常5V或12V)应与FPGA系统电源隔离,避免电机驱动噪声通过电源耦合到编码器信号中。
| 设计项 | 推荐做法 | 风险说明 |
|---|---|---|
| 信号传输 | 差分信号+屏蔽双绞线 | 单端传输易受共模干扰 |
| 输入滤波 | RC滤波+FPGA数字滤波 | 滤波过度会降低响应速度 |
| 电平转换 | 使用电平转换芯片或光耦隔离 | 电平不匹配可能损坏FPGA |
| 电源隔离 | 编码器独立供电或DC-DC隔离 | 电源噪声导致信号误判 |
| Z相处理 | Z相单独滤波并锁存 | Z相毛刺导致原点偏移 |
编码器接口的调试方法建议遵循“先静态后动态”的原则。静态调试时手动缓慢旋转编码器,观察FPGA计数值是否单调递增或递减;动态调试时使用示波器同时观察A/B信号和FPGA内部计数波形,确认边沿检测逻辑正确。对于式编码器,需重点验证格雷码到二进制的转换逻辑,以及多圈数据的拼接正确性。