TDCGP2在时差法很有用.docx
《TDCGP2在时差法很有用.docx》由会员分享,可在线阅读,更多相关《TDCGP2在时差法很有用.docx(16页珍藏版)》请在冰豆网上搜索。
TDCGP2在时差法很有用
TDC-GP2在时差法(TOF)脉冲式激光测距中的应用
摘要:
在脉冲式激光测距仪的设计当中,时差测量(timeofflightmeasurement)成为了一个
影响整个测量精度最关键的因素。
德国acam公司设计的时间数字转换芯片TDC-GP2为激光测距的时间测量提供了完美的解决方法。
本文着重介绍了应用TDC-GP2在设计激光测距电路当中的优势,以及在应用中给出一些建议和提出了需要注意的一些问题。
1.概述
在当今这个科技发达的社会,激光测距的应用越来越普遍。
在很多领域,电力,水利,通讯,环境,建筑,地质,警务,消防,爆破,航海,铁路,反恐/军事,农业,林业,房地产,休闲/户外运动等都可以用到激光测距仪。
激光测距仪一般采用两种方式来测量距离:
脉冲法和相位法脉冲式激光测距仪是通过测量激光从发射到返回之间的时间来计算距离的。
因此时间测量对于脉冲式激光测距仪来说是非常重要的一个环节。
由于激光的速度特别快,所以发射和接收到的激光脉冲之间的时间间隔非常小。
。
例如要测量1公里的距离,分辨率要求1cm,则时间间隔测量的分辨率则要求高达67ps。
德国acam公司的时间数字转换器TDC-GP2单次测量分辨率为典型65ps,功耗超低,集成度高,测量灵活性高,是脉冲式激光测距仪时差(TOF)测量非常理想的选择。
2.TDC-GP2激光测距原理
TDC-GP2的激光测距基本原理如图1所示:
图1:
TDC-GP2激光测距原理
激光发射装置发射出光脉冲同时将发射脉冲输入到TDC-GP2的start端口,触发时差测
量。
一旦从物体传回的反射脉冲达到了光电探测器(接收电路)则给TDC产生一个Stop信号,这个时候时差测量完成。
那么从Start到Stop脉冲之间的时差被TDC-GP2精确记录下来,用于计算所测物体与发射端的距离。
在这个原理中,单片机对于TDCGP2进行寄存器配置以及时间测量控制,时间测量结果传回给单片机通过算法进行距离的精确计算,同时如果有显示装置的话,将距离显示出来。
在这个原理当中距离的测量除了与TDC-GP2的时差测量精度有关外还与很多其他因素有关系:
-激光峰值功率
-激光束发散程度
-光学元件部分
-光传输的媒体(空气,雨天,雾天等)
-物体的光反射能力
-光接收部分的灵敏程度等等
被测物体特性以及传输媒介的铁性一般是由应用的条件给出的,那么可以根据应用的条件来选择激光的发射器(波长,驱动条件,光束的特性等)和接收器(类型,灵敏度,带宽等)。
测量的范围在激光峰值功率更高以及信噪比更高的情况下也会相应增加。
那么时差测量的精度除了与TDC-GP2芯片本身测量精度有关系外还与激光的脉冲特性有关,比如脉冲的形状(宽度,上升下降沿的时间),以及探测器带宽和信号处理电路。
对于tdc-gp2而言,脉冲信号的速度越快,带宽越宽,则测量精度相应得会越高。
那么上面所述的一些需要注意的问题在这里我们并不做讨论,我们假设其他方面都已经解决,那么这里我们着重介绍一下如何应用单片机和TDC-GP2来控制时间测量。
对于tdc-gp2而言,这颗芯片本身有两个测量范围,测量范围1和测量范围2。
测量范围1的时间测量从,相对于距离来讲大约为0-270m。
测量范围2的测量范围从2倍的高速时钟周期到4ms.也就是说最高的距离测量可以到25公里以外.那么我们下面就以不同的测量范围来进行介绍.
测量范围1:
在这个测量范围下,TDC-GP2芯片的测量工作全部是由TDC高速测量单元完成的。
在这个测量范围中,gp2的start通道,stop1,stop2通道都可用。
每个stop通道有4个脉冲的测量能力。
在这个测量范围下,测量结果可以选择校准结果(32位)或者非校准结果16位。
推荐使用32位的校准结果,也就是每次测量都对TDC测量单元进行一次校准。
需要引起注意的问题:
-对于TDC-GP2来讲触发它的脉冲宽度必须要大于。
-在start通道的触发边沿与第一个stop通道的脉冲边沿之间的时间间隔要大于。
-推荐自动校准结果,并且选择每次测量完成后进行自动校准。
这个功能通过设置寄
存器0的自动校准位为0来开启。
-如果计算stop1和stop2通道的脉冲时差的话,脉冲的时差范围可以降低到0。
Start到
最后一个stop脉冲的距离不能够超过,这是由于硬件本身所限制的。
在这个测量模式下测量流程以及典型的寄存器设置如下:
单片机与tdc-gp2的通信是通过spi串口完成的,那么对于测量范围1的一个典型的测量过程为:
voidgp2config()
{
SPIwrite8(0x50);
要这个信号是因为start通道的这个信号是告诉gp2现在开始进入测量状态了。
那么在至少50ns后,单片机触发激光器产生发射信号同时将这个信号输入到stop1通道。
那么接收到的laser脉冲信号则输入到stop2通道。
也就是说用stop1和stop2来测量激光发射和接收的时间差,而start信号是由单片机给出来触发gp2的。
那么之所以这样的原因是在tdc-gp2的内部,有一个噪声单元,通过寄存器设置可以触发这个噪声单元。
噪声单元将会在gp2的start通道脉冲上加任意分布噪声,那么这样做的目的是为了在平均的时候,可以大大消除量化误差和系统误差。
那么这个一位的设置为寄存器5中的EN_STARTNOISE设置。
没有平均的情况下:
这样做的好处为:
和stop2的时间间隔测量可以最低到0。
2.通过这个测量之后如果平均gp2的测量结果,可以大大消除系统误差,跟据平均的次数不同,最多可以使gp2的精度提高至小于6ps.
3.对于温度变换是相当稳定的那么需要注意的是由单片机给的start信号与激光的start信号(也就是stop1信号)的时间要在50ns以上,这个时间是为了给start信号加噪声。
在这个情况下的测量过程中需要将上面的寄存器1的配置稍作修改:
SPIwrite(0x);;1mm
0.98mm
430F置测量范围1,自动校准,上升沿敏感
REG1=0X;算第一个stop1-start
REG2=0X82E00000;//开启所有中断源
REG3=0x;//
REG4=0x;//
REG5=0X;//
spi_write8(PU);//上电复位
_NOP();
spi_disable();
spi_write32(REG0);
_NOP();
spi_write32(REG1);
_NOP();
spi_write32(REG2);
_NOP();
spi_write32(REG3);
_NOP();
spi_write32(REG4);
_NOP();
spi_write32(REG5);
_NOP();
return;
}
//=============================================//
//===========GP2时钟校准程序===================//
voidGP2_cal(void)
{
unsignedcharcal_start=0x03;
unsignedcharread_reg0=0xb0;
unsignedlongintCAL;
floatCAL_f;
P5OUT|=(BIT3);//EN_START
spi_write8(cal_start);//启动校准
_NOP();
spi_disable();
while((P5IN&0x10)==0x10)//判断中断置位否
_NOP();
spi_write8(read_reg0);//读校准的时间数据
_NOP();
CAL=spi_read32();//通过计算校准系数为(float(CAL)/65536*)
_NOP();
return;
}
//=============================================//
//=========时间测量状态寄存器判断程序==========//
voidGP2_TMSTAT()
{
unsignedcharstat="0xb4";
unsignedlonga;
unsignedintb;
while((P5IN&0x10)==0x10)//判断中断置位否
_NOP();
spi_write8(stat);
_NOP();
a=spi_read32();
b=(a>>16);
if((b&0x0600)==0)
BZ1&=0XFE;
else
BZ1|=0X01;//置溢出预计数器或溢出TDC标志
}
//===========================================//
//=============用单片机口产生START信号==========//
voidGP2_START(void)
{
P5OUT&=~(BIT2);//START
_NOP();
P5OUT|=(BIT2);
_NOP();
P5OUT&=~(BIT2);
_NOP();
return;
//===========================================//
//============通讯测试===============//
voidtestcomunication(void)
{
unsignedlongintREG1;
unsignedcharcnt;
unsignedchartmp="0x80";
unsignedchartest_reg=0xb5;//读结果寄存器5,反映寄存器1的高8位
unsignedchartest_reg0=0x00;
REG1=0x;//写寄存器1,随便输入,然后从结果寄存器5读高8位
spi_wriet32(REG1);
_NOP();
spi_write8(test_reg);
_NOP();
for(cnt=8;cnt>0;cnt--)
{
P6OUT|=BIT0;//SCL
_NOP();
if((P6IN&0X04)>0X00)//SO
test_reg0|=tmp;
tmp/=2;
P6OUT&=~(BIT0);//SCL
_NOP();
}
spi_disable();
}
//===================================//
//==========测试fire脉冲产生测试=============//
voidfire(void)
{
unsignedcharTDC_init=0x70;
unsignedcharstart_cycle=0x01;
P5OUT|=(BIT3);//EN_START开启
spi_write8(TDC_init);//初始化TDC
_NOP();
spi_disable();
spi_write8(start_cycle);//发送fire脉冲
_NOP();
spi_disable();
GP2_START();//给start信号,否则fire信号只能发送一次,系统将会挂起
}
//===================================//
//======时间测量测试=========//
voidtimemeasurement(void)
{
unsignedlongintM;
spi_write8(TDC_init);//初始化TDC
_NOP();
spi_disable();
P5OUT|=(BIT3);//EN_START
P5OUT|=(BIT1);//EN_STOP
GP2_START();//给start信号
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();//延迟
P5OUT|=BIT0;//给STOP信号
_NOP();
while((P5IN&0x10)==0x10)//判断中断置位否
_NOP();
GP2_TMSTAT();//GP2状态读取
_NOP();
spi_write8(read_reg0);//读时间测量数据
_NOP();
M=spi_read32();
_NOP();
}
在应用TDC-GP2时还需要注意的一些细节问题:
关于32K晶振和4M高速晶振需要注意的问题
这两个晶振都可以通过外部来给出。
但是4M高速晶振我们建议用我们的推荐电路,因为这个晶振时钟是参与测量的,所以需要非常好的进行控制。
关于晶振电路的电阻和电容请也同样按照我们手册推荐的电路给出,因为:
首先和晶体串联的那个电阻,据我们的测试没有也应该是可以的。
但是推荐使用这个电阻。
因为晶体输出的是方波,这将引起谐波干扰,尤其是阻抗严重不匹配的情况下,加上电阻后,该电阻将与输入电容构成RC积分平滑电路,将方波转换为近似正弦波,虽然信号的完整性受到一定影响,但由于该信号还要经过后级放大、整形后才作为时钟信号,因此性能并不受影响。
还有一点就是减小回波干扰及导致的信号过冲。
另一个和晶体并联的电阻,是必须要有的,这个电阻是为了帮助起振用的。
要想构成一个振荡器,要求放大电路有一个合适的增益,因此通常会加入反馈电阻降低电路的增益为一个合适的值,这就是加入电阻的作用。
如果不加的话起振就会有问题。
在gp2上电之后高速晶振和32k晶振应该自动起振,如果没有,说明电路或者芯片由问题-这个是判断芯片损坏的一种方法。
示波器的探头要调到x10档。
高速晶振我们推荐使用陶瓷晶振,因为起振时间快,而且tdc-gp2可以对陶瓷晶振进行校准。
用石英晶振没有太大的作用,而且起振时间慢,对于功耗控制上比较难。
关于电源控制问题
为了防止灌电流对于芯片的损坏,tdc-gp2的Vio和Vcc电源需要满足一下要求:
首先电源为TTL和CMOS电平兼容,需要满足公式Vio>,否则如果Vcc过大,将会形成灌电流,io内部的保护2级管将会被击穿,可能使芯片过热甚至烧毁芯片,所以在控制电源上,一定要注意以上所提到的问题,避免不必要的损失。
还有就是电源的稳定性。
如果在电源上有周期性的干扰的话,对于测量是非常不利的。
首先时差测量的精度和电源稳定性有关,还有温度测量也同电源有关。
请尽量避免由于电源线干扰,稳定电源值,从而获得高质量的测量结果。
将gp2Vio电源的滤波电容加到200uf,而且离gp2越近越好。
关于spi通信:
我们手册上所讲的spi通信需要将时钟相位置1,时钟极性置0。
但是对于不同的单片机似乎有所不同。
在msp430中的spi通信时钟相位和时钟极性的定义与摩托罗拉正好相反。
所以在进行通信调试的时候,请改变一下时钟相位和时钟极性进行测试,看看到底适用哪种情况。
关于温度测量问题:
首先温度测量,要求电源电压要稳定,不要有周期性的噪声。
在测量的时候注意选择合适的电容对传感器和参考电阻放电。
传感器至少在500欧姆以上。
如果放电时间过短,将会被视做短路。
正常情况下gp2测量4个数值,那么状态寄存器将会指到第4个寄存器。
时钟标定:
首先在时钟标定前一定要选通start通道。
因为实际上时钟的校准是内部的一个用4M周期对于32k晶振周期的测量。
关于通信测试:
在测量时间脉冲之前,首先我们建议先测试一下单片机和tdc-gp2的通信是否正常。
因为在做测量之前,我们要保证首先单片机和gp2已经建立通信。
那么如果后面出现问题,则可以不再考虑spi通信问题。
具体测试可以首先写入寄存器1,然后从结果寄存器5(8位寄存器)里面读取写寄存器1的高8位。
如果spi通信正常,那么结果寄存器5应该可以时时反应结果寄存器1的高8位。
长时间测量范围的误差:
在测量范围2中,如果测量的时差很大,那么我们建议应用高温度稳定的高速晶振。
因为测量范围2的测量原理实际是tdc测量和数高速时钟周期的融合。
那么大时差的情况下,对于晶振的稳定性要求需要很高,因为数时钟周期数会很多。
如果假设时钟周期稳定性为10ppm,那么一个周期的话误差为250ns的百万分之10,,如果测量范围很大,比如说100us,那么误差累加会有1ns之多。
因此极力建议在测量大时间间隔时使用高稳定性的晶振。
因为频率误差会以频率的个数累加起来。
关于电源稳定对于测量及测量范围影响问题:
因为TDC-GP2的高速测量单元的测量偏差LSB是与Vcc的电源电压有密切关系的,电源电压范围从那么在这个范围内LSB的变化是很大的,35-111ps,那么电压越高,LSB越好,那么在低压情况下,测量范围1的测量范围也会随之增加。
而且电源对于测量出了会影响LSB的值之外,还会引入一个漂移。
在电压不同情况下引入的漂移量是不同的,因此需要保证在测量过程中电源电压保持一定。