当前位置: 首页 > news >正文

STM32 对射式红外传感器配置

这次用的是STM32F103的开发板(这里面的exti.c文件没有how to use this driver 配置说明)

对射式红外传感器

由一个红外发光二极管和NPN光电三极管组成,M3固定安装孔,有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。有遮挡,输出高电平。无遮挡,输出低电平。使用3.3-5VDC 宽电压LM393比较器输出,信号干净,波形好,驱动能力强,超过15mA。输出形式:数字开关量输出(0和1)。广泛用于电机转速检测,脉冲计数,位置限位等。

引脚:

VCC:接电源正极3.3V-5V

GND:接电源负极

DO:TTL开关信号输出

AO:此模块不起作用

操作说明:

1、接好VCC和GND,模块电源指示灯会亮
2、模块槽中无遮挡时,接收管导通,模块DO输出低电平,开关指示灯亮;遮挡时,DO输出高电平,开关指示灯灭。
3、模块DO可与继电器相连,组成限位开关等功能,也可以与有源蜂鸣器模块相连,组成报警器。
4、DO输出接口可以与单片机10口直接相连,一般接外部中断,检测传感器是否有遮档,如用电机码盘则可检测电机的转速。

原理:

测距离: 测速传感器输出为脉冲信号,一个脉冲中断一次;红外射线导通的时候是低电平,所以我们设置中断为低电平触法模式。一般码盘上有整数格子,无论是多少格其实原理一样,例如10格码盘,也就是有10个空格子,电机转一圈后便是射线导通10次,外部低电平触法10次;安装上面的思路,我们的测速传感器就可以发挥出效果了,我们知道一圈就有10个中断,于是我们计算中断次数,得到的总次数除于10也就是电机转动次数了,然后按照轮子的周长,计算轮子一圈是多长,就可以推算出小车已经跑多远了。

测速度: 按照测距离的思路,我们用一个MCU定时器计算,1秒内接收多少个外部中断,例如一秒内接收了20个外部中断,我们就可以判断小车速度为1秒小车轮子转两圈,然后再计算出小车轮子的周长,就可得知小车1秒行驶的速度。

接线图:

代码配置:

分为GPIO配置、中断线与GPIO引脚的连接、EXTI配置、NVIC配置(与上一章的按键中断一样)

EXTI函数解析:

//调用它,就可以把EXTI的配置都清除,恢复成上电的默认的状态
void EXTI_DeInit(void);//调用这个函数,就可以根据这个结构体里的参数配置EXTI外设,初始化EXTI要用到这个函数
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//调用这个函数,可以把参数传递的结构体变量赋一个默认值
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//这个函数是用来软件触发外部中断的,调用这个函数,参数给一个指定的中断线,就能软件触发一次外部中断
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

在外设运行的过程中,会产生一些状态标志位   比如外部中断来了,会有一个挂起的寄存器置了一个标志位,对于其他外设,如串口收到数据,会置标志位,定时器时间到也会置标志位,这些标志位都是放在状态寄存器的,当程序想要看这些标志位时,就会用到这四个函数

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//可以获取指定的标志位是否被置1void EXTI_ClearFlag(uint32_t EXTI_Line);//可以对置1的标志位进行清除//在中断函数里,如果你想查看标志位和清除标志位,用下面两个函数
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//获取中断标志位是否被置1void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清楚中断挂起标志位

总结:如果想要在主程序里查看和清除标志位,就用上面两个函数。

           如果想要在中断函数里查看和清除标志位,就用下面两个函数。

NVIC函数解析:

//这个函数是用来中断分组的,参数是中断分组的方式
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//根据结构体里面指定的参数初始化NVIC
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//设置中断向量表
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//系统低功耗配置
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);

代码:

