如何测量两个传感器之间的时间差到纳秒?

时间:2015-06-05 16:20:41

标签: optimization timer arduino timing time-measurement

与激光门相似,我试图找到两个不同触发传感器之间的时差。截至目前,我正在使用Arduino UNO,但如果有不同的语言或处理器可以获得这种精确度,我对这些想法持开放态度。到目前为止,使用Arduino,我一直在使用micro()函数来获得4微秒标记的精度,并且看到了运行高精度计时器的代码,例如:

void setup()
{
 pinMode(2, OUTPUT);
 TCCR1A = 0;
 TCCR1B = 0;          // input capture noise canceller disabled, capture on falling edge (may adjust this later), stop timer
 TIMSK1 = 0;          // timer 1 interrupts disabled
 ACSR = 0;             // input capture NOT from analog comparator
 Serial.begin(19200);
}

void loop()
{
 static int numDisplayed = 20;
 static bool posEdge = true;

 TCCR1B = (posEdge) ? (1 << ICES1) : 0;        // set up timer 1 to capture on whichever edge we want and stop timer
 TCNT1H = 0;
 TCNT1L = 0;          // clear timer 1
 unsigned long start = micros();  // get the time

 cli();
 TIFR1 = 1 << ICF1;            // clear input capture bit
 TCCR1B |= (1 << CS10);     // start timer, prescaler = 1
 PORTD |= (1 << 2);          // set output high
 sei();

 unsigned int capture = 0;
 do
 {
   if ((TIFR1 & (1 << ICF1)) != 0)
   {
     byte temp = ICR1L;
     capture = (ICR1H << 8) | temp;
   }
 } while (capture == 0 && micros() - start < 100);     // time out after 100us

 PORTD &= ~(1 << 2);     // set output low
 if (capture != 0)
 {
   if (numDisplayed == 20)
   {
     Serial.println();
     numDisplayed = 0;
   }
   else
   {
     Serial.write(' ');
   }
   Serial.print(capture);
   ++numDisplayed;
   delay(100);
 }
 else
 {
   delayMicroseconds(500);
 }
}

有谁知道如何在我的代码中使用它?一旦第一个触发器激活,我就尝试使用while语句来简化代码,只需在等待第二个触发器激活时执行一个计数器,但它仅适用于4微秒内的测量。因此,如果有人知道如何以纳秒为单位进行测量,那将非常感激。 (两个触发器之间的估计时间差为1.67微秒,因此需要高精度。)

0 个答案:

没有答案