Arduino TCNT1计算中断之间的时钟周期?

时间:2016-03-28 01:31:32

标签: arduino

我是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计数器的大量必要的理解,但任何帮助指出我正确的方向将非常感谢!

谢谢

1 个答案:

答案 0 :(得分:5)

您可以尝试直接使用定时器寄存器。查看特定板上使用的CPU手册。对于mega来说,它是ATmega2560-16AU。定时器寄存器的名称是TCNT1。您可以存储其值:

int t1;// declare global variable somewhere
t1 = TCNT1; //save timer value in ISRx interrupts

确保设置预分频值TCCR1B.CSn并处理定时器溢出中断,否则您将丢失时间数据:ISR(TIMER1_OVF_vect)

正如你可以在这里阅读here,可以达到&lt; 1 uS的精度。 More info如何直接使用CPU定时器寄存器。