共计 1910 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
在伺服控制系统中,AB 相编码器(Quadrature Encoder)如同设备的 ” 眼睛 ”,实时反馈电机转子的位置和速度。这种增量式编码器通过两路相位差 90°的方波信号(A 相和 B 相),既能计数脉冲数量,又能通过相位关系判断旋转方向。但在实际开发中,工程师们常遇到三大难题:
- 信号抖动问题 :机械振动或电气干扰导致脉冲边沿出现毛刺
- 方向误判 :高速旋转时因信号延迟造成相位关系误读
- 计数溢出 :长时间运行导致 32 位计数器不够用
正交解码原理
- 基础时序分析 :
当编码器顺时针旋转时,A 相信号上升沿对应 B 相高电平;逆时针时则对应 B 相低电平。这种相位差是方向判定的核心依据。

(图示:A 相黄色,B 相蓝色,虚线标注关键采样点)
- 状态机实现 :
将 AB 相信号的四种组合(00,01,11,10)定义为状态,通过状态转移表实现方向判断:
| 当前状态 | 下一状态 | 方向判定 |
|---|---|---|
| 00 | 01 | CW |
| 01 | 11 | CW |
| 11 | 10 | CW |
| 10 | 00 | CW |
| (反向旋转时状态转移顺序相反) |
硬件设计要点
- RC 消抖电路 :
典型参数选择:R=1kΩ,C=100nF,时间常数 τ =RC=100μs。该配置可滤除 <10μs 的抖动。
A 相 ——/\/\/\——||——→ MCU
1kΩ 100nF
- ESD 保护 :
在信号线对地并联 TVS 二极管(如 SMAJ5.0A),防止静电损坏 IO 口。
软件实现(STM32 示例)
中断服务函数
// 使用 STM32CubeMX 配置 GPIO 上升沿 / 下降沿双沿触发
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
static uint8_t last_state = 0;
uint8_t new_state = (HAL_GPIO_ReadPin(GPIOB, A_Pin) << 1)
| HAL_GPIO_ReadPin(GPIOB, B_Pin);
// 状态转移判断
if((last_state == 0x00 && new_state == 0x01) ||
(last_state == 0x01 && new_state == 0x03) ||
(last_state == 0x03 && new_state == 0x02) ||
(last_state == 0x02 && new_state == 0x00)) {position++;} else {position--;}
last_state = new_state;
}
原子操作处理
__IO int32_t position; // 使用 volatile 修饰
// 在中断和主循环中访问时
uint32_t get_safe_position(void) {__disable_irq();
int32_t tmp = position;
__enable_irq();
return tmp;
}
性能优化技巧
- 中断响应测试 :
用 IO 口翻转法测量中断延迟:
HAL_GPIO_WritePin(TEST_PIN, GPIO_PIN_SET);
// 中断服务函数内立即清除
HAL_GPIO_WritePin(TEST_PIN, GPIO_PIN_RESET);
用示波器测量脉冲宽度即为中断延迟时间。
- 高速计数方案 :
- 启用 TIM 编码器接口模式(硬件正交解码)
-
定时器溢出中断中更新全局计数器:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim->Instance == ENCODER_TIM) {overflow_cnt += (htim->Instance->CR1 & TIM_CR1_DIR) ? -1 : 1; } }
避坑指南
-
GPIO 配置陷阱 :
必须设置输入模式为浮空输入(GPIO_NOPULL),上拉电阻会改变信号边沿时间。 -
软件消抖参数 :
采样周期应大于 3 倍 RC 时间常数,但小于最小有效脉冲宽度。例如: - 机械编码器:建议 10-100μs 采样间隔
-
光电编码器:可缩短至 1 -10μs
-
多轴同步 :
给不同编码器分配不同优先级,确保高转速轴的中断能抢占:HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); // 主轴高优先级 HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0); // 从轴低优先级
进阶思考
如何利用 Z 相(零位信号)实现绝对位置校准?提示:
1. 在 Z 脉冲到来时重置计数器
2. 结合 EEPROM 存储多圈信息
3. 使用窗口比较法消除震荡带来的多次触发
建议用 Saleae 逻辑分析仪捕获 ABZ 三相波形,实测信号质量与软件处理效果。
实践心得
经过多个伺服项目的验证,这套方案在 3000RPM 转速下仍能稳定工作。关键点在于硬件消抖与软件状态的协同处理,就像给编码器信号上了 ” 双保险 ”。下次遇到计数漂移问题时,不妨先检查 RC 参数是否与转速匹配,这往往能节省大量调试时间。
正文完
