STM32实现红外感应传感器功能
Posted 为了维护世界和平_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32实现红外感应传感器功能相关的知识,希望对你有一定的参考价值。
原理
人体都有恒定的体温,一般在 37 度,所以会发出特定波长 10um 左右的红外线。人体发射的 10um 左右的红外线通过菲涅尔滤光片增强后聚集到红外感应源上,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路检测处理后就能产生报警信号。
实物图(正反面)
型号:HC-SR50
传感器特性
工作电压范围 直流电压 4.5-20V
电平输出 高 3.3 V /低 0V
触发方式 L 不可重复触发/H 重复触发
延时时间 0.5-200S(可调)
封锁时间 2.5S(默认)可制作范围零点几秒-几十秒
感应范围 3米到7米
实验
全自动感应 :人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。
感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出 0-3 次,一分钟后进入待机状态。
如果检测到红外,则LED灯亮,否则灭。
模块数据输出接到PA4
- 中断功能
- 配置中断向量控制器NVIC
- 配置外部中断口
- 实现中断函数
中断控制器
#define SR501_INT_GPIO_PORT GPIOA
#define SR501_INT_GPIO_CLK (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)
#define SR501_INT_GPIO_PIN GPIO_Pin_4
#define SR501_INT_EXTI_PORTSOURCE GPIO_PortSourceGPIOA
#define SR501_INT_EXTI_PINSOURCE GPIO_PinSource4
#define SR501_INT_EXTI_LINE EXTI_Line4
#define SR501_INT_EXTI_IRQ EXTI4_IRQn
#define SR501_IRQHandler EXTI4_IRQHandler
//嵌套中断向量控制器
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 中断控制器组*/
NVIC_InitStructure.NVIC_IRQChannel = SR501_INT_EXTI_IRQ;//外部中断线
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /*优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 子优先级*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 使能 */
NVIC_Init(&NVIC_InitStructure);
}
外部中断口
//IO 为EXIT外部中断口
void EXTI_SR501_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(SR501_INT_GPIO_CLK,ENABLE);/*时钟*/
NVIC_Configuration();/* 配置NVIC中断*/
GPIO_InitStructure.GPIO_Pin = SR501_INT_GPIO_PIN;//gpioy引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /*输入方式 浮空 */
GPIO_Init(SR501_INT_GPIO_PORT, &GPIO_InitStructure);
/* 信号源 */
GPIO_EXTILineConfig(SR501_INT_EXTI_PORTSOURCE, SR501_INT_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = SR501_INT_EXTI_LINE;//中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /* 中断模式 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;/* 上升沿 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE; /* 使能 */
EXTI_Init(&EXTI_InitStructure);
}
中断函数
void SR501_IRQHandler(void)
{
if(EXTI_GetITStatus(SR501_INT_EXTI_LINE) != RESET)
{
LED1_TOGGLE;
EXTI_ClearITPendingBit(SR501_INT_EXTI_LINE);
}
}
LED灯配置
#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN GPIO_Pin_5
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK , ENABLE);
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
}
主函数
int main(void)
{
LED_GPIO_Config();
EXTI_SR501_Config();
while(1)
{
}
}
以上是关于STM32实现红外感应传感器功能的主要内容,如果未能解决你的问题,请参考以下文章
基于STM32热释人体感应智能门禁报警系统设计-毕业设计资料