J3和J1是对插接口,红外对光管使用的型号是ST178。
当对光管被遮挡后,OUT端电压降低,如果比较器A-端电压低于A+端,OUTA就会输出高电平,此时Q1会导通,输出高电平。
电路使用R5和R6调节基准电压。
当两个对光管都被遮挡后A-端电压大约在1V左右,A+的电压基准大概为3.33V。
最后在现场,我是懵逼的!!! 虽然现场在室内,但是,窗户的自然采光量已经导致A-端电压在1V左右,当时大约在中午,下午把手都恢复正常了。但是这肯定不合格。因此为了和环境光区分设计了调制信号版本的红外对光。
该方案使用红外发射管调制38KHZ发射,使用HS1838接收,HS1838收到38KHZ红外信号后,会输出低电平(但是不会持续输出),因此38KHZ也得编码,这里使用30HZ左右的方波信号进行编码。和红外通信原理类似。
上面是发射电路,其中D1是红外发射管,左边用三极管构成一个多谐振荡器产生30HZ开漏输出信号,右边是NE555产生38KHZ 60%占空比推挽输出信号,因此最终30HZ信号载波38KHZ发射出去,接收端会输出30HZ的方波信号,然后处理器检测这个30HZ方波信号就可以确定有没有信号了,如果挡住了发射管,接收管不会有输出,挡住了接收管也是一个道理啦。
因为这个电路要装进把手里,所以一定要小。原件太多就尴尬了。
这就简单多了,J3是HX1838,D2是发射管。单片机是STM8S103F3。
TIM2作为38KHZ 60%占空比输出。 TIM4产生30HZ编码信号。
TIM1_CH3输入捕获脉冲宽度。
最后完美解决干扰问题。
下面是具体片段代码:
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);//使能
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 125);//1000HZ触发频率
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);//中断触发
TIM4_ARRPreloadConfig(ENABLE);
TIM4_SetCounter(0x00);
TIM4_Cmd(ENABLE);
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;
}
}
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