电子说
非载波下的红外光限位,检测在民用以及工业应用特别广泛,但是当自然光较强,或者室外效果非常差劲,博主也遇到这个问题。
博主使用红外对光管做把手检测,当手握住把手后输出高电平,撒开把手后输出低电平。下面是电路图:
电路的几点说明:
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;}}
实物图
这是发射接收传感器部分
处理器部分
效果说明:
非常稳定,使用安防监控红外灯照射,依然波形不乱。明天试试太阳底下效果。
全部0条评论
快来发表一下你的评论吧 !