C++ 用Arduino测量频率

C++ 用Arduino测量频率,c++,arduino,C++,Arduino,我正在做一个使用Arduino测量输入方波频率的小项目,我使用定时器和硬件中断来完成,下面是我的代码: #include <TimerOne.h> long count1=0,freq1=0; void setup(){ attachInterrupt(5,count,RISING); Timer1.initialize(1000000); //increments count for 1 sec and prints out count Timer1.at

我正在做一个使用Arduino测量输入方波频率的小项目,我使用定时器和硬件中断来完成,下面是我的代码:

#include <TimerOne.h>
long count1=0,freq1=0;

void setup(){
    attachInterrupt(5,count,RISING);
    Timer1.initialize(1000000); //increments count for 1 sec and prints out count
    Timer1.attachInterrupt( freq ); // attach the service routine here

    Serial.begin(9600);
}

void loop(){
    while(freq1)
        Serial.println(freq1);
}

void count()
{
    count1++; 
}

void freq(){
    freq1 =  count1;
    count1=0;
}
#包括
长计数1=0,频率1=0;
无效设置(){
攻击中断(5,计数,上升);
Timer1.initialize(1000000);//递增计数1秒并打印出计数
Timer1.attachInterrupt(freq);//在此处附加服务例程
Serial.begin(9600);
}
void循环(){
while(频率1)
Serial.println(freq1);
}
无效计数()
{
count1++;
}
void freq(){
freq1=count1;
count1=0;
}
问题是输出值几乎是输入频率的两倍,
我不知道它怎么了。在一次密集的谷歌搜索之后,我了解到了中断。似乎不起作用。

有一个有效的例子。 它使用本机ISR函数(更快)而不是arduino中断处理程序。 使用定时器1获得最佳分辨率和精度

代码很大,但您感兴趣的部分是:


可能,您在使用中断和计时器时遇到问题。。。当Arduino处理中断(execute count())时,某些时间函数被禁用或失去意义。例如,millis()或delay(),如果在处理程序函数中调用,则不会像往常一样工作。while(freq1)的作用是什么?我不想在freq1=0时打印,所以我设置了循环
The "// Setup Timer1 for precise timing" portion of void setup()

ISR(TIMER1_OVF_vect) -> for timer1 overflow counter

ISR(INT0_vect) // External Interrupt pin 2 [D2]

void PulseCaptureScheduler_callback()  // Starts a capture and flags a timeout

void PrintInfoScheduler_callback() // Processes the results