了解人体红外传感器 HC-SR501 的驱动原理和STM32F030的中断机制,通过配置 STM32F030 芯片 GPIO 相关寄存器和外部触发中断实现人体红外传感器检测人体。
中断是指当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂停正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程就称为中断,我们把引起中断的原因,或者能够发出中断请求信号的来源统称为中断源。
NVIC,全称:Nested vectored interrupt controller,即嵌套向量中断控制器。Cortex-M0具有32个可屏蔽中断通道,4个可编程中断优先级(使用2位中断优先级),所有中断包括核心异常都由NVIC管理。中断优先级是指,假设有两个中断先后触发,已经在执行的中断优先级如果没有后触发的中断优先级高,就会先处理优先级高的中断。
外部中断线或外部事件线如下图所示:

中断和事件的区别:由上图可以看出,从外部激励信号来看,中断和事件的产生源都可以是一样的,之所以分为两部分,是由于中断需要CPU参与,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是由硬件自动完成这个事件产生的结果(比如:I/O触发产生事件,然后联动触发AD转换)。
GPIO和中断线的映射关系如下图:

从映射关系图可以看出,STM32F0供I/O口使用的中断线有16个,GPIO的管脚GPIOx.0~GPIOx.15(x = A,B,C,D,F)分别对应中断线0~15。
中断向量表分别介绍了Cortex-M0所有中断名称、说明以及中断的地址,下图中列出中断向量表一部分,本实验使用EXTI0_1外部中断,详细请参考STM32F030 参考手册(STM32F030 Series Reference Manual)P171。

HC-SR501 是基于红外线技术的自动控制模块,采用德国原装进口 LHI778 探头,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。
模块为全自动感应,当人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。传感器有两种触发方式(可进行选择):第一种不可重复触发方式,即感应输出高电平后,延时一段时间结束,输出将自动从高电平变成低电平。第二种可重复触发方式,即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。
具有感应封锁时间(默认设置:2.5S 封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接收任何感应信号。此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(此时间可设置在零点几秒—几十秒钟)。感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出 0-3 次,一分钟后进入待机状态。
传感器调节方法:

注:
a)调节延时电位器顺时针旋转,感应延时加长(最大约 300S),反之,感应延时减短(最小约 0.5S)。
b)调节距离电位器顺时针旋转,感应距离增大(最大约 7 米),反之,感应距离减小(最小约 3 米)。
传感器原理图如下:

从传感器原理图可以看出,当传感器识别到人输出高电平时,三极管Q3 S8050导通,LED灯亮,S_OUT引脚输出低电平。当传感器未识别到人输出低电平时,三极管Q3 S8050截止,LED灯灭,S_OUT引脚输出高电平。
新建一个库函数工程。
在工程中新建两个文件分别命名为sensor_human.c和sensor_human.h,并将sensor_human.c文件保存在该工程文件夹中,并添加sensor_human.h文件路径。
在工程中添加蜂鸣器的初始化文件(具体初始化函数请参考源码)。

#include "sensor_human.h"
#include "bsp_buzzer.h"
// 引脚初始化
void HC_SR501_Init(void)
{
}
第一步:使能GPIOA的时钟。
第二步:定义相关结构体变量。
第三步:初始化GPIOA。
第四步:初始化和配置外部中断。
// 引脚初始化
void HC_SR501_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // 定义结构体变量
EXTI_InitTypeDef EXTI_InitStruct; // 定义外部中断结构体变量
NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // 初始化 GPIO时钟
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置为推挽输出
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // 设置引脚为输入模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 引脚为 PA0
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3; // 50MHz
GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化函数
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // 选择用作EXTI线的GPIO引脚
EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 选择中断线0
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 选择中断触发
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 选择双边沿触发
EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 使能中断线
EXTI_Init(&EXTI_InitStruct); // 初始化外部中断
// 配置中断
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_1_IRQn; // 选择中断通道
NVIC_InitStruct.NVIC_IRQChannelPriority = 2; // 选择中断优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStruct);
}
// 配置中断服务函数
void EXTI0_1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0))
{
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{
BUZZER_OFF; // 蜂鸣器关
}
else
{
BUZZER_ON; // 蜂鸣器开
}
}
}
#ifndef _SENSOR_HUMAN_H_
#define _SENSOR_HUMAN_H_
#include "stm32f0xx.h"
void HC_SR501_Init(void);
#endif
第一步:引用相关头文件。
第二步:在main()函数中初始化蜂鸣器和传感器:
#include "sensor_human.h"
#include "bsp_buzzer.h"
int main()
{
Buzzer_Init(); // 蜂鸣器初始化
HC_SR501_Init(); // 传感器读取引脚初始化
while(1)
{
}
}
将程序下载到开发板中,等待传感器初始化后,当人从传感器经过时可以听到开发板上的蜂鸣器响起。
更多交流欢迎关注作者抖音号:81849645041
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
我正在尝试整个BDD方法并想测试AMQP基于Vanilla的方面Ruby我正在写的应用程序。选择Minitest后作为与其他名副其实的蔬菜框架不同的平衡功能和表现力的测试框架,我着手编写此规范:#File./test/specs/services/my_service_spec.rb#Requirementsfortestrunningandconfigurationrequire"minitest/autorun"require"./test/specs/spec_helper"#Externalrequires#MinitestSpecsforEventMachinerequire