stm32 定时器编码器采集
时间: 2025-05-30 14:04:21 浏览: 16
### 使用STM32定时器实现编码器信号采集
#### 1. 定时器与编码器模式简介
STM32微控制器中的定时器具有多种工作模式,其中编码器模式专门用于测量旋转编码器的转速和方向。该模式能够捕捉两个正交信号的变化,并通过计数器记录其变化量[^2]。
#### 2. 配置步骤概述
以下是使用STM32定时器配置编码器模式的主要步骤:
- **使能定时器时钟**:确保目标定时器及其相关GPIO端口的时钟已启用。
- **配置GPIO引脚**:将连接到编码器A相和B相信号的GPIO引脚配置为复用推挽输出模式。
- **初始化定时器**:设置定时器的工作参数,包括预分频系数、计数器周期等。
- **选择编码器模式**:根据实际需求选择增量型编码器模式(Mode 1, Mode 2 或 Mode 3),并指定输入捕获通道。
- **启动定时器**:完成以上配置后,启动定时器以开始监测编码器信号。
#### 3. 示例代码
以下是一个简单的示例代码,演示如何使用STM32F103系列微控制器的TIM2定时器来实现编码器信号采集。
```c
#include "stm32f1xx_hal.h"
void TIM2_Encoder_Init(void) {
__HAL_RCC_TIM2_CLK_ENABLE(); // 启用TIM2时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置PA0 (TIM2_CH1) 和 PA1 (TIM2_CH2) 作为编码器输入
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
TIM_MasterConfigTypeDef sMasterConfig = {0};
// 设置定时器参数
htim2.Init.Prescaler = 0; // 不进行预分频
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数向上
htim2.Init.Period = 65535; // 自由运行模式下最大值
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.RepetitionCounter = 0;
HAL_TIM_Base_Init(&htim2);
// 配置编码器模式
TIM_Encoder_InitTypeDef sConfigEncoder = {0};
sConfigEncoder.EncoderMode = TIM_ENCODERMODE_TI12; // 使用TI1和TI2
sConfigEncoder.IC1Polarity = TIM_ICPOLARITY_RISING; // 上升沿触发
sConfigEncoder.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfigEncoder.IC1Selection = TIM_ICSELECTION_DIRECTTI; // TI1直接输入
sConfigEncoder.IC2Selection = TIM_ICSELECTION_DIRECTTI; // TI2直接输入
sConfigEncoder.IC1Prescaler = TIM_ICPSC_DIV1; // 不分频
sConfigEncoder.IC2Prescaler = TIM_ICPSC_DIV1;
HAL_TIM_Encoder_Init(&htim2, &sConfigEncoder);
// 主控配置
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
// 启动定时器
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
}
int main(void) {
HAL_Init();
SystemClock_Config();
TIM2_Encoder_Init();
while (1) {
int32_t position = __HAL_TIM_GET_COUNTER(&htim2); // 获取当前计数值
printf("Position: %ld\n", position);
}
}
```
此代码实现了对TIM2定时器的初始化,并将其配置为编码器模式。程序会不断读取计数器的值并打印出来,表示编码器当前位置。
#### 4. 数据处理与应用
一旦成功采集到编码器的位置数据,可以进一步对其进行滤波、校准或其他必要的处理。这些经过处理的数据可用于闭环控制系统中,例如伺服电机的速度或位置控制[^3]。
---
阅读全文
相关推荐

















