STM32应用霍尔转速传感器基于输入捕获

2023-05-16

这里我用通用定时器3的通道1来测量转速

  • 霍尔转速传感器基本介绍
    • 霍尔传感器分类和原理
    • 关于为什么选用开关型常开PNP型霍尔传感器
  • STM32程序实现
    • 程序介绍
    • 程序源码
      • TIM3_CAP.H
      • TIM3_CAP.H解读
      • TIM3_CAP.C
      • TIM3_CAP.C解读
      • TIM3中断函数解读
      • MAIN.C
      • MAIN.C解读
    • 结果
    • 工程文件

霍尔转速传感器基本介绍

霍尔传感器分类和原理

我用的是开关型常开PNP型的霍尔传感器

开关型的有2种分类,一种是常开,另外一种就是常闭了
关于什么常开常闭,请看下图
在这里插入图片描述

常开通俗来讲,就是霍尔传感器没有检测到磁铁的时候开关就是断开的,常闭相反

霍尔传感器具体分类
在这里插入图片描述

图片来自淘宝链接

说明

  • DC-直流
  • AC交流
  • NO-常开
  • NC-常闭

关于为什么选用开关型常开PNP型霍尔传感器

单片机只能接收高低电平,0或者是1,
开关型常开的霍尔传感器刚好符合单片机的这个特性
检测到磁铁的时候就输出高电平或者低电平,
PNP型就是检测到磁铁的时候的输出高电平,没有检测到的时候就是低电平
实验中,给霍尔传感器5V供电,检测到磁铁,霍尔传感器就输入5V,没有检测到就是0V了
实物图
在这里插入图片描述

STM32程序实现

程序介绍

单片机STM32F103ZE
霍尔5V供电,传感器数据输出线接PA6
定时器3 通道1 输入捕获模式

程序源码

TIM3_CAP.H

#ifndef __TIM3_CAP_H
#define __TIM3_CAP_H
#include "sys.h" 


extern u32 TIM3_RES;//保存2次高电平之间的时间
extern u16 TIM3_CAP;//保存第二次捕获高电平时候的计数器的数值
extern u8 TIM3_FLAG;//逻辑标志


void tim3_cap_init(u16 arr,u16 psc);


#endif

TIM3_CAP.H解读

定时器只能在捕获到高电平的时候,把当前计数器的数值保存下次,由于我们需要计算2次高电平的时间,所有需要一个逻辑位TIM3_FLAG
TIM3_CAP用于保存第2次定时器捕获高电平时候的计数器的数值
TIM3_RES是2次高电平总的计数器的数值
TIM3_RES乘以计数器每计一个数的时间就是总的时间了

TIM3_CAP.C

#include "TIM3_CAP.h"


//定时器3  通道1  输入捕获模式

u32 TIM3_RES;//保存2次高电平之间的时间
u16 TIM3_CAP;//保存第二次捕获高电平时候的计数器的数值
u8 TIM3_FLAG;//逻辑标志

void tim3_cap_init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<1;//开启定时器3的时钟
	RCC->APB2ENR|=1<<2;//开启PA时钟
	GPIOA->CRL&=0XF0FFFFFF;//PA6配置清零
	GPIOA->CRL|=0X08080000;//PA6下拉输入 默认下拉
	GPIOA->ODR|=0<<6;//PA6下拉
	
	TIM3->ARR=arr;//设置自动重载值
	TIM3->PSC=psc;//设置预分频值
	//*********通道1设置
	TIM3->CCMR1|=1<<0;//选择输入端 IC1 映射到 TI1 上
	TIM3->CCMR1|=0<<2;//输入不分频
	TIM3->CCMR1|=0<<4;//不滤波
	
	TIM3->CCER|=1<<0;//允许通道1捕获计数器的值到捕获寄存器中
	TIM3->CCER|=0<<1;//通道1上升沿捕获
	
	TIM3->DIER|=1<<0;//允许更新中断
	TIM3->DIER|=1<<1;//允许通道1捕获中断
	MY_NVIC_Init(2,0,TIM3_IRQn,2);//抢占2,子优先级0,组2
	
	TIM3->CR1|=1<<0;//开启定时器3
}

