1. 正交信号基本原理
增量式编码器输出 A 相 和 B 相 两路相位相差 90° 的方波信号,每个信号周期对应一个编码器刻线。
例如:
当编码器正向旋转时,A 相 领先 B 相 90°。
当编码器反向旋转时,B 相 领先 A 相 90°。
由于每个信号周期有 4 个边沿(A 上升、A 下降、B 上升、B 下降),利用这些边沿可以将编码器的分辨率提高 4 倍。
2. 4 倍频的具体实现
方法 1:软件轮询检测
步骤:
通过 GPIO 读取 A、B 相电平。
监听 A 相或 B 相的变化(上升沿或下降沿)。
计算方向:
如果 A 相变化时 B 相的状态为 1,则为正转;否则反转。
如果 B 相变化时 A 相的状态为 0,则为正转;否则反转。
每次边沿触发时,计数器 ±1,实现 4 倍频。
示例代码(基于中断方式):
c
复制
编辑
volatile int32_t encoder_count = 0;
void EXTI_IRQHandler(void) {
static uint8_t last_AB = 0;
uint8_t AB = (GPIO_ReadInputDataBit(GPIOA, A_PIN) << 1) | GPIO_ReadInputDataBit(GPIOA, B_PIN);
// 计算方向
if ((last_AB == 0b00 && AB == 0b01) ||
(last_AB == 0b01 && AB == 0b11) ||
(last_AB == 0b11 && AB == 0b10) ||
(last_AB == 0b10 && AB == 0b00)) {
encoder_count++; // 正转
} else {
encoder_count--; // 反转
}
last_AB = AB; // 更新状态
EXTI_ClearITPendingBit(EXTI_LineX); // 清除中断标志
}
优点: 适用于 低速 编码器,软件逻辑简单。
缺点: 依赖 中断处理,高频时 CPU 负担较重。
|