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

2023-05-16

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

  • 前言
    • 使用工具
    • 旋转编码器原理介绍
    • 方法一 定时器中断方式(实质就是外部中断)
    • 方法二 定时器方式

前言

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

使用工具

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

旋转编码器原理介绍

在这里插入图片描述
图中C端为GND。
方向:A相和B相相差一个相位,一般来说是90°。A相信号在前表示正转,B相信号在前表示反转。
在这里插入图片描述
上图是模块的原理图,实物图如下:
在这里插入图片描述

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

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

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

在这里插入图片描述在主函数中添加:

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的配置和上面一样,只是修改了程序使用不同的方法。
在这里插入图片描述

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

  __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的资源。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Windows+VS+OpenCV(多版本)环境配置

    Index 目录索引 写在前面1 OpenCV 的安装2 OpenCV 在 VS 中的配置配置方法一配置方法二 3 不同 OpenCV 版本的切换附录 查看OpenCV 版本的代码 写在前面 本篇文章记录如何安装OpenCV xff0c 以
  • 使用双天线G-RTK+Ardupilot小车完成厘米精度自动导航 pixhawk px4

    作为多年使用PIXHAWK的玩家 xff0c 相信大家或多或少被磁罗盘报错折磨过 由于磁非常容易受周围环境的干扰和自身结构的金属部分干扰 经常我们今天校准好的罗盘 xff0c 什么也没动 xff0c 明天上电发现罗盘报错 对于330 450
  • Cmake基础知识讲解

    本文主要参考https www cnblogs com cv pr p 6206921 html 1 CMake编译原理 CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写C
  • 基于opencv的ArUco的视觉定位之ArUco安装

    小编之前在前面的文章里是通过安装opencv 43 contirb来实现使用aruco xff0c 但在进行aruco的源码学习时 xff0c 发现不少类contirb里库是没有的 xff0c 于是不得不再装一个独立的aruco的库 xff
  • 使用opencv的aruco库进行位姿估计

    1 姿态估计在许多计算机视觉应用中非常重要 xff1a 机器人导航 xff0c 增强现实等等 该过程基于查找真实环境中的点与其2D图像投影之间的对应关系 这通常是一个困难的步骤 xff0c 因此通常使用合成或基准标记使其更容易 最流行的方法
  • linux centos 命令行 安装 teamviewers ___yyw合并版

    参考 xff1a 1 http blog csdn net changgongzhao article details 52299314 2 http blog csdn net dreamhai article details 57080
  • aruco字典如DICT_4X4_50含义

    其中DICT是dictionary的缩写 xff0c 4x4位表示marker标记要被划分的位数 xff0c 边界为1比特位 xff0c 所以4x4的marker识别时会被分割为6x6格 xff0c 如下图时6x6的 最下面的个数时字典里包
  • 单片机如何发出类似和弦的声音

    蜂鸣器声音优化 1 优化思路 蜂鸣器的控制 xff0c 在单片机领域 xff0c 大多数人都是给一定周期的脉冲 xff0c 蜂鸣器就会发出声音 xff0c 而本质上 xff0c 蜂鸣器只是一个金属弹片 xff0c 声音大小取决于弹片的幅值
  • 3年5年10年的嵌入式工程师,他们的区别在哪里

    嵌入式工程师与嵌入式工程师的区别在哪里 1 维度1 1 基础知识1 2 项目心态1 3 技术架构1 4 技术视野1 5 成熟方案1 6 一通百通1 7 选型能力1 8 其他能力 2 还有其他要说的 做过很多项目 xff0c 招了一些人 xf
  • 陀螺稳定云台控制流程图

    陀螺稳定云台控制流程图 控制流程图 手持云台控制流程图 xff0c 主要是一个串级PID xff0c 位置环和速度环 xff0c 当然了FOC电流环 xff0c 不在这个流程里 xff0c 位置环100HZ xff0c 速度环500HZ x
  • 电机的力矩计算

    1 转动惯量的公式 1 1 转矩如何计算 转矩等于转动惯量乘以角加速度 xff0c 然后我们要注意一下单位 xff0c 转矩的单位是NM 转动惯量的单位是kg m2 角加速度单位是rad s2 M 61 I B M是转矩 xff0c I 是
  • 电流采样运放参数

    关于运放参数 在我们做电流采样的时候 xff0c 压摆率这个参数很重要 xff0c 如果压摆率太小 xff0c 跟不上电流的变化带来的电压变化 xff0c 那么我们采样就不会准确 xff0c 在FOC算法里面 xff0c 一个完美的正弦波采
  • ICM42688初始化流程

    ICM42688初始化流程 1 陀螺仪复位 2 设置量程 3 关闭FIFO 4 关闭同步时钟 5 配置时间戳 xff0c 打开fifo 6 设置INTI引脚引脚属性为推挽及设置有效极性为高电平 7 配置中断 8 中断异步复位 9 配置陀螺和
  • FOC控制之小A小B小C是如何追求小D的

    1 写在前面 随着电动汽车的热火 xff0c 关于FOC控制技术的文章这几年在网络上可谓是一搜一大把 xff0c 各种理论分析 xff0c 公式推导 xff0c 应有尽有 通过这些文章 xff0c 可以看出大佬还是很多的 另外也有FOC的开
  • 手把手教你调试Pixhawk垂直起降参数

    Pixhawk垂直起降参数 1 写在前面 本来想写个垂直起降手把手教你调试的 xff0c 由于作者也没有太多的时间给大家拍照并现场调试 xff0c 鉴于很多朋友问我里面的参数问题 xff0c 干脆写点东西算了 2 参数列表及解释 VT AR
  • 三分钟教你玩转cubeMX+USB+FATFS+FREERTOS

    1 真的只要三分钟吗 xff1f 可能还不要 xff0c cubeMX的强大 xff0c 你想都想不到 话不多说 xff0c 直接开始 2 配置过程 配置时钟源 配置USB 配置FATFS 配置FREERTOS xff0c 与其说是配置 x
  • 数据清洗总结

  • keil里面while循环条件已经为假了,可是跳不出去的问题

    1 背景 笔者把公司里面很古老的一套程序从IAR的编译环境移植到KEIL环境下 xff0c 启动文件等问题全部都解决了 xff0c 能正常编译了 但是卡在了一个while xff08 send flag xff09 的一个循环里面 send
  • STM32的HAL库串口编程

    1 需求 1 收到数据 xff0c 放入缓存 2 取出数据进行协议解析 2 问题 HAL库的接收函数 xff0c 指定接收固定数长的数据 中断方式接收 HAL StatusTypeDef HAL UART Receive IT UART H
  • 二级倒立摆的建模、线性化S函数的PID控制以及非线性化S函数的PID控制

    1 二级倒立摆的非线性建模 首先对于下面这种二级倒立摆 xff0c 对其进行建模 xff1a 进行以下参数假设 xff1a 可以通过参考论文 xff0c 使用牛顿运动定律和拉格朗日方程 xff0c 结合 1和 2无外力作用 xff0c 列出

随机推荐