2

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

Arduino Uno上,我已将一个在 HIGH 上触发的中断附加到一个只增加一个 volatile 定义的long计数器的例程。该计数器显示在 LCD 屏幕上。如果我在 TTL 电平上连接一个频率为 1 Hz 的脉冲发生器,我希望计数器每秒增加约 1 个。然而,这种情况并非如此。

由于频率为 1 Hz(占空比 50%),一旦计数器增加,IRS 就会退出(并清除中断标志)但是:INT0电平仍然很高,所以 ISR 会再次被调用吗?在 1 Hz 50% 占空比下,HIGH 将保持 500 ms 和 16 mHz...

4

2 回答 2

1

两个电气原因可以解释为什么中断不能按您的需要运行。

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

“脉冲发生器”这个名字让我觉得这是一个 50 欧姆输出设备,旨在产生非常短且边缘锐利的脉冲。在这种情况下,您可以在目标(负载)处添加一个终端电阻以匹配源(脉冲发生器)的阻抗。对于 50 欧姆的输出,47 欧姆就足够了。如果输出为 100 kohm,则在 Arduino 上放置一个匹配电阻。

2- 恰恰相反,发生器波形边缘可能非常慢,以至于电压多次通过 TTL 0 到 1 转换。如果信号输入上有噪声,则缓慢的边沿可能会导致多次触发。例如,如果您从电源和接地问题中获得大约 60 Hz 的纹波,那么您的方波边缘不会像您想象的那样方正。

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

于 2013-05-09T05:55:15.767 回答
1

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

正如评论所言:它在边缘触发!

在Arduino Playground网页上查看更多详细信息。

于 2013-05-08T18:40:13.997 回答