void TIM3_IRQHandler(void)
{
	if((TIM3_FLAG&0X80)==0)//还未成功捕获	
	{
		if(TIM3->SR&0X01)//溢出
		{	    
			if(TIM3_FLAG&0X40)//已经捕获到高电平了
			{
				if((TIM3_FLAG&0X3F)==0X3F)//高电平太长了
				{
					TIM3_FLAG|=0X80;//标记成功捕获了一次
					TIM3_CAP=0XFFFF;
				}else TIM3_FLAG++;
			}	 
		}
		if(TIM3->SR&0x02)//捕获1发生捕获事件
		{	
			if(TIM3_FLAG&0X40)		//捕获到一个上升沿 		
			{	  			
				TIM3_FLAG|=0X80;		//标记成功捕获到一次高电平脉宽
			    TIM3_CAP=TIM3->CCR1;	//获取当前的捕获值.
			}else//还未开始,第一次捕获上升沿
			{
				TIM3_FLAG=0;			//清空
				TIM3_CAP=0;
				TIM3_FLAG|=0X40;		//标记捕获到了上升沿
	 			TIM3->CNT=0;	//计数器清空
			}		    
		}			     	    					   
 	}
	TIM3->SR=0;//清除中断标志位
}

TIM3_CAP.C解读

  1. 首先开启定时器3和GPIOA的时钟
 	RCC->APB1ENR|=1<<1;//开启定时器3的时钟
 	RCC->APB2ENR|=1<<2;//开启PA时钟
  1. 接着设置PA6为下拉输入,为什么下拉输入,因为我们需要捕获高电平,如果你要捕获低电平,设置PA6为上拉输入,然后设置定时器下降沿捕获
	GPIOA->CRL&=0XF0FFFFFF;//PA6配置清零
	GPIOA->CRL|=0X08080000;//PA6下拉输入 默认下拉
	GPIOA->ODR|=0<<6;//PA6下拉
  1. 设置定时器的自动重载值和预分频值
	TIM3->ARR=arr;//设置自动重载值
	TIM3->PSC=psc;//设置预分频值
  1. 设置通道1为输入不分频,不滤波
	TIM3->CCMR1|=1<<0;//选择输入端 IC1 映射到 TI1 上
	TIM3->CCMR1|=0<<2;//输入不分频
	TIM3->CCMR1|=0<<4;//不滤波

关于什么是分频,什么是滤波

滤波
首先看STM32中文参考手册中的介绍
在这里插入图片描述
我的理解就是输入捕获采样频率也就是速度

分频
贴上官方介绍
在这里插入图片描述
就是每几个高电平触发一次捕获
如果你设置每2个事件触发一次捕获,那么检测到2次高电平的时候才会把当前的计数器的数值保存到TIM3->CCR1寄存器中

什么是TIM3->CCR1寄存器呢
看官方的介绍就知道了
在这里插入图片描述
也就是保存捕获的时候计数器的数值

  1. 计数器的值能捕获入TIM3_CCR1寄存器和设置上升沿捕获
	TIM3->CCER|=1<<0;//允许通道1捕获计数器的值到捕获寄存器中
	TIM3->CCER|=0<<1;//通道1上升沿捕获
  1. 开启定时器更新中断和通道1捕获中断
	TIM3->DIER|=1<<0;//允许更新中断
	TIM3->DIER|=1<<1;//允许通道1捕获中断
  1. 设置中断分组和优先级
	MY_NVIC_Init(2,0,TIM3_IRQn,2);//抢占2,子优先级0,组2
  1. 开启定时器3
	TIM3->CR1|=1<<0;//开启定时器3

TIM3中断函数解读

TIM3_FLAG是8位的,其中第7位用于标志第一次捕获,如果检测到第一次捕获就置1,第8位用于标志第二次捕获,检测到了就置1,1~6用于在检测到第一次捕获的时候定时器更新的次数
在这里插入图片描述

MAIN.C

#include "sys.h"
#include "usart.h"		
#include "delay.h"
#include "led.h"
#include "tim3_cap.h"





int main(void)
{
	Stm32_Clock_Init(9);	//系统时钟设置
	delay_init(72);	  		//延时初始化
	uart_init(72,115200); 	//串口初始化为115200
	tim3_cap_init(0XFFFF,72-1);//每计一个数1us   每溢出一次10ms
	led_init();				//LED初始化
  	while(1)
	{
		if(TIM3_FLAG&0X80)
		{
			TIM3_RES=TIM3_FLAG&0X3F;
			TIM3_RES*=65536;					//溢出时间总和
			TIM3_RES+=TIM3_CAP;		//得到总的高电平时间
			printf("%.3fs\r\n",0.000001*TIM3_RES);	//打印总的高点平时间
			TIM3_FLAG=0;			//开启下一次捕获
		}
		LED1=!LED1;
		delay_ms(200);
	}
} 

