我是Arduino编程的新手,并尝试将arduino uno用作高分辨率计时器。我希望能够在两个上升沿中断之间以完整的16MHz速率计数时钟周期。我有一些使用micros()函数的函数,它具有4微秒的分辨率,我需要更好。这是一个示例代码,我尝试使用micros()进行计时:
volatile int k = 0;
volatile float t1 = 0;
volatile float t2 = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), ISR1, RISING);
attachInterrupt(digitalPinToInterrupt(3), ISR2, RISING);
}
void ISR2()
{
k = 1;
t1 = micros();
Serial.println(1);
}
void ISR1()
{
k = 2;
t2 = micros();
Serial.println(2);
}
void loop()
{
if (t1 != 0 && t2 != 0) {
if (t2 - t1 < 0) {
t1 = 0;
t2 = 0;
}
else {
Serial.print("tdelta ");
Serial.print(t2 - t1);
t1 = 0;
t2 = 0;
Serial.println(0);
}
}
}
我意识到我的微时序可能会受到中断的影响,这可能是一个问题。
有人能指出我正确的方向吗?
我想我想使用timer1,因为它是16位,我的事件应该足够快,以便在发生任何溢出之前完成。我希望找到一种简单的方法,用第一个中断将tcnt1设置为0,然后计数tcnt1时钟周期直到第二个中断。我甚至不知道如何从tcnt1读取值,所以我还有很长的路要走。
我搜索了一些例子,但我们并没有真正找到一个合适的例子。一切似乎都是针对计时器中断的,我不认为这是我所追求的。
我可能缺乏使用这个tcnt1计数器的大量必要的理解,但任何帮助指出我正确的方向将非常感谢!
谢谢
答案 0 :(得分:5)