C++ 用Arduino测量频率
我正在做一个使用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
#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