void CountSensor_Init(void)
{//------------------------定义结构体变量-----------------------------------GPIO_InitTypeDef GPIO_InitStructure;								//定义GPIO结构体变量EXTI_InitTypeDef EXTI_InitStructure;								//定义EXTI结构体变量NVIC_InitTypeDef NVIC_InitStructure;								//定义NVIC结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	//开启AFIO的时钟//---------------------GPIO配置--------------------------------------GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;			//模式选择上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;   			//配置引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //速率GPIO_Init(GPIOB,&GPIO_InitStructure);	                //GPIO初始化//---------------------GPIO配置--------------------------------------GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//将中断线与GPIO引脚连接//---------------------EXTI配置--------------------------------------EXTI_InitStructure.EXTI_Line = EXTI_Line14; 					//配置中断线EXTI_InitStructure.EXTI_LineCmd =  ENABLE;  					//中断使能EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 	        //选择中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;         //下降沿触发EXTI_Init(&EXTI_InitStructure);//---------------------EXTI配置--------------------------------------NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组,这里放到模块函数里了,一般情况放在主函数第一行(如上一章按键中断)//---------------------NVIC配置--------------------------------------NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;				//选择中断通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;					    //使能中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;		    //抢占优先级配置NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;					//响应优先级配置NVIC_Init(&NVIC_InitStructure);//---------------------NVIC配置--------------------------------------}

中断函数:

uint16_t CountSensor_Count;
//中断函数
void EXTI15_10_IRQHandler(void)
{//判断中断标志位是否为 1 EXTI_GetITStatus的返回值为 SET(1)  或者RESET(0)if(EXTI_GetITStatus(EXTI_Line14) == SET){//判断电平,以免发生抖动if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == 0){CountSensor_Count++;}//中断标志位置1,程序就会跳转到中断函数,//如果不清除中断标志位,就会一直申请中断,这样就会不断响应中断,执行中断函数,//程序就会卡死在中断函数里,所以每次中断程序结束后,都应该清除一下中断标志位EXTI_ClearITPendingBit(EXTI_Line14);}}//返回值
uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}

主函数:

功能:挡住传感器模块槽,OLDE显示数字变化+1

#include "CountSensor.h"
int main(void)
{LED_Init();OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, "Count:");while(1){OLED_ShowNum(1, 7, CountSensor_Get(),5);}	}


 

相关文章:

STM32 对射式红外传感器配置

这次用的是STM32F103的开发板(这里面的exti.c文件没有how to use this driver 配置说明) 对射式红外传感器 由一个红外发光二极管和NPN光电三极管组成,M3固定安装孔,有输出状态指示灯,输出高电平灯灭,输出…...

12 款开源OCR发 PDF 识别框架

2024 年 12 款开源文档解析框架的选型对比评测:PDF解析、OCR识别功能解读、应用场景分析及优缺点比较 这是该系列的第二篇文章,聚焦于智能文档处理(特别是 PDF 解析)。无论是在模型预训练的数据收集阶段,还是基于 RAG…...

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…...

CVE-2020-0796永恒之蓝2.0(漏洞复现)

目录 前言 产生原因 影响范围 漏洞复现 复现环境 复现步骤 防御措施 总结 前言 在网络安全的战场上,漏洞一直是攻防双方关注的焦点。CVE-2020-0796,这个被称为 “永恒之蓝 2.0” 的漏洞,一度引起了广泛的关注与担忧。它究竟是怎样的…...

游戏策划的分类

P3游戏策划分类 1.程序2.美术3.策划 程序:一般分为客户端程序和服务器程序 客户端程序一般负责游戏的前端画面表现 服务器程序负责游戏的后端运算 美术:角色原画,角色模型动作,场景原画,场景模型,UI设计&a…...

单片机基础模块学习——PCF8591芯片

一、A/D、D/A模块 A——Analog 模拟信号:连续变化的信号(很多传感器原始输出的信号都为此类信号)D——Digital 数字信号:只有高电平和低电平两种变化(单片机芯片、微控制芯片所能处理的都是数字信号) 下面…...

深入探索 HTML5 拖拽效果 API:打造流畅交互体验

在现代的 Web 开发中,交互性和用户体验一直是开发者关注的重点。HTML5 的拖拽效果 API (Drag and Drop API) 提供了一种非常直观的方式来让网页元素或文件能够被拖动并放置到页面的指定位置,极大提升了用户的交互体验。本篇文章将深入探讨如何使用 HTML5…...

【Healpix】python一种用于将球面划分为均匀区域的技术

