Arduino上的脉冲计数器

时间:2014-03-14 13:13:43

标签: c++ arduino

我需要一个函数来返回arduino上指定时间内的脉冲数。这是我正在使用的部分代码,但该函数没有重新调整任何东西(甚至没有返回0)

...

long Itime = 0;
int Dtime = 25;

...

int Counter() {
    unsigned long Ftime = millis();
    int c = 0;
    int i = 0;
    while ( Ftime - Itime < Dtime ) {
        if ( digitalRead(PSPin) == HIGH ) {
            i=i+1;
            while ( digitalRead(PSPin) == HIGH) { // delays the function until
                c=c+1;                        // the next cycle
                c=c-1;
            }   
        }
    }
    Itime = Ftime;
    return i;
    }

我真的不明白为什么这个功能没有回复'我'。如果有人可以提供帮助,我会很高兴。谢谢

编辑: PSPin上的信号是150hz方波信号,这意味着周期约为6ms,由于我的时间是25ms,它应该至少返回3个脉冲。 我把这个函数称为仅用于测试目的,因为我也认为我的程序卡在了Counter()函数上,但我无法弄清楚原因。

void loop() {
     if ( Counter() == 0 )
     digitalWrite(TestPinA, HIGH);
     if ( Counter() > 0 )
     digitalWrite(TestPinB, HIGH);
     }

但两个引脚都不会返回HIGH。 我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

使用中断来简化工作。

volatile int IRQcount;
int pin = 2;
int pin_irq = 0; //IRQ that matches to pin 2

void setup() {
  // put your setup code here, to run once:
attachInterrupt(pin_irq, IRQcounter, RISING);
delay(25);
detachInterrupt(pin);
Serial.print(F("Counted = ");
Serial.println(IRQcount);
}

void IRQcounter() {
  IRQcount++;
}

void loop() {
  // put your main code here, to run repeatedly:

}

如果你想使用INT0 / 1以外的引脚。您可以使用PinChangeInt Libray来使用任何图钉。

答案 1 :(得分:0)

你被困在

while ( Ftime - Itime < Dtime )

因为在WHILE循环中代码永远不会实际更新Ftime或Dtime。请尝试以下方法:

int PSPin = 13;
int DurationTime = 25; // best to have same type as compare or cast it later, below.

int Counter() {
    int i = 0;
    unsigned long StartTime = millis();
    unsigned long PrvTime = StartTime ;
    while ( PrvTime - StartTime < (unsigned long) DurationTime ) {
        if ( digitalRead(PSPin) == HIGH ) {
            i=i+1;
            while ( digitalRead(PSPin) == HIGH); // BLOCK the function until cycles
        }
        PrvTime = millis();
    }
    return i;
}