Arduino 中断返回不可靠的值

Arduino interrupt returning unreliable values

我有一个简单的应用程序,可以使用配备有簧片开关的传感器来计算水流量。 所以应用程序应该只计算开关关闭的次数。

我的第一个代码是:

const int sensorPin = 2;
volatile int counter = 0;

void setup() {
  Serial.begin(115200);
  pinMode(sensorPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sensorPin), sensorISR, FALLING);
}

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
}

void sensorISR() {
  counter++;
}

一旦 20 升的瓶子装满,计数器就会显示 120。

然后我改了代码如下:

const int sensorPin = 2;
volatile int counter = 0;

void setup() {
  Serial.begin(115200);
  pinMode(sensorPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sensorPin), sensorISR, FALLING);
}

void loop() { }

void sensorISR() {
  counter++;
  Serial.print("Counter: ");
  Serial.println(counter);  
}

计数器下降到 40(使用相同的 20 升瓶子)。

计数应该是 20L 但这不是我的问题,因为它是由簧片开关弹跳引起的(我将解决后者)。 由于该项目将有 3 个传感器和 3 个 ISRoutine,我想知道为什么将 Serial.print() 命令放入主循环会导致如此奇怪的结果。

谢谢 保罗

串行打印语句依赖于在 ISR 期间禁用的中断。所以 Serial.print 语句不属于 ISR。

你的计数下降的原因是现在你的 ISR 需要更长的时间来执行并且它掩盖了一些反弹。关于如何使用 Arduino 去抖动的教程数不胜数。你一定能找到一个。

最简单的两种方法是在引脚和地之间使用一个电容器来进行硬件去抖,或者只使用毫秒或微量来记录中断发生的时间并忽略在该时间的一小段时间内发生的任何中断。