中断在Arduino上工作得太快了

时间:2013-05-08 16:42:28

标签: arduino interrupt

我知道这听起来有点好笑:)。但我试图消除可能性:

Arduino Uno上,我已经将HIGH触发的中断附加到一个例程,该例程仅增加一个易失定义的long计数器。该计数器显示在LCD屏幕上。 如果我以TTL电平连接频率为1 Hz的脉冲发生器,我预计计数器会以每秒约1的速度增加。但事实并非如此。

当频率为1 Hz(占空比为50%)时,可能一旦计数器递增,IRS退出(并清除中断标志)但是:INT0电平仍为高电平,因此ISR会被再次召集?在1 Hz 50%占空比时,HIGH将保持500 ms并保持在16 mHz ......

2 个答案:

答案 0 :(得分:1)

任何Arduino核心处理器都有两种不同的中断:“外部”和“引脚更改”。 ATmega168 / 328上只有两个外部中断引脚(即Arduino Uno / Nano / Duemilanove),INT0和INT1,它们映射到Arduino引脚2和3.这些中断可以设置为触发RISING或降低信号边沿或低电平。触发器由硬件解释,中断非常快。 Arduino Mega还有一些外部中断引脚可用。

所以评论:它在边缘触发!

查看Arduino Playground网页的详细信息。

答案 1 :(得分:1)

有两个电气原因可以解释为什么中断无法正常运行。

1-脉冲发生器输出和MCU输入可能具有阻抗不匹配,这可能导致波形边缘振铃。例如,如果您的函数发生器具有能够产生高频的50欧姆输出,您可能会发现在低频率下驱动高阻抗输入(例如Arduino)的问题。

名称"脉冲发生器"让我觉得这是一个50欧姆的装置,用于制作具有锐边的非常短的脉冲。在这种情况下,在目标(负载)添加一个终端电阻,以匹配源(脉冲发生器)的阻抗。对于50欧姆输出,47欧姆足够接近。如果输出为100千欧姆,则在Arduino上放置一个匹配电阻。

2-正好相反,发电机波形边缘可能很慢,电压经过多次TTL 0到1的转换。如果信号输入有噪声,则缓慢的边沿可能会导致多个触发。例如,如果您从电源和接地问题中获取大约60 Hz的纹波,则您的方波边缘不会像您想象的那样正方形。

在这种情况下,滞后是一种解决方案。有许多方法可以在代码中去毛刺(去抖动)。没有适合所有问题的答案。一个简单的例子就是ISR要求输入连续两次读取高,以便接受边缘。