增量式编码器 4 倍频实现步骤
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 负担较重。
方法 2:定时器+硬件解码
大部分 MCU(如 STM32、NXP、TI)支持 定时器正交解码模式,可以利用硬件 自动完成 4 倍频计数,减少 CPU 负担。
实现步骤:
选择支持正交解码的 定时器(如 STM32 的 TIM2/TIM3)。
配置定时器的 编码模式(Encoder Mode)。
选择 4 倍频模式(检测 A、B 相的上升沿和下降沿)。
读取定时器计数器 CNT 直接获取位置信息。
示例代码(基于 STM32 HAL 库):
c
复制
编辑
TIM_Encoder_InitTypeDef encoderConfig;
encoderConfig.EncoderMode = TIM_ENCODERMODE_TI12;
encoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
encoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
encoderConfig.IC1Prescaler = TIM_ICPSC_DIV1;
encoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
encoderConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
encoderConfig.IC2Prescaler = TIM_ICPSC_DIV1;
HAL_TIM_Encoder_Init(&htim2, &encoderConfig);
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
然后,读取 TIM2->CNT 直接获得 编码器当前位置。
优点:
硬件自动处理,适用于 高速旋转,不会占用 CPU。
通过 定时器 CNT 值 直接读取角度/位移。
缺点: 需 MCU 支持编码器模式(部分低端 MCU 不支持)。
方向判断
无论采用 软件轮询 还是 定时器解码,方向判断方式都类似:
A 相变化时 B 相高电平 → 正转,低电平 → 反转。
B 相变化时 A 相低电平 → 正转,高电平 → 反转。 计算旋转角度
如果编码器有 N 线刻度,则:
单圈分辨率 = N × 4(因为 4 倍频)。
角度计算公式:
例如:
1000 线编码器,4 倍频后分辨率 4000 线,如果 CNT = 2000:
页:
[1]