OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2905|回复: 4

求大神!STM32智能窗户中 HC SR501人体红外感应部分调试 冲突 单开单关都可以 放一起一开窗就关

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-5-9
在线时间
9 小时
发表于 2020-5-12 22:13:04 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 Rickyking 于 2020-5-13 19:47 编辑

求大神!STM32智能窗户中 HC SR501人体红外感应部分调试  冲突 单开单关都可以   定义都有 应该都没问题
放一起就重复开关窗  红外感应模块一直输出高电平  怎么可以解决
                                if((HW_flag == 0) && (Window_Open_Flag == 0))  //红外感应无人 开窗
                                {                                                                                                                                                                                                      
                                        Window_Open_Flag = 1;Window_Close_Flag = 0;
                //                        Gui_DrawFont_GBK16(10,110,WHITE,BLUE,"wind  open");                                                
                                        Motor_Ctrl_Func(1,3,250);          //1电机正转 3速度 250旋转角
                                        delay_nms(50);                           
                                }
                                else if((HW_flag == 1) && (Window_Close_Flag == 0))  //红外感应有人 关窗
                                {                                                                                                                                                                                                      
                                        Window_Open_Flag = 0;Window_Close_Flag = 1;
                //                        Gui_DrawFont_GBK16(10,110,WHITE,BLUE,"wind close");                                                
                                        Motor_Ctrl_Func(2,3,250);          //2电机反转 3速度 250旋转角
                                        delay_nms(50);                           
                                }






主程序如下
#include "stm32f10x.h"
#include "delay.h"
#include "sta_tcpclent_test.h"




#define HW PBin(10)
u16 n=0,HW_flag=0;


void HW_Work(void)
{
        if(HW==1)
        {
                n=0;
                HW_flag=1;        
        }


        n++;
        if(n>=100)
        {
                n=0;
                if(HW==0)
                {
                        HW_flag=0;        
                }
        }
}


#define MAIN1_ON GPIO_SetBits(GPIOA,GPIO_Pin_0)  //GPIOAêÇò»¸ö½á11ìåÖ¸Õë Ö¸ÏòGPIOA_BASEμĽá11ìåTypeDef
#define MAIN2_ON GPIO_SetBits(GPIOC,GPIO_Pin_15)
#define MAIN3_ON GPIO_SetBits(GPIOC,GPIO_Pin_14)
#define MAIN4_ON GPIO_SetBits(GPIOC,GPIO_Pin_13)


#define MAIN1_OF GPIO_ResetBits(GPIOA,GPIO_Pin_0)
#define MAIN2_OF GPIO_ResetBits(GPIOC,GPIO_Pin_15)
#define MAIN3_OF GPIO_ResetBits(GPIOC,GPIO_Pin_14)
#define MAIN4_OF GPIO_ResetBits(GPIOC,GPIO_Pin_13)


#define MBIN1_ON GPIO_SetBits(GPIOA,GPIO_Pin_6)
#define MBIN2_ON GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define MBIN3_ON GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define MBIN4_ON GPIO_SetBits(GPIOA,GPIO_Pin_3)


#define MBIN1_OF GPIO_ResetBits(GPIOA,GPIO_Pin_6)
#define MBIN2_OF GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#define MBIN3_OF GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define MBIN4_OF GPIO_ResetBits(GPIOA,GPIO_Pin_3)


