了解人体红外传感器HC-SR501的驱动原理,通过配置STM32F030芯片GPIO相关寄存器,让人体红外传感器识别到人体时使蜂鸣器响起的基础实验。
1、HC-SR501是基于红外线HC-SR501是基于红外线技术的自动控制模块 ,采用德国原装进口LHI778 探头设计,灵敏度高,可靠性强,超低电压工作模式 ,广泛应用于各类自动感应电器设备 ,尤其是干电池供电的自动控制产品。
2、模块为全自动感应,当人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。传感器有两种触发方式(可通过跳线进行选择):第一种不可重复触发方式,即感应输出高电平后,延时一段时间结束,输出将自动从高电平变成低电平。第二种可重复触发方式,即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)
3、具有感应封锁时间(默认设置:2.5S 封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(此时间可设置在零点几秒—几十秒钟)。感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出0-3 次,一分钟后进入待机状态。
下面是传感器的调节方法:
注:a)调节延时电位器顺时针旋转,感应延时加长(约300S),反之,感应延时减短(约 0.5S)。b)调节距离电位器顺时针旋转,感应距离增大(约 7 米),反之,感应距离减小(约 3 米)。
8、在Sensor_human.c文件中定义传感器读取引脚初始化函数。
// 引脚初始化
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_NOPULL; // 浮空
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);
}
9、配置中断服务函数。
// 配置中断服务函数
void EXTI0_1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0))
{
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{
BUZZER_ON; // 蜂鸣器开
}
else
{
BUZZER_ON; // 蜂鸣器开
}
}
}
10、在Sensor_human.h文件中进行声明。
#ifndef _SENSOR_HUMAN_H_
#define _SENSOR_HUMAN_H_
#include "stm32f0xx.h"
void HC_SR501_Init(void);
#endif
11、在main.c文件中的main()函数中调用函数。
int main()
{
Buzzer_Init(); // 蜂鸣器初始化
HC_SR501_Init(); // 传感器读取引脚初始化
while(1)
{
}
}
12、编译整个工程并且下载程序到开发板。
将程序下载到开发板中后,等待传感器初始化后,当人从传感器经过则可以听到开发板上的蜂鸣器响起。