为了和环境光区分设计了调制信号版本的红外对光

电子说

1.3w人已加入

描述

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

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

电路图

电路的几点说明:

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;}}

实物图

这是发射接收传感器部分

处理器部分

效果说明:

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分