MAIN.C解读

主函数是检测到2次高电平就通过串口打印出高电平的时间

以下头文件中是用了原子哥的头文件

#include "sys.h"
#include "usart.h"		
#include "delay.h"

结果

LED1每0.2s切换亮灭状态一次,故每0.4s亮一次,结果和下图一样
在这里插入图片描述

用飞线把PA6(通道1)和PE5(LED1)连接起来
在这里插入图片描述

工程文件

工程文件 链接

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

STM32应用霍尔转速传感器基于输入捕获 的相关文章

  • 如何在手机或平板上编写代码?

    下面给大家推荐一款免费的 在线协作式 基于浏览器的 IDE的在线编程网站 支持语言包括 Java C 43 43 C C JavaScript CSS PHP等50多种主流开发语言 地址 The collaborative browser
  • 羊了个羊, 低配版开源代码来啦~

    前几天朋友圈突然被一个小游戏 羊了个羊 刷屏了 xff0c 出于好奇我也打算小玩一把试试 xff0c 结果没想到上头了 游戏的玩法非常简单 xff0c 类似 消消乐 xff0c 从一堆方块中找到相同图案的 3 个方块并消除即可 但没想到 x
  • MySQL 使用索引和不使用索引的区别(附17W条数据SQL文件)

    MySQL 使用索引可以减少查询的时间 xff0c 而不使用索引的查询会更加耗时 xff0c 因为MySQL需要扫描整个表 此外 xff0c 使用索引可以提高查询的性能 xff0c 同时也可以提高查询的可读性和可维护性 换句话来说 使用索引
  • 如何使用AI来帮你写代码(Cursor使用教程)

    x1f4ac 产品介绍 cursor是一个新的Ide xff0c 它使用Ai来帮助您重构理解调试并使用Cursor编写代码我们的目标是使构建软件的过程更快 更愉快 我们从头开始构建了一个代码编辑器 xff0c 对我们的第一个功能进行了原型设
  • [Java多线程-基础] 如何定位线程中的死锁问题?

    x1f512 死锁代码 下面提供的代码演示了死锁的情况 程序创建了两个线程 xff0c 线程1和线程2 xff0c 它们都试图以不同的顺序获取两个不同的资源 xff0c resource1和resource2 线程1首先获取resource
  • [Java多线程-基础] 避免线程死锁问题(ReentrantLock的使用)

    ReentrantLock 的设计初衷是为了提供一种比 synchronized 更加灵活和可控的锁机制 与 synchronized 相比 xff0c ReentrantLock 提供了更多的功能 xff0c 如可重入性 公平锁和中断锁等
  • IDEA插件:智能代码生成器,附带注释和性能/安全检测功能

    x1f680 1 安装插件 在插件中搜索关键字 biot 点击安装 x1f680 2 代码生成 右侧的侧边栏点击biot后 在下方的输入框中输入你要问的内容 x1f680 3 biot AI 选中选区中的代码 点击鼠标右键让ai来帮你改代码
  • 安装Windows Server 2016 服务器 标准版

    注意事项 xff1a 安装带桌面版的 管理员密码设置 xff0c 要 注意大小写加数字 xff0c 不然会设置失败 安装文件下载 xff1a MSDN 我告诉你 PE U盘 微PE 服务器的驱动 xff0c 可以自己到对应服务器厂家的官网上
  • 第五节:基于Pytorch的相关可视化

    第五节 xff1a 基于Pytorch的相关可视化 在Pytorch发布后 xff0c 网络及训练过程的可视化工具也相应的被开发出来来帮助用户监督所建立的模型的结构和训练过程 本章将讲解HiddenLayer库 xff0c HiddenLa
  • 第六节:Pytorch实现全连接神经网络

    第六节 xff1a Pytorch实现全连接神经网络 前面的五节中 xff0c 我们讲解了使用PyTorch搭建一个神经网络中需要的需要各种技巧 xff0c 包括 xff1a 网络的搭建 选择不同的实践技巧 xff08 优化器选择 学习率下
  • 使用Visual Studio Code开发Arduino踩坑日记(持续更新)

    使用Visual Studio Code开发Arduino踩坑日记 持续更新 文章目录 使用Visual Studio Code开发Arduino踩坑日记 持续更新 1 在browse path中未找到包含文件问题描述问题分析解决思路解决过
  • 小白安装Ubuntu 18.04 LTS

    文章目录 小白安装Ubuntu 18 04 LTS作者 xff1a 王仕鸿日期 xff1a 2020 10 10 前言 xff08 可跳过 xff09 Ubuntu介绍操作系统介绍Ubuntu介绍 安装Ubuntu 18 04 LTS步骤一
  • 1_ROS基础

    ROS基础 本章讲解ROS中最基础的概念 不明白这些概念是没法学懂ROS的 学习了这些概念 后面我们将通过实操来在实践的过程中进一步体会 ROS是什么 ROS Robot Operating System 机器人操作系统 是一个提供一系列程
  • 2_ROS中的命令行工具

    ROS中的命令行工具 ROS中为我们提供了丰富的命令行工具 帮助我们进行代码的编写 调试 测试 框架的搭建 数据的显示等等 大图如下 所有的命令大致可以分为四类 分别是运行相关命令 编译相关命令 包制作管理相关命令 项目创建相关命令 下面进
  • 3_ROS创建工作空间和功能包

    3 ROS创建工作空间和功能包 前面我们讲解了ROS中的核心概念和使用ROS进行开发时候必须用到的命令行工具 下面我们就正式开始ROS中的开发 我们首先从创建工作空间和功能包开始 1 工作空间WorkSpace 工作空间是ROS中非常重要的
  • 4_Publieher的编程实现

    4 Publisher的编程实现 我们前面讲解了如何创建工作空间和功能包 但是我们都仅仅只创建了一个空的工作空间和功能包 什么都没有实现 我们想要进一步为功能包添加功能 就不可避免的需要添加Publisher和Subscriber 下面我们
  • 1.Latex介绍

    Latex介绍 本人鸿神 目前就读于XJTU 是一个即将开始科研的小白 既然做科研未来就无法避免发表论文 而发表论文就需要用到一系列的工具 Latex就是其中之一 谨以此文记录我的科研路 也希望Latex这一系列文章能够帮到各位 1 什么是
  • 2.Latex安装和TeXworks Editor基础

    二 Latex安装和TeXworks Editor使用教程 上一章我们讲解了什么是Latex和为什么我们要学习Latex 从这一章开始我们就要正式开始学习Latex 就像前面所讲的 Latex包含编译器和编辑器 我们需要在编辑器中编写夹杂代
  • 关于“ErrorFlash Download failed“Cortex-M3”的解决办法

    首先 xff0c 将仿真器连接电脑 xff0c 然后打开KEIL xff0c 点击FLash gt Erase xff0c 擦除Flash试一下 如果擦除不成功 xff0c 那么应该是的STM32的Flash被锁了 xff0c 要解锁一下
  • 3.Latex语法基础:命令与环境

    三 Latex语法基础 命令与环境 前面我们已经做好了开始编写Latex的一切准备工作 从这章开始 我们将开始讲解Latex语法 本章将讲解Latex语法的基础 命令与环境 1 命令与环境 命令 什么是命令 不同于其他编程语言 C C 43

