使用STM32(HAL)定时器TIM的Encoder Mode读取旋钮编码器脉冲数详解

目录

一 旋钮编码器相关知识

二 STM32CubeMx配置

三 程序编写

3.1 相关函数介绍

3.2 程序编写

四 实验结果


一 旋钮编码器相关知识

旋转编码器是一种位置传感器,输出脉冲信号可以用来确定编码器的旋转角度和旋转方向。

编码器中有两个开关,当旋钮旋转后,开关会依次导通,开关结构图如下图所示

如果我们将旋钮开关的引脚C接GND,引脚A和B通过上拉电阻接高电平,当旋钮旋转后开关会依次导通,A、B口的波形如下图所示。

旋钮反转,A相波形会落后于B相

所以我们可以开启STM32单片机定时器的输入捕获功能,统计A、B引脚的上升沿和下降沿的个数,可以知道旋钮编码器旋转了多少度;通过判断当A端口为下降沿时,B端口是高电平还是低电平,就可判断旋钮编码器的旋转方向。

已知旋钮编码器旋转一圈的脉冲数是20个,那们A、B引脚共产生了20×4=80个上升沿和下降沿。假设STM单片机定时器采集到20个计数值,我们通过计算可知旋钮编码器旋转360*20/80=90度。

二 STM32CubeMx配置

1. 定时器设置

2. 定时器引脚设置为上拉输入模式

3. 这里补充一下STM32定时器编码器模式的相关知识

        如果TI1和TI2接单片机分别接旋钮编码器的A、B引脚时,编码器正转时,计数器会向上计数,反转时会向下计数(计数值为0后,下次计数从65535开始往下计数)

三 程序编写

3.1 相关函数介绍

//1.定时器3的通道1和通道2的Encoder Mode开启使能函数
HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_1 | TIM_CHANNEL_2);

//2.返回值当前脉冲计数值,也可对脉冲计数值进行重新置位
int cnt=__HAL_TIM_GET_COUNTER(&htim3);
__HAL_TIM_GET_COUNTER(&htim3)=0;//脉冲计数值清0

//3.返回值为bool类型,当计数器向下计数时,返回true,可以用来判断编码器旋转方向
 __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);

3.2 程序编写

定义两个全局变量(之所以定义成全局变量,是为了方便后边将这个变量变量在debug模式中添加到watch窗口中查看)

/* USER CODE BEGIN PV */
uint8_t Direction;
uint16_t CaptureNumber;
/* USER CODE END PV */

在main函数中开启编码器模式

/* USER CODE BEGIN 2 */
HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_1 | TIM_CHANNEL_2);
/* USER CODE END 2 */

while(1)循环中不断循环检测当前的脉冲计数值

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    Direction=__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3); //读取编码器旋转方向
    CaptureNumber=__HAL_TIM_GET_COUNTER(&htim3);   //读取脉冲计数值
  }
  /* USER CODE END 3 */

四 实验结果

点击红色按钮进入debug模式

点击全速运行

旋转编码器,即可在watch窗口观察到定时器脉冲计数值的变化了

______

______

源码github仓库地址:GitHub – HaoJosephWen/Code-of-blog

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32(HAL)定时器TIM的Encoder Mode读取旋钮编码器脉冲数详解

发表评论