【STM32】HAL库自学记录-旋转编码器的使用

这篇具有很好参考价值的文章主要介绍了【STM32】HAL库自学记录-旋转编码器的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

通过本文可学会两种实现判断旋转编码器正转反转的方法,可根据自己的应用场景来选择使用哪种方法。

使用工具

1、芯片:STM32F103RCT6
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、旋转编码器模块
5、XCOM V1.4串口软件

旋转编码器原理介绍

旋转编码器实验,stm32,单片机,嵌入式硬件
图中C端为GND。
方向:A相和B相相差一个相位,一般来说是90°。A相信号在前表示正转,B相信号在前表示反转。
旋转编码器实验,stm32,单片机,嵌入式硬件
上图是模块的原理图,实物图如下:
旋转编码器实验,stm32,单片机,嵌入式硬件

方法一 定时器中断方式(实质就是外部中断)

cubeMX配置:
首先是时钟配置,我这边是有外部时钟的,所以选择了使用外部时钟,具体配置如下图:
旋转编码器实验,stm32,单片机,嵌入式硬件接下来选择自己要使用的引脚,外部中断和定时器输入捕获中断在这个实验中都是一个效果,偷懒就建一个工程吧。记得TIM4的combined channels要选择encoder mode,他就会默认使用了TIM4的channel1和channel2。记得选择NVIC把TIM4的中断打开。

我这个里面还配置了两个LED灯和一个PB5引脚,PB5引脚是为了连接旋转编码器的按键功能。此外还配置了一个串口,用来打印的。这里就不展开讲解了。
旋转编码器实验,stm32,单片机,嵌入式硬件
这边看下project manager的配置都没有问题的话就可以点击generate code来生成工程和代码了。

旋转编码器实验,stm32,单片机,嵌入式硬件在主函数中添加:

HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);//开启输入捕获且捕获后进入中断

在main.c中添加中断服务函数,我这边添加的定时器中断服务函数,要是使用外部中断就添加外部中断服务函数即可。

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//定时器捕获中断回调函数
{
	
	if(htim == &htim4)
	{
		HAL_TIM_IC_Stop_IT(&htim4, TIM_CHANNEL_1);//关中断,防止重复触发
		if (HAL_GPIO_ReadPin(EC11_B_GPIO_Group, EC11_B_GPIO_PIN) == GPIO_PIN_SET)//判断B相电平是否为高
    		{
       			HAL_GPIO_TogglePin(GPIOA, LED0_Pin);//LED0翻转
   		 	}
    	else
    		{
      			HAL_GPIO_TogglePin(GPIOD, LED1_Pin);//LED1翻转
   			 }
  		 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);//开启输入捕获且捕获后进入中断
    }
}

主循环:

  while (1)
  {
	    HAL_Delay_ms(1000);
	    if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 0 )//旋转编码器按键按下后,两个LED灯同时翻转
	      {
		      HAL_Delay_ms(10);//去抖
		      HAL_GPIO_TogglePin(GPIOA, LED0_Pin);
		      HAL_GPIO_TogglePin(GPIOD, LED1_Pin);
	      }
  }

方法二 定时器方式

cubeMX的配置和上面一样,只是修改了程序使用不同的方法。
旋转编码器实验,stm32,单片机,嵌入式硬件

在主函数中加上下面这两句话:

  __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); //开启输入捕获中断,设置下降沿触发中断
  HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);

主循环的代码:

  while (1)
  {
	    HAL_Delay_ms(1000);
		ecValue = __HAL_TIM_GET_COUNTER(&htim4) ;
		direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4); 
	    printf("Count val = %d, direction = %d\r\n",ecValue,direction);
	    if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 0 )
	      {
		      HAL_Delay_ms(10);
		      HAL_GPIO_TogglePin(GPIOA, LED0_Pin);
		      HAL_GPIO_TogglePin(GPIOD, LED1_Pin);
	      }
  }

运行结果如下:
Count val显示了当前计数器的数值,direction为0和1代表了是顺时针还是逆时针旋转。这是直接读了STM32中的寄存器,因为STM32的定时器本身可以有encoder模式,采用读寄存器的方式可以更少的利用MCU的资源。
旋转编码器实验,stm32,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-673473.html

