红外对光管载波方案

非载波下的红外光限位,检测在民用以及工业应用特别广泛,但是当自然光较强,或者室外效果非常差劲,博主也遇到这个问题。

博主使用红外对光管做把手检测,当手握住把手后输出高电平,撒开把手后输出低电平。下面是电路图:

这里写图片描述

电路的几点说明:

J3和J1是对插接口,红外对光管使用的型号是ST178。
当对光管被遮挡后,OUT端电压降低,如果比较器A-端电压低于A+端,OUTA就会输出高电平,此时Q1会导通,输出高电平。
电路使用R5和R6调节基准电压。
当两个对光管都被遮挡后A-端电压大约在1V左右,A+的电压基准大概为3.33V。

结果:

最后在现场,我是懵逼的!!! 虽然现场在室内,但是,窗户的自然采光量已经导致A-端电压在1V左右,当时大约在中午,下午把手都恢复正常了。但是这肯定不合格。因此为了和环境光区分设计了调制信号版本的红外对光。

红外调制版本电路图:

方案说明:

该方案使用红外发射管调制38KHZ发射,使用HS1838接收,HS1838收到38KHZ红外信号后,会输出低电平(但是不会持续输出),因此38KHZ也得编码,这里使用30HZ左右的方波信号进行编码。和红外通信原理类似。

第一种版本:

NE555调制版本

这里写图片描述

电路说明:

上面是发射电路,其中D1是红外发射管,左边用三极管构成一个多谐振荡器产生30HZ开漏输出信号,右边是NE555产生38KHZ 60%占空比推挽输出信号,因此最终30HZ信号载波38KHZ发射出去,接收端会输出30HZ的方波信号,然后处理器检测这个30HZ方波信号就可以确定有没有信号了,如果挡住了发射管,接收管不会有输出,挡住了接收管也是一个道理啦。

缺点就是元件数量太多了。

因为这个电路要装进把手里,所以一定要小。原件太多就尴尬了。

第二版本电路

这里写图片描述
这就简单多了,J3是HX1838,D2是发射管。单片机是STM8S103F3。
TIM2作为38KHZ 60%占空比输出。 TIM4产生30HZ编码信号。
TIM1_CH3输入捕获脉冲宽度。
最后完美解决干扰问题。
下面是具体片段代码:

定时器2产生38KHZ载波信号
TIM2_DeInit();                  //定时器2 默认值
TIM2_TimeBaseInit(TIM2_PRESCALER_4, 103);// 配置定时器2 主时基
TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_DISABLE,60, TIM2_OCPOLARITY_HIGH);//输出PWM配置
TIM2_ARRPreloadConfig(ENABLE);          //打开自动装载
TIM2_CCxCmd(TIM2_CHANNEL_2, ENABLE);TIM2_Cmd(ENABLE);//使能
定时器4产生编码信号
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 125);//1000HZ触发频率
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);//中断触发
TIM4_ARRPreloadConfig(ENABLE);
TIM4_SetCounter(0x00);
TIM4_Cmd(ENABLE);            
定时器4中断进行载波处理
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)//定时器4编码信号
 {static bool flot=0;

  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
   TIM4_ClearFlag(TIM4_FLAG_UPDATE);numb++;//清除标致 
   if(numb>15){//做一个延时使用
   if(flot) {TIM2_Cmd(ENABLE);flot=0;}//打开及关闭定时器2来控制38KHZ的输出和关闭
   else{         TIM2_Cmd(DISABLE);flot=1;}
   numb=0;
   }

 } 
定时器1进行输入捕获

TIM1_TimeBaseInit(1600, TIM1_COUNTERMODE_UP, 10000, 0x00);//定时器一些设定
TIM1_ICInit(TIM1_CHANNEL_3, TIM1_ICPOLARITY_FALLING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0x00);//输入捕获设定
TIM1_ARRPreloadConfig(ENABLE);//自动重装载定时器
TIM1_CCxCmd(TIM1_CHANNEL_3, ENABLE);//使能第三通道
TIM1_ITConfig(TIM1_IT_UPDATE, DISABLE);//无更新中断
TIM1_ITConfig(TIM1_IT_CC3, DISABLE);//不打开第三通道捕获中断
    TIM1_Cmd(DISABLE);//关闭定时器
主函数处理
while(1){
if(!GPIO_ReadInputPin(GPIOC, GPIO_PIN_3)){  //先检测到低电平
  TIM1_SetCounter(0x0000);//然后清空计数器
    TIM1_Cmd(ENABLE);//打开定时器1
 while(!TIM1_GetFlagStatus(TIM1_FLAG_CC3));//等待高脉冲    
     PWMdata= TIM1_GetCapture3();//获取到脉冲宽度
     TIM1_ClearFlag(TIM1_FLAG_CC3);//清除标志位
         TIM1_Cmd(DISABLE);//关闭定时器1 等待下次处理
  }
if((PWMdata>310)&&(PWMdata<330)){   //判断频率是否在预设的30HZ左右 如果连续5次都是那就没问题啦!!
  a++;if(a>5)LED_ON;
}
else {LED_OFF;
a=0;

}


}

实物图

这是发射接收传感器部分

这里写图片描述

处理器部分

这里写图片描述

效果说明:

非常稳定,使用安防监控红外灯照射,依然波形不乱。明天试试太阳底下效果。

这里写图片描述

有什么疑问请加电子交流qq群:496998875

猜你喜欢

转载自blog.csdn.net/l420ll/article/details/79183401