这周用32写了HC-SR501的驱动代码,经过查原理,一开始感觉没啥写的,就是先配置IO为下拉,然后在中断写检测,和小车红外一样,但是等做了之后才发现,很难调!!!一周下来基本上都是在调程序,下载后的效果不好,一开始一直以为是程序的错误,自己反复查,也在opdev里面看论坛,搜不到源码,但是思路也都是一样的,就是不知道问题出在哪,自己还专门跑去楼道看感应灯,那个就是我想要的效果,但是能力暂时有限,只能写这些,希望哪位大神看见帮我检查检查代码,在此非常感谢了。下面我先介绍模块的功能及配置:
功能: HC-SR501 是一款基于热释电效应的人体热释运动传感器,能检测到人体或者动物上发出的红外线。这个传感器模块可 以通过两个旋钮调节检测 3 ~ 7 米的范围,5秒至5分钟的延迟时间,还可以通过跳线来选择
单次触发
以及
重复触发模式
。
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);
}