6.STM32配置定时器Encoder模式驱动EC11

STM32_EC11旋转编码器(定时器Encoder模式)

1.硬件

硬件:STM32f103c8t6、EC11旋转编码器
在这里插入图片描述
在这里插入图片描述
硬件连接:EC11与STM32f103c8t6用杜邦线按照下表进行连接,按键未用,故未接。

在这里插入图片描述

2.软件

CubeMX配置
1.打开TIM2的Encoder模式。
在这里插入图片描述
2.配置定时器参数。
备注:polarity -> rising edge 检测到上升沿的时候就触发encoder捕获AB相的值,捕获到A、B任意上升沿\下降沿 ,都计数。
在这里插入图片描述
代码编写
1.开启编码器计数。

HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);     //启动计数

2.调用 __HAL_TIM_IS_TIM_COUNTING_DOWN 可获得旋转方向,0正1负

val = (uint32_t)(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2));		 //获取方向

3.调用 __HAL_TIM_GET_COUNTER 获取计数值,即编码器的脉冲数。

enc = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim2));             //获取计数值

4.考虑到编码器用来做输入,系统功能函数多了,放在while循环里面实时性不高,这里利用stm32f103的滴答定时器,将检查函数放在SysTick_Handler() 中断服务函数中,实现每隔1ms扫描一次编码器。

void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */
  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
  enc = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim2));             //获取计数值
  val = (uint32_t)(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2));		 //获取方向
  /* USER CODE END SysTick_IRQn 1 */
}

**项目代码地址:**https://download.csdn.net/download/qq_42673988/19101506?spm=1001.2014.3001.5501

运行效果:

在这里插入图片描述

  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是配置 STM32F4 系列的高级定时器 TIM8 编码接口模式的代码示例: ```c #include "stm32f4xx.h" void TIM8_Encoder_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_ICInitTypeDef TIM_ICInitStruct; // 使能 TIM8 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); // 配置 TIM8_CH1 和 TIM8_CH2 引脚 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOC, &GPIO_InitStruct); // 配置引脚复用功能 GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM8); // 配置定时器基本参数 TIM_TimeBaseStruct.TIM_Prescaler = 0; TIM_TimeBaseStruct.TIM_Period = 0xFFFF; // 最大计数值为 65535 TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStruct.TIM_ClockDivision = 0; TIM_TimeBaseStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStruct); // 配置编码器模式 TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); // 配置输入捕获通道 TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStruct.TIM_ICFilter = 0; TIM_ICInit(TIM8, &TIM_ICInitStruct); TIM_ICInitStruct.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM8, &TIM_ICInitStruct); // 启动定时器 TIM_Cmd(TIM8, ENABLE); } ``` 上述代码中,首先使能了 TIM8 的时钟,并配置了 TIM8_CH1 和 TIM8_CH2 的引脚。然后,配置定时器的基本参数和编码器模式,并初始化了输入捕获通道。最后,启动了定时器。 在使用这段代码之前,请确保已经正确配置了相关的引脚和时钟。此外,还需根据实际需求进行必要的修改和补充。 希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值