目录
一 旋钮编码器相关知识
二 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窗口观察到定时器脉冲计数值的变化了
______文章来源:https://www.toymoban.com/news/detail-607253.html
______
源码github仓库地址:GitHub - HaoJosephWen/Code-of-blog文章来源地址https://www.toymoban.com/news/detail-607253.html
到了这里,关于STM32(HAL)--使用定时器TIM的Encoder Mode来读取旋钮编码器的脉冲数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!