到了这里,关于【STM32】HAL库自学记录-旋转编码器的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32移植LVGL+旋转编码器接口对接

    写在前面:本菜鸟结合了许多大佬的文章,成功实现了基于LVGL的GUI设计,小开心~浅浅记录一下!~ 本文以单片机STM32F103VET6为核心,利用ST7796芯片驱动分辨率为480*320的LCD液晶屏模块,移植LVGL,对接显示接口,对接外部接口——旋转编码器,完成以上两步,就可以实现LVGL的显

    2024年02月10日
    浏览(39)
  • stm32 HAL库 4096线ABZ编码器

    @[TOC]目录 买的是这个 AB相代表计数方向,Z代表过零点 也可以选上DMA 中断 找一个空闲管脚 打开对应中断 用DMA 过机械零点就+/-360

    2024年04月17日
    浏览(70)
  • STM32 HAL库 AS5600编码器程序

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STM32 HAL库 AS5600编码器程序 提示:这里可以添加本文要记录的大概内容: AS5600磁性旋转位置编码器是一款可编程、12位高分辨率、非接触式的设备,具有卓越的可靠性和耐久性。这个旋转位置传感器提供

    2024年02月20日
    浏览(34)
  • STM32(HAL)--使用定时器TIM的Encoder Mode来读取旋钮编码器的脉冲数

    目录 一 旋钮编码器相关知识 二 STM32CubeMx配置 三 程序编写 3.1 相关函数介绍 3.2 程序编写 四 实验结果 旋转编码器是一种位置传感器,输出脉冲信号可以用来确定编码器的旋转角度和旋转方向。 编码器中有两个开关,当旋钮旋转后,开关会依次导通,开关结构图如下图所示

    2024年02月15日
    浏览(44)
  • STM32-微项目07-旋转编码器计数及测速

    一、微项目实现目标: 检测旋转编码器模式下,检测旋转编码器的转动计数值及转速。并且区分转向,一侧转动增加cout,转速值为正,一侧转动减少count,转速值为负;   二、微项目硬件配置需求: 1,stm32F103C8T6核心板一块 2,0.96寸OLED显示,用于显示计数 3,旋转编码器,

    2024年02月08日
    浏览(30)
  • 【STM32】【HAL库】定时器编码器模式测速

    目录 概述 HAL设置  定时器的编码器模式 定时器设置  常用函数 代码 电机AB相增量型编码器的介绍和解码方法在这里介绍过了 电机编码器 https://blog.csdn.net/m0_57585228/article/details/125791283 测速可以使用外部中断进行脉冲计数 很多型号的单片机中有专门的电路来计算脉冲的速度和

    2023年04月18日
    浏览(50)
  • 关于stm32旋转编码器计次乱跳问题(消抖)

    旋转编码器A口接GPIOB0,B口接GPIOB1。设置中断类型为上升下降沿均触发。 输出是用0.96寸oled输出 A脚设置为上升下降沿均会进中断,下降上升一个变换周期,判断这个周期的A脚,B脚的始末状态,来判断正反转一次。 A口输出的波形用来中断,B口输出的波形用来判断正转还是反转

    2024年02月16日
    浏览(32)
  • 【单片机】STM32单片机读取旋转编码器,TIM定时器编码器模式捕获,程序

    旋转编码器简单来说,就是会输出2个PWM,依据相位可以知道旋转方向,依据脉冲个数可以知道旋转的角度。一般旋转一圈有一个固定数值的脉冲个数。 旋转编码器广泛用于电机、或者角度传感器,STM32的定时器可以直接接入这两个波形获取到信息。 前两个引脚(接地和Vcc)

    2024年02月13日
    浏览(38)
  • 【STM32】STM32学习笔记-对射式红外传感器计次 旋转编码器计次(12)

    相关头文件: misc.h 1.1 NVIC_PriorityGroupConfig函数 1.2 NVIC_PriorityGroup类型 1.3 NVIC_Init函数 1.4 NVIC_InitTypeDef类型 NVIC_IRQChannel取值 成员NVIC_IRQChannelPreemptionPriority可赋的值:最大取值15,具体有上面设置的优先级组中规定的位数决定 成员NVIC_IRQChannelSubPriority可赋的值:最大取值15,具体有

    2024年01月15日
    浏览(37)
  • STM32自学笔记16-步进电机驱动项目-磁编码器的校准

    上节我把MT6816的驱动给大致整明白了,接下去需要看看如何 校准 。 为什么编码器需要校准? 如上节所说,MT6816是一款 绝对值编码器 ,它为每个测量位置分配了唯一的二进制代码或字, 即使断电,也可以跟踪编码器的确切位置 。 但是由于硬件或其他因素的影响,编码器输

    2024年02月16日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包