//μç»ú3õê¼»ˉ
void Motor_Port_Init(void)
{         
         GPIO_InitTypeDef GPIO_InitStructure;  //éùÃ÷ò»¸ö½á11ìåGPIO_InitStructure£¬½á11ìåÔ-DíóéGPIO_InitTypeDefè·¶¨


         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        
//′ò¿a1رÕíaéèêä3öê±Öó¶Ë¿ú
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
//¸Ä±äÖ¸¶¨1ü½ÅμÄó3éäGPIO_Remap_SWJ_JTAGDisable ,JTAG-DP½ûóà + SW-DP ê1Äü
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);


         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;  //Moror A IN1£¿
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
         
   GPIO_Init(GPIOA,&GPIO_InitStructure);
        
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13;  //Moror A IN2 IN3 IN4
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
         
   GPIO_Init(GPIOC,&GPIO_InitStructure);
               
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;  //Moror B IN1 IN2 IN3 IN4
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
         
   GPIO_Init(GPIOA,&GPIO_InitStructure);        
         
}
//μç»úÕy·′×aoˉêy
void Motor_Ctrl_Func( u8 Dir , u8 Speed ,u16 Cir)  
{
        u16 i;
        if(Dir == 1) //Õy×a ¿a′°
        {
                for(i = 0; i < Cir; i++)
                {
                MAIN1_ON;MAIN2_OF;MAIN3_OF;MAIN4_OF; //0001
                MBIN4_ON;MBIN3_OF;MBIN2_OF;MBIN1_OF; //1000
                delay_nms(Speed);
                MAIN1_OF;MAIN2_ON;MAIN3_OF;MAIN4_OF; //0010
                MBIN4_OF;MBIN3_ON;MBIN2_OF;MBIN1_OF; //0100        
                delay_nms(Speed);
                MAIN1_OF;MAIN2_OF;MAIN3_ON;MAIN4_OF; //0100
                MBIN4_OF;MBIN3_OF;MBIN2_ON;MBIN1_OF; //0010        
                delay_nms(Speed);
                MAIN1_OF;MAIN2_OF;MAIN3_OF;MAIN4_ON; //1000        
                MBIN4_OF;MBIN3_OF;MBIN2_OF;MBIN1_ON; //0001               
                delay_nms(Speed);
                        }
        }
        else if(Dir == 2) //·′×a 1&#216;′°
        {
                                for(i = 0; i < Cir; i++)
                {
                MAIN1_OF;MAIN2_OF;MAIN3_OF;MAIN4_ON;   //1000
                MBIN4_OF;MBIN3_OF;MBIN2_OF;MBIN1_ON;   //0001
                delay_nms(Speed);
                MAIN1_OF;MAIN2_OF;MAIN3_ON;MAIN4_OF;   //0100
                MBIN4_OF;MBIN3_OF;MBIN2_ON;MBIN1_OF;   //0010
                delay_nms(Speed);
                MAIN1_OF;MAIN2_ON;MAIN3_OF;MAIN4_OF;   //0010
                MBIN4_OF;MBIN3_ON;MBIN2_OF;MBIN1_OF;          //0100
                delay_nms(Speed);
                MAIN1_ON;MAIN2_OF;MAIN3_OF;MAIN4_OF;   //0001
                MBIN4_ON;MBIN3_OF;MBIN2_OF;MBIN1_OF;          //1000
                delay_nms(Speed);
        }
}
  else
        {
                                MAIN1_OF;MAIN2_OF;MAIN3_OF;MAIN4_OF;  //0000
                                MBIN4_OF;MBIN3_OF;MBIN2_OF;MBIN1_OF;  //0000
               
        }


static u8 Window_Open_Flag = 0;
static u8 Window_Close_Flag = 0;
        
        }
        void Window_Ctrl_Func()
        {
        if((HW_flag == 0) && (Window_Open_Flag == 0))  //oìía&#184;Dó|  &#191;a′°
                {                                                                                                                                                                                                      
                        Window_Open_Flag = 1;Window_Close_Flag = 0;
                        Gui_DrawFont_GBK16(10,110,WHITE,BLUE,"wind  open");                                                
                        Motor_Ctrl_Func(1,3,250);        
                        delay_nms(50);                           
                }
        else if((HW_flag == 1) && (Window_Close_Flag == 0))  //oìía&#184;Dó|  1&#216;′°
                {                                                                                                                                                                                                      
                        Window_Open_Flag = 0;Window_Close_Flag = 1;
                        Gui_DrawFont_GBK16(10,110,WHITE,BLUE,"wind close");                                                
                        Motor_Ctrl_Func(2,3,250);        
                        delay_nms(50);                           
                }
        }
int main(void)   
{
  u8 a=0;
  SystemInit();
  delay_init(72);                //&#209;óê±3&#245;ê&#188;&#187;ˉ
  Motor_Port_Init();
  while(1)
  {
        Window_Ctrl_Func();
        HW_Work();
        delay_nms(200);
  }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-13 11:51:06 | 显示全部楼层
回复

使用道具 举报

12

主题

3391

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8651
金钱
8651
注册时间
2020-5-11
在线时间
4113 小时
发表于 2020-5-13 13:14:02 | 显示全部楼层
也许电机的动作对HC-SR501产生了干扰,使它觉得有人,建议示波器监测HW 引脚。
看程序有对HW==0的低通滤波,但对HW==1的情况没有滤波。
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-5-9
在线时间
9 小时
 楼主| 发表于 2020-5-13 19:45:32 | 显示全部楼层
我用这个延时  消除抖动也没有用啊
HC_SR501_State_TypeDef HC_SR501_StateRead(void)
{
  if(GPIO_ReadInputDataBit(HC_SR501_GPIO,HC_SR501_GPIO_PIN)==HC_SR501_ACTIVE_LEVEL)
  {
    HC_SR501_ScanDelay();
    if(GPIO_ReadInputDataBit(HC_SR501_GPIO,HC_SR501_GPIO_PIN)==HC_SR501_ACTIVE_LEVEL)
    {      
      return HC_SR501_HIGH;
    }
  }
  return HC_SR501_LOW;
}
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-5-9
在线时间
9 小时
 楼主| 发表于 2020-5-13 21:54:16 | 显示全部楼层
LcwSwust 发表于 2020-5-13 13:14
也许电机的动作对HC-SR501产生了干扰,使它觉得有人,建议示波器监测HW 引脚。
看程序有对HW==0的低通滤波 ...

请问要怎么对1的情况加滤波
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 15:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表