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