Healpix 1、简介2、Healpix的基本原理3、Healpix的优点4、安装及使用4.1 安装healpy4.2 创建Healpix地图4.3 读取和写入Healpix数据4.4 数据插值 5、案例5.1 案例一:宇宙微波背景辐射(CMB)分析5.2 案例二:星系分布分析5.3 案例三&…...

Go:基于Go实现一个压测工具

文章目录 写在前面整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理 客户端模块Http客户端处理Grpc客户端处理Websocket客户端处理 连接处理模块GrpcHttp 统计数据模块统计原理实现过程 写在前面 本篇主要是基于Go来实现一个压测的工具,关于压测的内…...

算法-加油站问题

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧! function canCompleteCircuit(gas, cost) {// 加油站的总数const n gas.length;// 记录总剩余油量,若总剩余油量小于 0,说明无法绕环…...

UART ,IIC 和SPI三种总线协议

1.UART 1.1 简介 UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发器。 常见的串行、异步通信总线,两条数据线Tx、Rx,实现全双工通信,常用于主机与外设的通信,点对点。 1.2 硬件连接 交叉…...

Padas进行MongoDB数据库CRUD

在数据处理的领域,MongoDB作为一款NoSQL数据库,以其灵活的文档存储结构和高扩展性广泛应用于大规模数据处理场景。Pandas作为Python的核心数据处理库,能够高效处理结构化数据。在MongoDB中,数据以JSON格式存储,这与Pandas的DataFrame结构可以很方便地互相转换。通过这篇教…...

动手学图神经网络(6):利用图神经网络进行点云分类

利用图神经网络进行点云分类 引言 在本教程中,大家将学习使用图神经网络(Graph Neural Networks, GNN)进行点云分类的基本工具。给定一组对象或点集的数据集,将这些对象嵌入到一个特征空间中,使得它们在特定任务下能够分类。将原始点云作为神经网络的输入,让网络学习捕…...

C语言从入门到进阶

视频:https://www.bilibili.com/video/BV1Vm4y1r7jY?spm_id_from333.788.player.switch&vd_sourcec988f28ad9af37435316731758625407&p23 //枚举常量 enum Sex{MALE,FEMALE,SECRET };printf("%d\n", MALE);//0 printf("%d\n", FEMALE…...

Python中容器类型的数据(下)

集合 集合 (set) 是一种可迭代的、无序的、不能包含重复元素的容器类型的数据。 Python中的集合是一种重要的数据结构,以下为你详细介绍: 定义与特点 无序性:集合中的元素没有固定顺序, {1, 2, 3} 和 {3, 2, 1} 在Python中是同一…...

MySQL 用户相关的操作详解

MySQL 5.x 用户操作 创建用户 在 MySQL 5.x 中,使用 GRANT 语句创建用户并授权: 语法 GRANT ALL PRIVILEGES ON *.* TO usernamehost IDENTIFIED BY password;username:用户名 host:指定用户可访问的主机,例如 loca…...

如何删除hugging face dowloaded的llm model?

如何删除hugging face dowloaded的llm model? 在现在需要使用llm进行research的情况下,经常会出现,由于下载模型太多,导致内存问题,然后需要删除某些不用的模型的情况,那么如何找到hugging face的模型保存…...

Vue 封装http 请求

封装message 提示 Message.js import { ElMessage } from "element-plus";const showMessage (msg,callback,type)>{ElMessage({message: msg,type: type,duration: 3000,onClose:()>{if (callback) {callback();}}}); }const message {error: (msg,…...

恒源云云GPU服务器训练模型指南

1数据上传 为了更方便的上传数据与下载数据,本例程采用xftp来完成数据的传输与下载。 XFTP下载链接,选择学生免费试用即可 2服务器的选择以及开启: 控制台->我的实例->点击创建实例 一般选择按量付费 接下来根据自己代码的torch版本…...

Spring Boot应用中实现基于JWT的登录拦截器,以保证未登录用户无法访问指定的页面

目录 一、配置拦截器进行登录校验 1. 在config层设置拦截器 2. 实现LoginInterceptor拦截器 3. 创建JWT工具类 4. 在登录时创建JWT并存入Cookie 二、配置JWT依赖和环境 1. 添加JWT依赖 2. 配置JWT环境 本篇博客将为大家介绍了如何在Spring Boot应用中实现基于JWT的登录…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...