共计 1849 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在机器人控制或 CNC 系统中,AB 相编码器是最常见的速度反馈元件。但在实际应用中,新手常会遇到三类典型问题:

- 信号毛刺导致计数错误 :机械振动或电磁干扰会使编码器输出产生抖动,一个物理脉冲被误判为多个计数
- 低速时脉冲丢失 :当转速低于一定阈值时,传统计数方法会因采样间隔过大而丢失脉冲
- 方向判断逻辑缺陷 :软件处理相位差时若存在时序问题,可能导致方向误判
测速方法对比
- 中断法 :
- 优点:响应快,可捕获所有边沿
-
缺点:高频时可能丢失中断,占用 CPU 资源
-
硬件计数器法 :
- 优点:不占用 CPU 时间,适合高频场景
-
缺点:依赖 MCU 硬件资源
-
软件轮询法 :
- 优点:实现简单
- 缺点:采样率受限,低速精度差
核心实现
硬件连接
使用 Arduino Uno 的 D2、D3 引脚(对应 INT0 和 INT1)连接编码器 AB 相,典型电路如下:
[编码器] ----[10k 上拉]--- D2 (A 相)
|
----[10k 上拉]--- D3 (B 相)
正交解码状态机
volatile int32_t g_encoderCount = 0; // 必须声明为 volatile
void setup() {pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
attachInterrupt(0, isrA, CHANGE); // 四倍频计数
attachInterrupt(1, isrB, CHANGE);
}
// 状态机实现四倍频解码
void isrA() {
static uint8_t lastState = 0;
uint8_t currState = digitalRead(2) | (digitalRead(3) << 1);
if((lastState == 0x00 && currState == 0x01) ||
(lastState == 0x03 && currState == 0x02)) {g_encoderCount++;} else {g_encoderCount--;}
lastState = currState;
}
关键点说明:
volatile关键字确保中断与主程序间正确共享变量- 状态机通过检查 AB 相组合变化实现方向判断
- CHANGE 触发方式使每个物理周期产生 4 次计数(上升 / 下降沿各一次)
性能优化
数字滤波算法
#define FILTER_TIME 50 // 单位 ms
uint32_t lastValidTime = 0;
int32_t lastValidCount = 0;
float getFilteredSpeed() {uint32_t now = millis();
if(now - lastValidTime > FILTER_TIME) {float speed = (g_encoderCount - lastValidCount) * 1000.0 / (now - lastValidTime);
lastValidCount = g_encoderCount;
lastValidTime = now;
return speed;
}
return NAN; // 数据未更新
}
滤波时间常数建议:
- 高速场景:20-50ms
- 低速场景:100-200ms
ISR 执行时间测量
通过示波器观察中断引脚与测试引脚的延时:
void isrA() {digitalWrite(13, HIGH);
// ... 中断处理代码
digitalWrite(13, LOW);
}
避坑指南
- 上拉电阻选择 :
- 10kΩ:适合大部分场景
- 1kΩ:长线传输时增强信号完整性
-
100kΩ:低功耗应用
-
替代 delay() 的方案 :
uint32_t lastUpdate = 0; void loop() {if(millis() - lastUpdate > 100) {updateDisplay(); // 非阻塞式定时任务 lastUpdate = millis();} } -
ESD 防护设计 :
- 信号线串联 100Ω 电阻
- 对地添加 TVS 二极管
- 使用屏蔽双绞线
延伸思考
- 多编码器系统 :
- 使用 PCA9548 等 I2C 多路复用器扩展 IO
-
为每个编码器分配独立硬件定时器
-
STM32 硬件接口改造 :
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
实测波形对比
(此处应有示波器截图,展示滤波前后信号质量改善)
- 原始信号:可见明显振铃和毛刺
- 滤波后信号:干净方波,边沿清晰
结语
通过合理选择硬件参数和优化软件算法,AB 相编码器可实现 0.1RPM 的低速测量精度。实际项目中还需考虑机械安装同轴度、电缆屏蔽等非电气因素。希望本文的实践经验能帮助开发者少走弯路。
正文完
