红外传感器HC-SR501使用经验
介绍
网上关于红外传感器HC-SR501的介绍太多了,需要了解的伙伴转链接
HC-SR510介绍
我实际使用中出现的问题
- 不了解传感器信号发出的原理
- 人站在传感器前面不动时,反馈信号一会高电平一会低电平
个人见解
1.HC-SR501的信号发出是因为外界温度发生了变化(由低温变高温表示有人来,高温变低温人走)
在这两种情况下,HC-SR501都会发出一个脉冲信号(一个高电平),所以导致了人物在前面不动时一会高电平一会低电平(因为人的温度没有环境稳定)
2.HC-SR501在发出一个脉冲信号后会锁死至少0.5s不检测外界情况,所以导致手挥动的一瞬间之检测到一次从而得到一次脉冲信号(自己测试手快速挥动一次得到一个脉冲信号,手缓慢挥动1s得到两个脉冲信号)
本人自己写了一套代码可以实现人物检测不出现一会高电平一会电平的情况,不过只是将就用一下,只能说持续时间久一点,但还是会出现跳变,仅供参考!!希望大家积极评论给予指错
主函数
#include "stm32f10x.h"
#include "sys.h"
int check=0;
int main()
{
LED_Init();
EXTI9_5_Config();
while(1)
{
if(0==check)
LED_Reset();
else if(1==check)
LED_Set();
}
}
led驱动
//.h文件
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
void LED_Init();
void LED_Set();
void LED_Reset();
#endif
//.c文件
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIO
}
void LED_Set(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_8);
}
void LED_Reset(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}
中断驱动
//.h文件
#ifndef __INTERRUPT_H
#define __INTERRUPT_H
#include"sys.h"
static void NVIC_Config(void);
static void EXTI_Config(void);
void EXTI9_5_Config(void);
#endif
//.c文件
#include"Interrupt.h"
/*
中断嵌套设置
*/
static void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
//设置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置组别
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn; //设置中断号
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢断级别
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //响应级别
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能
//初始化NVIC
NVIC_Init(&NVIC_InitStruct); //初始化
}
static void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line=EXTI_Line8;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising ; //上升沿触发
EXTI_Init(&EXTI_InitStruct);
}
void EXTI9_5_Config(void)
{
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE); //时钟配置
RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_EXTILineConfig (GPIO_PortSourceGPIOC,GPIO_PinSource8);
EXTI_Config ();
NVIC_Config();//NVIC中断初始化
}
中断回调函数
void EXTI9_5_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line8) != RESET)
check=!check;
EXTI_ClearITPendingBit(EXTI_Line8);
}