Arduino 未检测到 50Hz 方波信号的上升沿

问题描述

我想检测方波信号的所有上升沿并通过串行监视器输出它们。我为此使用了 Arduino UNO,它应该使用中断引脚来检测边缘。信号来自信号发生器(信号是可调的(50Hz 是可取的)。我在下面写了这个代码,但它不起作用,因为如果我设置频率并启动代码,例如在 f=1Hz 20中断被触发!

有人能告诉我我应该如何以及使用哪种方法来实现 Arduino 的这种操作吗?

提前致谢。

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

    void setup() {

    Serial.begin(9600);
    attachInterrupt(digitalPinToInterrupt(interruptPin),interrupt_call,CHANGE);

    }
    void interrupt_call() {

     counter++;

    }

    void loop() {
       if(counter){
         Serial.println(counter);
         counter=0;
       }else{
         Serial.println(counter);
       }
     }

解决方法

如果要检测上升沿,请更改以下行:

attachInterrupt(digitalPinToInterrupt(interruptPin),interrupt_call,CHANGE);

致:

attachInterrupt(digitalPinToInterrupt(interruptPin),RISING);

当计数器变量为零时不要打印它,因此从 loop 函数中删除以下几行:

   }else{
     Serial.println(counter);

您的中断引脚可能悬空。您是否将其配置为输入引脚?在 setup 函数中,在包含 attachInterrupt() 的行之前添加以下行:

pinMode(interruptPin,INPUT_PULLUP);

现在,您应该会看到在 loop 函数期间发生的上升沿的数量。 将其设置为一个较高的值(例如,10 秒),看看您的 1 Hz 方波是否得到大约 10。如果它不起作用,请在此处发布 main 函数/完整代码。

,

感谢您的帮助!我已经纠正了我所有的错误。不幸的是,现在输出相同的错误。我将输出作为图像发布在这里。这是什么原因?中断通过吗?

enter image description here 易失性整数计数器 = 0; const int interruptPin = 3;

void setup() {

 Serial.begin(9600);
 pinMode(interruptPin,INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(interruptPin),RISING);

 }
 void interrupt_call() {
   counter++;
 }

 void loop() {
   if(counter){
    Serial.println(counter);

    counter=0;
    }
 }
,

感谢您的快速回复。我的意思是,如果我将信号发生器的频率设置为 1Hz 然后启动代码,则在每个周期数次中检测到中断的上升沿,但实际上中断每个时间段可能只触发一次并在 Serielen 中输出监视器。我已将输出上传为图像。如果您提供提示或想法,我将不胜感激。

enter image description here

,

我认为您调用 loop 函数的代码部分丢失了,但我刚刚意识到对于典型的 arduino 代码,延迟必须插入到 loop 函数本身中。>

所以你可以通过将 delay(1000) 附加到 loop 函数来添加它,所以它变成:

void loop()
{
    if (counter) {

        Serial.println(counter);
        counter=0;
    }

    delay(1000);
}

在本例中,循环的周期为 1000 毫秒。因此,您现在应该看到一秒内出现的上升沿(如果有)的数量,而不是每次出现时都打印“1”。

请注意,您可以通过编辑问题而不是添加其他答案来提供有关问题的更多信息。