共计 2504 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点
AB 相旋转编码器是伺服控制系统中至关重要的反馈元件,它通过两路相位差 90°的方波信号(A 相和 B 相)来精确检测电机转子的位置和速度。在工业自动化、机器人、CNC 机床等领域,AB 相编码器的稳定性和精度直接决定了整个系统的控制性能。

然而,在实际工业现场应用中,我们经常会遇到以下典型问题:
- 长线传输干扰:编码器与控制器之间距离较远时,信号容易受到电磁干扰(EMI)影响
- 电源噪声:工业现场电源波动大,可能导致信号畸变或基准电平偏移
- 机械振动:电机运行时产生的振动会引起编码器信号相位抖动
- 接地环路:不合理的接地方式会引入共模噪声
硬件设计
差分接收 vs 单端接法
AB 相编码器的信号传输主要有两种方式:
- 差分接收(推荐):使用 AM26LS32 等差分接收器芯片,通过双绞线传输差分信号
- 优点:抗干扰能力强,适合长距离传输(可达 15 米)
-
缺点:需要额外芯片,成本略高
-
单端接法:直接连接编码器输出到 MCU
- 优点:电路简单,成本低
- 缺点:抗干扰能力弱,传输距离短(通常 <1 米)
带 ESD 保护的典型电路
以下是一个经过生产验证的硬件电路设计(以 A 相信号为例):
编码器 A + —— 120Ω ——+—— 100nF —— GND
| |
47pF 100Ω —— AM26LS32 —— STM32
| |
编码器 A - —— 120Ω ——+—— 100nF —— GND
关键参数说明:
- 120Ω 终端电阻:匹配电缆特性阻抗(通常双绞线阻抗为 120Ω)
- 100nF 电容:低通滤波,截止频率 f =1/(2πRC)≈13kHz
- 47pF 电容:高频噪声抑制
- 100Ω 电阻:限流保护
线缆与接地
- 必须使用屏蔽双绞线,屏蔽层单端接地(控制器侧)
- 信号地与电源地通过 0Ω 电阻或磁珠隔离
- 避免形成接地环路
软件处理
STM32 定时器正交解码配置
以下是使用 STM32 HAL 库配置定时器正交解码模式的示例代码:
// 定时器初始化
TIM_Encoder_InitTypeDef encoderConfig = {0};
encoderConfig.EncoderMode = TIM_ENCODERMODE_TI12; // AB 相正交模式
encoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING; // A 相上升沿有效
encoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; // A 相直接输入
encoderConfig.IC1Prescaler = TIM_ICPSC_DIV1; // 无分频
encoderConfig.IC1Filter = 0x0F; // 数字滤波 (16 个时钟周期)
// B 相配置 (同上)
encoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
encoderConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
encoderConfig.IC2Prescaler = TIM_ICPSC_DIV1;
encoderConfig.IC2Filter = 0x0F;
HAL_TIM_Encoder_Init(&htim3, &encoderConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
四倍频计数算法
通过检测 AB 相的边沿变化,可以实现 4 倍频计数(每个周期 4 个计数点),显著提高分辨率。以下是状态机实现:
状态转换表:当前状态 | A 相边沿 | B 相边沿 | 动作 | 新状态
---------|--------|--------|-----------|-------
S0 | ↑ | - | 计数 +1 | S1
S0 | - | ↑ | 计数 -1 | S3
S1 | - | ↑ | 计数 +1 | S2
S1 | ↓ | - | 计数 -1 | S0
...(完整状态机省略)
数字滤波算法
结合移动平均和异常值剔除,可以有效滤除信号抖动:
#define FILTER_WINDOW 5
int32_t filterEncoderValue(int32_t rawValue) {static int32_t buffer[FILTER_WINDOW] = {0};
static uint8_t index = 0;
static int32_t sum = 0;
// 移除最旧数据
sum -= buffer[index];
// 异常值检测(变化量超过阈值视为异常)if(abs(rawValue - buffer[(index+FILTER_WINDOW-1)%FILTER_WINDOW]) > MAX_DELTA) {rawValue = buffer[(index+FILTER_WINDOW-1)%FILTER_WINDOW];
}
// 添加新数据
buffer[index] = rawValue;
sum += rawValue;
index = (index + 1) % FILTER_WINDOW;
return sum / FILTER_WINDOW;
}
避坑指南
接地隔离方案
- 使用磁珠或 0Ω 电阻隔离编码器电源地与数字地
- 屏蔽层接机壳地,不要接信号地
上电延迟设计
为避免上电瞬间信号不稳定导致误计数,建议添加硬件互锁:
MCU_IO —— 10kΩ ——+—— 100μF —— GND
|
NPN —— 继电器控制编码器电源
500ms 延迟计算公式:t=R×C=10kΩ×100μF=1s(实际约 500ms 达到导通阈值)
相位差补偿
当 AB 相信号相位差偏离 90°时,可通过软件补偿:
// 测量 A 相上升沿到 B 相边沿的时间差
float phaseError = measurePhaseError();
// 在速度计算时补偿
float speed = (counts + phaseError*0.25) / timeInterval;
验证环节
波形对比
使用逻辑分析仪捕获的典型波形:
- 正常信号:AB 相严格正交,边沿清晰
- 干扰信号:可见明显的抖动和毛刺
误差率测试
在某 CNC 机床上的实测数据:
| 转速 (RPM) | 无滤波误差率 | 有滤波误差率 |
|---|---|---|
| 500 | 0.12% | 0.02% |
| 3000 | 0.45% | 0.08% |
| 5000 | 1.2% | 0.15% |
开放性问题
在 10 米以上长线传输场景中,RS422 和 LVDS 接口该如何选择?考虑因素包括:
- 传输距离需求
- 抗干扰能力
- 功耗限制
- 成本预算
- 系统升级扩展性
期待大家在评论区分享实际项目经验!
正文完
