各位,我需要做个高精度时间差的测量.想用ICP1来做捕捉,结合TIMER1来测量时间.具体应用是发出一个脉冲,然后测量脉冲的返回时间,硬件上我用示波器测量返回时间从50ns--100ns到几十us.我在发出脉冲的同时,启动timer1(timer1从0开始记数据,计数频率用20Meg),将返回的脉冲接到icp1里用捕捉功能读取timer1的计数值,可以做到50ns的精度,可是在1us以内测出来的有问题,小于500ns的似乎测量不错来,我猜测估计是指令执行导致的,就是我启动TIMER1的过程中,指令时间占用了时间,导致读出来的TIMER1的值都是0或很大....奇怪的很,我都用中断做了,还有什么更好的方法来实现?
void DriverOut(void)// send 150ns pulse { uchar t; Driver_High; asm("nop"); Driver_Low; //send pulse SyncFlag=True; //new frame coming.start Timer1 counter. TCNT1=0; //reset timer1,and start to measure TIMSK1=(1<<TICIE1); }
void Timer1_Capture(void)//interrupt subfunction { if(SyncFlag) { TIMSK1=(0<<TICIE1); SyncFlag=False; TimerValue.Word=ICR1 DataOkey=True; } } 是否是我的程序不够精简导致短时间测量不出来 |