随机推荐

  • Arduino多种传感器使用方法

    Arduino项目 智能窗户 前段时间参加了一个Arduino的比赛 具体内容就是用Arduino设计一个项目出来 我在的队伍的设计的项目就是智能窗户 智能窗户可以采集本地传感器采集到的环境参数 根据参数具有一套内部的逻辑判断 可以对温度
  • Paxos算法

    Paxos算法 Paxos算法是一系列共识算法中的一个 其目的就是为了解决共识 一致性问题 这个Github连接中详细的列出了多种共识算法 还有一些工程实践的例子 腾讯 Zookeeper Handpoo下的一个分布式框架 Handoop是
  • Python中的推导式

    推导式 Compression 推导式 Compression 是Python语言的一大特色 相比于其他语言而言 推导式使得Python能够编辑的进行循环 创建出特定的字典 列表等可迭代对象 使用推导式可以避免代码的冗长 简化代码风格 使得
  • A* 算法 Python实现

    A 算法 Python实现 最近考试周 没时间封装的很好 代码分两部分 定义和调用部分 定义部分 span class token keyword import span numpy span class token keyword as
  • Pytorch中使用TensorBoard

    本文记录了如何在Pytorch中使用Tensorboard xff08 主要是为了备忘 xff09 Pytorch中使用TensorBoard 虽然我本身就会用TensorBoard xff0c 但是因为TensorBoard只有在写训练代
  • A*算法-Python实现

    好久没有在CSDN上发文章了 xff0c 快一年了吧 这两天重新登录了一下 xff0c 不看不知道 xff0c 一看吓一跳 xff0c 没想到访问量快13万了 之前写博客的时候 xff0c 想着把一些有用的东西写下来 xff0c 一方面是当
  • 哈夫曼压缩算法-Python实现

    前面上传了A 算法的实现 xff0c 就顺便把一起写的哈夫曼压缩也上传了吧 本文主要提供了Python版本的哈夫曼压缩算法实现 xff0c 并在此基础上提供了命令行和基于Qt的GUI用户界面 xff08 User Interface xff
  • 内存分段与内存分页:逻辑地址、物理地址、线性地址、虚拟地址

    这篇文章也是我自己的博客网站的里的文章 xff0c 我觉得这篇文章还是我觉得知识含量比较高的文章 xff0c 所以特地把它发出来看看 这篇文章写于我在写自己的操作系统JackOS的时候系统梳理了一下CPU访问内存的各种方式 xff0c 写完
  • VSCode调试C/C++项目

    最近写完了自己的操作系统 xff0c 深感有一个方便的调试环境是有多么重要 xff0c 能够提升不少开发效率 恰好最近在的技术交流群里群友在问如何搭建VSCode调试操作系统的环境 xff0c 刚考完试 xff0c 就先把这篇VSCode调
  • 误差与精度

    整理自 误差理论与数据处理 合肥工业大学 机械专业用于教授学生误差与精度概念的课程叫做 公差与测量 或者叫做 机械精度设计 xff0c 而公差或者精度的本质含义就是误差的大小 xff0c 公差越小 xff0c 误差越小 xff0c 精度越高
  • 两个类的头文件互相包含

    两个类的头文件互相包含 我做任务的时候遇到了两个类都互相包含对方的对象的问题 xff0c 本来是有错误的 xff0c 但经过我一番改动 xff0c 两个头文件互相包含同时 xff0c 每个头文件都含有令一个类的前置声明 虽然最后运行正确 x
  • 【C++ STL 容器】——vector

    概述 vector容器也被称作向量 xff0c 实现了动态的数组 xff0c 用于元素数量变化的对象数组 xff0c 算是比较常用的容器 常用函数 构造函数 vector 创建一个空vectorvector int size 创建一个vec
  • 2021-07-22

    MSP432在keil中通过CMSIS DAP下载程序出现cannot enter debug mode的解决办法 xff1a MSP432下载程序出现cannot enter debug mode 可以通过修改如下设置 Debug里面的两
  • 通信协议基础以及常用的串口通信协议

    通信协议 xff1a 串行通信和并行通信 在数据的通信方式中根据数据传输方式的不同可以分为 xff1a 串行通信和并行通信 串行通信 xff1a 串行通信是指使用一条数据线 xff0c 将数据一位一位地依次传输 xff0c 每一位数据占据一
  • Ubuntu安装ROS melodic,管理环境,创建工作空间

    一 安装ROS 1 设置源 xff1a sudo sh c 39 etc lsb release amp amp echo 34 deb http mirrors tuna tsinghua edu cn ros ubuntu 96 lsb
  • HTTP请求报文的结构组成及URL的结构组成

    HTTP请求报文 HTTP 超文本传输协议 Hypertext Transfer Protocol xff0c 简称HTTP 是应用层协议 HTTP 是一种请求 响应式的协议 xff0c 即一个客户端与服务器建立连接后 xff0c 向服务器
  • Qt之旅_001>>Qt常用窗口类之间的关系

    QApplication xff0c QGuiApplication QCoreApplication三者之间的关系 QCoreApplication处于core模块中 xff0c 为应用程序提供了一个非gui的时间循环 xff1b QGu
  • GPIO相关介绍

    文章目录 GPIO概念TXD与RXD GPIO的使用注意STM32IO口哪些兼容5V一定不要接超过5V的电压默认不能做输出的GPIO GPIO硬件原理图GPIO地址 GPIO的八种工作模式浮空输入带上拉输入带下拉输入模拟输入开漏输出推挽输出
  • STM32的常用C语言

    文章目录 一些被坑了的注意点 int16 define结构体与共用体指针 C语言发展史C语言概述C90 标准C99标准C11标准 C编译o代替c 条件语句else ifdo while 变量定义一个字符串字符串结尾 定义一个字符串数组sta
  • STM32应用霍尔转速传感器基于输入捕获

    这里我用通用定时器3的通道1来测量转速 霍尔转速传感器基本介绍霍尔传感器分类和原理关于为什么选用开关型常开PNP型霍尔传感器 STM32程序实现程序介绍程序源码TIM3 CAP HTIM3 CAP H解读TIM3 CAP CTIM3 CAP