高级定时器的解码器模式
解码器模式(Encoder Interface Mode)
是高级定时器的一种功能,用于直接读取正交编码器(如旋转编码器)的输出信号,自动跟踪脉冲变化并计算方向与计数值,无需CPU频繁干预,适用于电机控制、位置检测等场景。
1. 配置编码器输入的GPIO引脚,设置为输入模式,并映射到定时器的通道。
2. 配置定时器为编码器模式,选择编码器接口的工作方式(例如,仅在TI1的边沿计数,或者TI1和TI2的边沿都计数)。
3. 设置自动重装载值,确定计数器的范围。
4. 启用定时器,开始计数。
5. 通过读取计数器的值来获取位置信息,或者结合溢出中断来计算速度。
联想解释
想象你有一个旋转编码器(类似自行车码表)
它通过两个信号线(A相和B相)告诉你转了多少圈、往哪边转。
高级定时器的解码器模式就像一个“自动计步器”
- 自动数步子:每转一步(一个脉冲),定时器自动加减计数。
- 判断方向:根据A、B相信号的先后顺序,自动判断是正转还是反转。
- 实时更新:CPU不用一直盯着,定时器自己默默计数,你随时可以问它:“现在走到哪了?”
STM32 HAL库配置
步骤1:配置编码器输入引脚
// 配置编码器A相(TI1)和B相(TI2)的GPIO为输入模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; // 假设PA8(TI1)、PA9(TI2)
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽模式
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉电阻防干扰
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; // 映射到TIM1
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
步骤2:配置定时器为编码器模式
TIM_HandleTypeDef htim1;
htim1.Instance = TIM1; // 使用高级定时器TIM1
htim1.Init.Prescaler = 0; // 不分频(直接计数)
htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 实际方向由编码器信号决定
htim1.Init.Period = 65535; // 自动重装载值(最大计数范围)
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
// 配置编码器接口
TIM_Encoder_InitTypeDef sEncoderConfig;
sEncoderConfig.EncoderMode = TIM_ENCODERMODE_TI12; // 同时使用TI1和TI2边沿
sEncoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING; // A相上升沿触发
sEncoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; // A相映射到TI1
sEncoderConfig.IC1Prescaler = TIM_ICPSC_DIV1; // 无分频
sEncoderConfig.IC1Filter = 0x0; // 无滤波
sEncoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING; // B相上升沿触发
sEncoderConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; // B相映射到TI2
sEncoderConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sEncoderConfig.IC2Filter = 0x0;
HAL_TIM_Encoder_Init(&htim1, &sEncoderConfig);
步骤3:启动编码器接口
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL); // 开启TIM1的编码器模式
步骤4:读取计数值
int32_t current_count = __HAL_TIM_GET_COUNTER(&htim1); // 获取当前计数值
步骤5(可选):处理溢出
// 开启溢出中断
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);
// 在中断回调函数中处理溢出
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM1) {
// 记录溢出次数,扩展计数范围
overflow_count++;
}
}
关键参数说明
参数 | 作用 |
---|---|
EncoderMode | 编码器模式:TIM_ENCODERMODE_TI1 (仅A相)、TIM_ENCODERMODE_TI2 (仅B相)、TIM_ENCODERMODE_TI12 (双相) |
IC1Polarity | A相信号触发边沿(上升沿/下降沿) |
IC1Filter | 输入滤波值(0~15),用于去抖动 |
Period | 自动重装载值,决定计数范围(如65535对应16位计数器) |