共计 1666 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在工业自动化现场,8 线 3 线编码器(8-wire 3-channel encoder)常用于位置反馈,但长距离传输时会遇到以下典型问题:

- 信号衰减 :超过 15 米后,A/B/ Z 相(A/B/Z-phase)信号幅度下降 30%-50%,导致 MCU 误判
- 电磁干扰 :变频器附近信噪比(SNR)可能低于 10dB,产生虚假脉冲
- 实时性差 :STM32 轮询方式(polling mode)响应延迟高达 50μs,无法满足高速运动控制需求
技术对比
通过对比两种主流方案,实测数据如下:
| 指标 | STM32 硬件编码器接口 | FPGA 并行处理方案 |
|---|---|---|
| 最大解析速度 | 500kHz | 5MHz |
| 延迟 | 20μs | 0.2μs |
| 抗干扰能力 | 依赖外部滤波器 | 内置数字窗滤波 |
FPGA 方案优势体现在:
- 并行处理四倍频(quadrature decoding)与滤波
- 硬件级时钟同步(clock domain crossing)
- 可扩展多轴同步采集
核心实现
四倍频解码模块
// 正交信号状态机(Quadrature State Machine)module quad_decoder(
input clk,
input A, B,
output reg [15:0] count
);
reg [1:0] prev_state;
always @(posedge clk) begin
case({A,B})
2'b00: if(prev_state==2'b10) count <= count + 1;
2'b01: if(prev_state==2'b00) count <= count + 1;
// ... 其他状态转换逻辑
endcase
prev_state <= {A,B};
end
endmodule
数字窗滤波算法
采用 7 阶汉宁窗(Hanning window)消除高频噪声:
// 移动窗口滤波器(Moving Window Filter)parameter WINDOW_SIZE = 7;
reg [WINDOW_SIZE-1:0] shift_reg;
always @(posedge clk) begin
shift_reg <= {shift_reg[WINDOW_SIZE-2:0], raw_signal};
filtered_signal = (shift_reg[0]+2*shift_reg[1]+3*shift_reg[2]
+ 3*shift_reg[3]+2*shift_reg[4]+shift_reg[5])/12;
end
双缓冲机制
状态机流程:
1. 缓冲 A 接收新数据
2. 数据达到阈值触发切换
3. 缓冲 B 输出稳定值
4. 交替切换避免冲突
性能验证
在 Xilinx Artix-7 FPGA 上测试:
- 时钟频率 :1MHz(周期 1μs)
- 建立时间(setup time):数据在时钟上升沿前 0.3μs 稳定
- 保持时间(hold time):时钟沿后 0.15μs 保持
- 时序余量 :满足所有路径 slack>0.1μs
避坑指南
PCB 设计要点
- 差分线阻抗控制在 100Ω±10%
- 编码器电源与数字电源用磁珠隔离
- 信号线远离电机驱动线路
软件滤波参数
// 机械振动滤波阈值(经验值)#define DEBOUNCE_US 50 // 消抖时间
#define GLITCH_FILTER 3 // 连续有效次数
时钟域交叉处理
采用异步 FIFO(Asynchronous FIFO)实现多编码器同步:
- 各编码器独立时钟域
- 异步 FIFO 深度≥32
- 格雷码(Gray code)转换避免亚稳态
代码规范建议
所有 Verilog 模块应包含:
/**
* @模块功能:正交解码器
* @输入信号:clk- 系统时钟, A/B- 编码器相位
* @输出信号:count- 位置计数值
* @时序要求:A/ B 信号必须同步到 clk 域
*/
module encoder(...);
input wire clk; // 时钟输入
...
endmodule
延伸思考
本方案可扩展至绝对值编码器(absolute encoder)场景:
- 增加 SSI 或 BiSS- C 接口解析
- 多圈计数需扩展位宽
- 考虑添加 CRC 校验模块
实际部署时,建议先用逻辑分析仪(Logic Analyzer)抓取原始信号波形,再逐步启用滤波功能。我们在纺织机械项目中使用该方案后,定位精度从±5mm 提升到±0.1mm。
正文完
发表至: 未分类
近一天内
