stm32f103c8t6旋转编码器
时间: 2025-02-13 08:22:21 浏览: 58
### STM32F103C8T6 旋转编码器 示例代码 教程
#### 初始化配置
为了使STM32F103C8T6能够正确读取来自旋转编码器的数据,初始化阶段至关重要。通过设置定时器进入编码器接口模式来实现这一目标。
```c
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim2;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
/* 启动定时器 */
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
while (1)
{
// 主循环可以处理其他任务
}
}
// 定时器2初始化函数
static void MX_TIM2_Init(void)
{
TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
sConfig.EncoderMode = TIM_ENCODERMODE_TI12; // 使用TI1和TI2作为输入
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; // TI1上升沿触发
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; // 直接连接到TI1
sConfig.IC1Prescaler = TIM_ICPSC_DIV1; // 不分频
sConfig.IC1Filter = 0; // 输入滤波关闭
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; // TI2上升沿触发
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; // 直接连接到TI2
sConfig.IC2Prescaler = TIM_ICPSC_DIV1; // 不分频
sConfig.IC2Filter = 0; // 输入滤波关闭
if (HAL_TIM_Encoder_Init(&htim2, &sConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
```
此部分展示了如何配置定时器以接收来自旋转编码器的信号并将其转换为计数值[^3]。
#### 获取当前计数值
一旦完成了上述初始化工作,在程序运行期间就可以随时调用特定API获取最新的旋转编码器的位置数据:
```c
extern TIM_HandleTypeDef htim2;
/**
* @brief 获取旋转编码器当前位置
* @return 当前位置值
*/
int16_t get_encoder_position(void)
{
return __HAL_TIM_GET_COUNTER(&htim2); // 返回当前计数寄存器中的值
}
```
这段代码定义了一个简单的辅助函数`get_encoder_position()`用于返回由硬件定时器记录下来的最新转动角度或线性距离变化量[^1]。
阅读全文
相关推荐




















