共计 1356 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
在工业自动化现场,增量式编码器信号常常面临干扰和误判问题。常见痛点包括:

- 长距离传输时信号衰减导致波形畸变
- 电机启停瞬间产生电磁干扰(EMI)造成计数错误
- 机械振动引起 Z 相(Index 信号)误触发
- 相位差偏离 90°导致方向误判
波形解析
a+b+z+ 信号特征
- A 相和 B 相信号相位差严格 90°(正交)
- Z 相脉冲宽度通常为 1 个机械周期
- 信号幅值典型为 5V(TTL)或 RS422 差分
- 上升 / 下降时间应小于 100ns(高速编码器)
a-b-z- 差分信号优势
- 抗共模干扰能力提升 20dB 以上
- 传输距离可达 100 米(RS422 标准)
- 信号边沿更陡峭(典型值 50ns)
解码逻辑
正交解码原理
- 每个边沿触发状态变化(4 倍频)
- 状态转换顺序决定方向判断
- Z 相作为机械零点基准
状态转换图示例
stateDiagram
[*] --> State0
State0 --> State1: A 上升沿
State1 --> State3: B 上升沿
State3 --> State2: A 下降沿
State2 --> State0: B 下降沿
代码实现(STM32 HAL)
GPIO 初始化
// 编码器接口配置
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; // A 相 &B 相
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
定时器编码器模式
TIM_Encoder_InitTypeDef sConfig = {0};
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
HAL_TIM_Encoder_Init(&htim2, &sConfig);
抗干扰设计
硬件 RC 滤波
- 截止频率计算:fc=1/(2πRC)
- 推荐值:R=100Ω, C=100pF(适合 1MHz 信号)
软件消抖算法
// 3 次采样投票法
uint8_t debounce(uint8_t new_sample) {
static uint8_t history = 0;
history = (history<<1) | (new_sample&0x01);
return (history & 0x07) > 4 ? 1 : 0;
}
避坑指南
电缆接地要点
- 屏蔽层单端接地(控制器侧)
- 避免形成接地环路
- 使用双绞线降低串扰
高速计数方案
- 启用定时器溢出中断
- 32 位计数器扩展(软件拼接)
- DMA 直接捕获计数值
验证建议
边界测试方法
- 注入±10% 时钟抖动的 A / B 相信号
- 模拟 Z 相脉冲宽度异常(<50ns)
- 测试正交相位偏差(85°~95°)
推荐工具
- Saleae Logic Pro 16(16 通道分析)
- 普源 DS1102Z 示波器(100MHz 带宽)
- 编码器信号模拟器(PXIe-6341)
延伸阅读
- 绝对式编码器 SSI 协议解析
- EnDat2.2 双向通信协议
- 光电编码器码盘生产工艺
- 伺服系统位置环整定方法
正文完
