1

与激光门类似,我试图找出两个不同触发传感器之间的时间差。到目前为止,我正在使用 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 微秒,因此需要高精度。)

4

0 回答 0