红外热释传感器(HC-SR501)

2019-04-13 17:02发布

       这周用32写了HC-SR501的驱动代码,经过查原理,一开始感觉没啥写的,就是先配置IO为下拉,然后在中断写检测,和小车红外一样,但是等做了之后才发现,很难调!!!一周下来基本上都是在调程序,下载后的效果不好,一开始一直以为是程序的错误,自己反复查,也在opdev里面看论坛,搜不到源码,但是思路也都是一样的,就是不知道问题出在哪,自己还专门跑去楼道看感应灯,那个就是我想要的效果,但是能力暂时有限,只能写这些,希望哪位大神看见帮我检查检查代码,在此非常感谢了。下面我先介绍模块的功能及配置:     功能:   HC-SR501 是一款基于热释电效应的人体热释运动传感器,能检测到人体或者动物上发出的红外线。这个传感器模块可                以通过两个旋钮调节检测 3 ~ 7 米的范围,5秒至5分钟的延迟时间,还可以通过跳线来选择单次触发以及重复触发模式HC-SR501-Motion-Detector-Pin-Outs_zh.png   VCC:5V 时间延迟调节 
将菲涅尔透镜朝上,左边旋钮调节时间延迟,顺时针方向增加延迟时间,逆时针方向减少延迟时间。 距离调节 
将菲涅尔透镜朝上,右边旋钮调节感应距离长短,顺时针方向减少距离,逆时针方向增加距离。 单次检测模式 
传感器检测到移动,输出高电平后,延迟时间段一结束,输出自动从高电平变成低电平。 
连续检测模式 
传感器检测到移动,输出高电平后,如果人体继续在检测范围内移动,传感器一直保持高电平,知道人离开后才延迟将高电平变为低电平。  以下为我的主要代码(结果差强人意,希望哪位大佬能帮我看看): //exti.h #ifndef __EXTI_H
#define __EXIT_H     
#include "sys.h"
#define Pout PAin(5)
void HC_SR501_GPIO_Init(void);                                 
void EXTI_Init(void);                                  
#endif //exti.c #include "exti.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
void HC_SR501_GPIO_Init(void)
{
   RCC->APB2ENR|=1<<2;
     GPIOA->CRL&=0xFF0FFFFF;
   GPIOA->CRL|=0x00800000;
   GPIOA->ODR|=1<<5; }
void EXTI9_5_IRQHandler(void)
{            
    delay_ms(10);             
  if(Pout==1)
    {
        LED0=0;             
       EXTI->RTSR&=~(1<<5);
       EXTI->FTSR|=1<<5;
        Pout=0;
    }
    else if(Pout==0)
    {     LED0=1;
          EXTI->RTSR|=1<<5;
          EXTI->FTSR&=~(1<<5);
          Pout=1;
    }
     EXTI->PR=1<<5;        
}
void EXTI_Init(void)
{
    HC_SR501_GPIO_Init();
    LED_Init();
    Ex_NVIC_Config(GPIO_A,5,RTIR);   
    MY_NVIC_Init(2,2,EXTI9_5_IRQn,2);    
}