从红外传感器获取中断

时间:2014-02-16 14:37:05

标签: c gcc avr avr-gcc

我遇到从红外传感器获得正确中断的问题。实际上有两个问题:

  • 我一次收到多个中断(意思是如果我打破了梁,中断会被多次触发)
  • 每当我放置红外光束前面的东西(这是正确的)时,我都会得到一个中断,每次,我都会删除那个不应该发生的东西(不应该发生)。

原理图如下(只是接收器):enter image description here

代码用C语言编写并在GCC中编译,我使用的是AVR Atmega644:

sei();
/* Enable interrupts. */
EIMSK &= ~((1 << INT1) | (1 << INT0));
EICRA |= ((1 << ISC11) | (1 << ISC10) | (1 << ISC01) | (1 << ISC00)); /* Trigger on rising edge */
EIFR |= ((1 << INTF1) | (1 << INTF0));
EIMSK |= ((1 << INT1) | (1 << INT0));
DDRD &= ~((1 << PD2) | (1 << PD3));
PORTD |= ((1 << PD2) | (1 << PD3));

对于ISR,我使用: ISR(INT0_vect) ISR(INT1_vect)

这背后的想法应该如下:

  • 当红外光束关闭时,此红外传感器输出为高电平,当光束断开时,此输出为低电平。
  • 当光束关闭时,电容器应通过R2放电。
  • 当光束断开时,电容器开始通过R1(R1设置充电时间),R6和R2充电。
  • 当电容上的电压超过3.4V时,比较器的输出变为高电平,从而在AVR上产生中断。
  • 类似地,当电容器上的电压低于~3.4V时,比较器的输出变为低电平。

根据我的计算,从0V到3.41V对电容充电的时间是1-10ms(取决于R1),所以这是光束应该断开以产生中断的时间。将电容器从4.9V放大到3.41的时间约为1ms(比较器输出变为低电平),并为0.2V~7ms。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我认为您需要将“比较器”替换为“具有迟滞的比较器”。当你的电容器为3.4 V时,比较器将在低电平和高电平之间振荡,因为你有3.4 V和噪声,电压可以是3.36,在3.45和3.38之后。

您可以阅读http://www.analog.com/library/analogdialogue/archives/34-07/comparators/