光电工程师社区

标题: TDC-GP2在时差法(TOF)脉冲式激光测距中的应用 [打印本页]

作者: zdkm    时间: 2007-11-6 00:40
标题: TDC-GP2在时差法(TOF)脉冲式激光测距中的应用
摘要:
在脉冲式激光测距仪的设计当中,时差测量(time of flight measurement)成为了一个
影响整个测量精度最关键的因素。德国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 的时间测量从0ps-1.8us,相对于距离来讲大约为0-270m。测量范围2 的测量范围从2 倍的高速时钟周期到4ms.也就是说最高的距离测量可以到25 公里以外.那么我们下面就以不同的测量范围来进行介绍.

测量范围1:
0ps-1.8us
在这个测量范围下,TDC-GP2 芯片的测量工作全部是由TDC 高速测量单元完成的。在这个测量范围中,gp2 的start 通道,stop1,stop2 通道都可用。每个stop 通道有4 个脉冲的测量能力。在这个测量范围下,测量结果可以选择校准结果(32 位)或者非校准结果16 位。推荐使用32 位的校准结果,也就是每次测量都对TDC 测量单元进行一次校准。

需要引起注意的问题:
- 对于TDC-GP2 来讲触发它的脉冲宽度必须要大于2.5ns。
- 在 start 通道的触发边沿与第一个 stop 通道的脉冲边沿之间的时间间隔要大于 3.5ns。
- 推荐自动校准结果,并且选择每次测量完成后进行自动校准。 这个功能通过设置寄
存器0 的自动校准位为0 来开启。
- 如果计算stop1 和stop2 通道的脉冲时差的话,脉冲的时差范围可以降低到0。Start 到
最后一个stop 脉冲的距离不能够超过1.8us,这是由于硬件本身所限制的。
在这个测量模式下测量流程以及典型的寄存器设置如下:


单片机与tdc-gp2 的通信是通过spi 串口完成的,那么对于测量范围1 的一个典型的测量过程为:
void gp2config()
{
SPIwrite8 (0x50); //上电复位
//配置寄存器:
SPIwrite32 (0x80000420) ; //选择测量范围1,自动校准,晶振上电后一直起振。
SPIwrite32 (0x81014100) ;//stop1 接受1 个脉冲,定义计算方法,用stop1 通道的第一个
脉冲减去start 脉冲
SPIwrite32 (0x82E00000) ; // 开启所有中断源
SPIwrite32 (0x83000000) ;
SPIwrite32 (0x84200000) ;
SPIwrite32 (0x85080000) ;
}

//测量循环:
void measurement()
{
SPIwrite8 (0x70) ;//初始化测量,通知gp2 进入测量准备状态
Check INTN=0?
SPIwrite32 (0xb4) ; //发送命令读状态寄存器
SPIread8 (STAT) ;
STAT&0x0600>0?//=>说明有测量溢出,有问题
SPIwrite32(0xb0) ; //发送命令读reg0 结果
SPIread32(reg0) ;
}

那么单片机在从gp2 读取完数据之后,可以对数据进行处理,来计算脉冲来回的距离。在上面的测量过程中如果gp2 在被初始化之后,并没有接受到任何start 信号,测量将不会发生。也不会产生中断。只有start 信号被接受后,测量才被触发,那么无论是测量正常还是在规定时间内没有接受到stop 脉冲,在gp2 的INTN 管脚都会有中断信号产生,通过判断状态寄存器的内容来判断测量是否正常。

注:在接受start,stop 脉冲之前,必须要将gp2 的管脚en_start,en_stop 置高平,否则start,stop 通道则不会被选通,测量也不会被触发!!

应用平均提高精度的方法:
上面所说的情况为,你的激光start 脉冲给tdc-gp2 的start 通道,激光的返回脉冲给tdcgp2的stop 通道的情况。
在这种情况下,gp2 的单次测量精度为65ps。当测量的输出频率并不是非常重要的情况下,比如每秒钟输出1 到2 次结果,那么这个时候为了提高测量精度,我们可以通过多次测量平均的方法来消除系统误差。为了使gp2 能够通过平均的方法来大大的减少误差,那么下面推荐的测量设计是非常有效的,可以将系统误差的峰峰值降低到10ps 一下。如下图所示:

如上图所示,在这个情况下我们使用的是测量范围1,激光的发射和接收脉冲信号是给到stop1 和stop2 的,而在tdc-gp2 的start 通道,start 信号是由单片机给出的一个不参与测量的start 信号。测量过程如下:

首先由单片机发出一个不参与测量的但是要触发测量用的dummy start.需要这个信号是因为start 通道的这个信号是告诉gp2 现在开始进入测量状态了。那么在至少50ns 后,单片机触发激光器产生发射信号同时将这个信号输入到stop1 通道。那么接收到的laser脉冲信号则输入到stop2 通道。也就是说用stop1 和stop2 来测量激光发射和接收的时间差,而start信号是由单片机给出来触发gp2 的。
那么之所以这样的原因是在tdc-gp2 的内部,有一个噪声单元,通过寄存器设置可以触发这个噪声单元。噪声单元将会在gp2 的start 通道脉冲上加任意分布噪声,那么这样做的目的是为了在平均的时候,可以大大消除量化误差和系统误差。那么这个一位的设置为寄存器5 中的EN_STARTNOISE 设置。

在没有平均的情况下,测量所得到的结果如下图:


对测量结果进行500次平均后:


这样做的好处为:
1.stop1 和stop2 的时间间隔测量可以最低到0。
2.通过这个测量之后如果平均gp2 的测量结果,可以大大消除系统误差,跟据平均的次数不同,最多可以使gp2 的精度提高至小于6ps.

3.对于温度变换是相当稳定的那么需要注意的是由单片机给的start 信号与激光的start 信号(也就是stop1 信号)的时间要在50ns 以上,这个时间是为了给start 信号加噪声。在这个情况下的测量过程中需要将上面的寄存器1 的配置稍作修改:

SPIwrite (0x81194900) ; ;//stop1 和stop2 通道分别接受一个脉冲, 定义计算方法,用stop2 的第一个脉冲减去stop1 的第一个脉冲。在应用我们的gp2 评估测量系统测试情况,测量1us 时间间隔在平均1000 次后,噪声曲线如下:
在平均1000 次的情况下,输出的峰峰值噪声降低到10ps 以内,相当于分辨1mm 的距离。那么通过这种平均的方式提高测量精度,对于测量频率不高的激光测距应用是非常有帮助的。

测量范围2:2xTref-4ms

在测量范围2 当中,测量是通过TDC 测量单元和一个预计数器共同完成的。如图所示:


在测量时差相对较大的时候,tdc 的内部核心测量单元只测量如图所示从start 信号开始到下一个参考时钟周期的上升沿,然后测量stop 信号上升沿到下一个参考时钟周期的上升。那么中间的时间,则由数时钟周期coarse count 来得出。因此在测量范围2 结果的计算公式为上面图中的公式,其中Tref 为时钟周期,clkhsdiv 为分频因数,Cc 为coarse count 所数的周期个数,Fc1 为start 信号开始到下一个参考时钟周期的上升沿时间,Fc2 为stop 信号上升沿到下一个参考时钟周期的上升沿时间,cal1 和cal2 为tdc 核心测量参考时钟周期,做校准用。
在这个模式下TDC-GP2 应用一个内部的计数器将测量范围扩展到了4ms。那么选择这个测量范围后,测量只能够在start 通道和stop1 通道中进行,stop1 通道最多接受的脉冲数为3 个。那么测量的时差范围从2 倍的内部时钟周期最大到4ms 的时差。在这个精度下的典型精度保持不变,还是65ps。

需要引起注意的问题:
- 对于GP2 来讲触发它的脉冲宽度必须要大于3.5ns。
- 在start 脉冲触发之后stop 脉冲和start 脉冲间隔至少要大于2倍的内部参考时钟周期。
- 在没有应用精度可调节模式的情况下 GP2 的测量必须要进行校准。在低采样频率的情况下最简单的方法就是应用芯片自带的自动校准功能。或者也可以应用手动校准TDC。
TDC-GP2 的测量范围2的优点:
- 整个的测量范围最大可以达到4ms,精度还是65ps,系统的精度将主要取决于光学系统中其他器件的精度。
- 对于长距离测量为了能够得到相当强度的返回信号高能的激光脉冲信号是必要的。
- 可以检测到最多3 个脉冲反射,这个时候脉冲对的精度为2 个时钟周期(至少2 个时钟周期的时间间隔)。
- 在这个测量模式下可以通过平均的方式消除噪声。采样100 次数据,那么平均之后的标准偏差将会被减少 100=10 倍,,到6.5ps ≡ 0.98mm。做为必要的条件start 信号和stop 信号必须与时钟信号完全孤立开,没有任何关联。否则采样的量化误差将会落在同一位置上。
在这个测量模式下测量流程以及典型的寄存器设置如下:


void gp2config()
{
SPIwrite8 (0x50); //上电复位
//配置寄存器:
SPIwrite32 (0x80008468) ; // 选择测量范围2,自动校准,晶振上电后一直起振。
SPIwrite32 (0x81214200) ;// stop1 接受1 个脉冲,定义计算方法,用stop1 通道的第一个
脉冲减去start 脉冲
SPIwrite32 (0x82E00000) ; // 开启所有中断源
SPIwrite32 (0x83000000) ;
SPIwrite32 (0x84200000) ;
SPIwrite32 (0x85080000) ;
}
//测量循环:
void measurement()
{
SPIwrite8 (0x70) ;//初始化测量,通知gp2 进入测量准备状态
Check INTN=0?
SPIwrite8 (0xb4) ; //发送命令读状态寄存器
SPIread8 (STAT) ;
STAT&0x0600>0?//=>说明有测量溢出,有问题
SPIwrite8(0xb0) ; //发送命令读reg0 结果
SPIread32(reg0) ;
}

在上面的gp2 测量范围2 寄存器设置中,需要注意的是在寄存器1 中设置接受脉冲个数的时候,如果你预期接受1 个脉冲,则需要设置为2 个。因为在测量范围2 中如原理图所示实际上是进行了两次测量,因此要多设置一个脉冲。
同样在测量范围2 中,对于系统测量数据进行平均同样可以大大的提高测量精度,因此用户可以根据自己的实际情况和所需的测量频率来进行相应得平均测量。
作者: zdkm    时间: 2007-11-6 00:41
标题: MSP430与TDC-GP2脉冲式激光测距中的例程代码
例程代码:
下面是用C 语言编写的MSP430F135 系列单片机对于gp2 控制的一些控制函数的例程代码+注释,其中描述了一些对gp2 功能上的控制,通信为单片机用普通io 口模拟spi通信操作,仅供参考:
//============端口设置程序================//
void port_init(void) //端口初始化
{
P5DIR |=BIT1;//EN_STOP
P5DIR |=BIT2;//START
P5DIR |=BIT3;//ENSTART
P5DIR &=~(BIT4);//INTN
P6DIR |=BIT5;//RSTN
P5OUT &=~(BIT1);
P5OUT &=~(BIT2);
P5OUT &=~(BIT3);
P5OUT &=~(BIT0);//stop
P6DIR |=BIT0;//SCK-输出方向
P6DIR |=BIT1;//SSN-输出方向
P6DIR &=~(BIT2);//SO-输入方向
P6DIR |=BIT3;//SI-输出方向
P6OUT &=~(BIT0);//SCK-空闲时低平,spi 时钟极性为0。
P6OUT |=BIT1;//SSN-片选在没有通信情况下置高
}
void spi_enable(void) //开启spi 通信,将ssn 置低
{
P6OUT &=~(BIT1);//ssn 置低
_NOP();
return;
}

void spi_disable(void) //关闭spi 通信,将ssn 置高
{
P6OUT |=BIT1;//ssn 置高
_NOP();
return;
}
void send_zero(void) //发送0
{
P6OUT |=BIT0;//SCK 高电平
_NOP();
P6OUT &=~(BIT3);//SI-输出一个低平
_NOP();
P6OUT &=~(BIT0);//SCK 低平
_NOP();
return;
}
void send_one(void) //发送1
{
P6OUT |=BIT0;//SCK 高电平
_NOP();
P6OUT |=BIT3;//SI-输出一个高平
_NOP();
P6OUT &=~(BIT0);//SCK 低平
_NOP();
return;
}
//============================================//
//=====================SPI 写数据=====================//
void spi_write8(unsigned char wbuf8) // spi 写入8 位数据
{
unsigned char cnt,tmp=0x80;
spi_enable();
for(cnt=8;cnt>0;cnt--)
{
if((wbuf8&tmp)>0)
send_one();//发送1
else
send_zero();//发送0
tmp /=2; //tmp 右移一位
} //没有spi 关闭命令,测试程序中代码关闭!
return;
}
void spi_write16(unsigned int wbuf16) // spi 写16 位数据
{
unsigned char cnt;
unsigned int tmp=0x8000;
spi_enable();
for(cnt=16;cnt>0;cnt--)
{
if((wbuf16&tmp)>0)
send_one();//发送1
else
send_zero();//发送0
tmp /=2; //tmp 右移一位
}
_NOP();
spi_disable();
return;
}
void spi_write32(unsigned long wbuf32) // spi 写32 位数据
{
unsigned char cnt;
unsigned long tmp=0x80000000;
spi_enable();
for(cnt=32;cnt>0;cnt--)
{
if((wbuf32&tmp)>0)
send_one();发送1
else
send_zero();//发送0
tmp /=2; //tmp 右移一位
}
_NOP();
spi_disable();
return;
}
//============================================//
//=====================SPI 读数据=====================//
unsigned long spi_read32()
{
unsigned char cnt;
unsigned long tmp=0x80000000;
unsigned long int rbuf32=0x00000000;
spi_enable();
for(cnt=32;cnt>0;cnt--)
{
P6OUT |=BIT0;//SCK
_NOP();
if((P6IN &0X04)>0X00)//P6.2 SO
rbuf32 |=tmp;
tmp /=2;
P6OUT &=~(BIT0);// SCK
_NOP();
}
_NOP();
spi_disable();
return(rbuf32);
}
//============================================//
//===========GP2 上电复位程序==================//
void GP2_RESET(void)
{
P6DIR |=BIT5; //设置p6.5 输出方向
P6OUT |=BIT5; //输出高平
_NOP();
P6OUT &=~(BIT5); //输出低平
_NOP();
P6OUT |=BIT5; //输出高平
_NOP();
}//给gp2RSTN 管脚一个Reset 的方波
//============================================//
//===========GP2 寄存器配置程序====================//
void GP2_init(void)
{
unsigned long REG0,REG1,REG2, REG3, REG4,REG5;
unsigned char PU=0X50;
unsigned char init=0x70;
REG0=0X80008420;//校准陶瓷晶振时间为8 个32k 周期,244.14us.
//设置高速晶振上电后一直起振.设置测量范围1,自动校准,上升沿敏感
REG1=0X81014100;//预期stop1 脉冲数1 个.计算第一个stop1-start
REG2=0X82E00000;//开启所有中断源
REG3=0x83080000;//
REG4=0x84200000;//
REG5=0X85080000;//
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 时钟校准程序===================//
void GP2_cal(void)
{
unsigned char cal_start=0x03;
unsigned char read_reg0=0xb0;
unsigned long int CAL;
float CAL_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();//通过计算校准系数为244.146/(float(CAL)/65536*0.250))
_NOP();
return;
}
//=============================================//
//=========时间测量状态寄存器判断程序==========//
void GP2_TMSTAT()
{
unsigned char stat=0xb4;
unsigned long a;
unsigned int b;
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 信号==========//
void GP2_START(void)
{
P5OUT &=~(BIT2);//START
_NOP();
P5OUT |=(BIT2);
_NOP();
P5OUT &=~(BIT2);
_NOP();
return;
//===========================================//
//============通讯测试===============//
void testcomunication(void)
{
unsigned long int REG1;
unsigned char cnt;
unsigned char tmp=0x80;
unsigned char test_reg=0xb5; //读结果寄存器5,反映寄存器1 的高8 位
unsigned char test_reg0=0x00;
REG1=0x81112233; //写寄存器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)//P6.2 SO
test_reg0 |=tmp;
tmp /=2;
P6OUT &=~(BIT0);//SCL
_NOP();
}
spi_disable();
}
//===================================//
//==========测试fire 脉冲产生测试=============//
void fire(void)
{
unsigned char TDC_init=0x70;
unsigned char start_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 信号只能发送一次,系统将会挂起
}
//===================================//
//======时间测量测试=========//
void timemeasurement(void)
{
unsigned long int M;
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();
}
作者: zdkm    时间: 2007-11-6 00:43
在应用TDC-GP2时还需要注意的一些细节问题:

关于32K 晶振和4M高速晶振需要注意的问题
这两个晶振都可以通过外部来给出。但是4M高速晶振我们建议用我们的推荐电路,因为这个晶振时钟是参与测量的,所以需要非常好的进行控制。关于晶振电路的电阻和电容请也同样按照我们手册推荐的电路给出,因为:
首先和晶体串联的那个电阻,据我们的测试没有也应该是可以的。但是推荐使用这个电阻。因为晶体输出的是方波,这将引起谐波干扰,尤其是阻抗严重不匹配的情况下,加上电阻后,该电阻将与输入电容构成RC 积分平滑电路,将方波转换为近似正弦波,虽然信号的完整性受到一定影响,但由于该信号还要经过后级放大、整形后才作为时钟信号,因此性能并不受影响。还有一点就是减小回波干扰及导致的信号过冲。另一个和晶体并联的电阻,是必须要有的,这个电阻是为了帮助起振用的。要想构成一个振荡器,要求放大电路有一个合适的增益,因此通常会加入反馈电阻降低电路的增益为一个合适的值,这就是加入电阻的作用。如果不加的话起振就会有问题。在gp2 上电之后高速晶振和32k 晶振应该自动起振,如果没有,说明电路或者芯片由问题-这个是判断芯片损坏的一种方法。示波器的探头要调到x10 档。高速晶振我们推荐使用陶瓷晶振,因为起振时间快,而且tdc-gp2 可以对陶瓷晶振进行校准。用石英晶振没有太大的作用,而且起振时间慢,对于功耗控制上比较难。

关于电源控制问题
为了防止灌电流对于芯片的损坏,tdc-gp2 的Vio 和Vcc 电源需要满足一下要求:首先电源为TTL 和CMOS 电平兼容,需要满足公式Vio>Vcc-0.5V,否则如果Vcc 过大,将会形成灌电流,io 内部的保护2 级管将会被击穿,可能使芯片过热甚至烧毁芯片,所以在控制电源上,一定要注意以上所提到的问题,避免不必要的损失。
还有就是电源的稳定性。如果在电源上有周期性的干扰的话,对于测量是非常不利的。首先时差测量的精度和电源稳定性有关,还有温度测量也同电源有关。请尽量避免由于电源线干扰,稳定电源值,从而获得高质量的测量结果。将gp2 Vio 电源的滤波电容加到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,2.5ps,如果测量范围很大,比如说100us,那么误差累加会有1ns 之多。因此极力建议在测量大时间间隔时使用高稳定性的晶振。因为频率误差会以频率的个数累加起来。

关于电源稳定对于测量及测量范围影响问题:
因为TDC-GP2 的高速测量单元的测量偏差LSB 是与Vcc 的电源电压有密切关系的,电源电压范围从1.8-3.6V,那么在这个范围内LSB 的变化是很大的,35-111ps,那么电压越高,LSB 越好,那么在低压情况下,测量范围1 的测量范围也会随之增加。而且电源对于测量出了会影响LSB 的值之外,还会引入一个漂移。在电压不同情况下引入的漂移量是不同的,因此需要保证在测量过程中电源电压保持一定。
作者: zdkm    时间: 2007-11-21 18:26
这个芯片在时间测量上确实很好用,在激光测距应该有一定空间
作者: liuchongqiu    时间: 2008-1-24 10:26
这个芯片确实是不错,不过就是价格太贵了一点,我当初也想用这个,后来自己用CPLD实现.如果批量价格能在25元以下,就好了. liuchong_135@163.com
作者: zjj623623    时间: 2008-1-24 17:05
标题: 很好

楼主介绍得很详细。
作者: HK2008    时间: 2008-2-29 21:27
主要是价格怎么样???
作者: hitekyw2008    时间: 2008-8-27 08:47
我公司可提供TDC-GP2芯片,德国原装进口,价格优惠!!!

TEL:0579-81006832,85298846(杨晓飒)
Email:yang_xt93@yahoo.com.cn
MSN:shenia_yang@hotmail.com
QQ: 11987525
作者: zhou_xing    时间: 2008-9-1 10:05
TDC-GP2—激光测距应用
现在有很多可以测量距离的方法,但是应用TDC 则直接测量的是光的飞行时间。这种方法非常简单,而且细节上非常微妙。

大家都知道光的传播速度是非常快的,为2,99792×  m/s。因此利用光的传播速度测量距离意味着光的飞行时间是非常短的,在仅仅1 微秒的时间内光可以飞行300 米之远。因此高精度测量距离就意味着要非常高精度的测量光的飞行时间间隔。

实际操作中采用反射模式。发射器和接收器安装在同一个设备上。计算公式为d=c×t/2 (d为距离,c为光速).根据此公式,通过1km所用的时间就是6.7us. 如果距离分辨率要达到1cm,则时间分辨率需达到67ps.用ACAM公司的标准TDC(分辨率达110ps的GP1), 只对4次测量进行取样,分辨率就可达到1cm.对多次采样取平均值,在距离为14km的测量中分辨率可达1mm!

一般来讲当光线遇到物体的时候会被反射回来。因此在这种情况下光将飞行两倍的被测距离。因此我们有如下对应关系:
1ns - 150mm 距离 (双倍包括反射)
100ps - 15mm
10ps – 1.5mm
这个精度范围非常适合我们的TDC 系列芯片,例如TDC-GP2, 精度为65ps,相当于9.8mm。

这是运用GP2激光测量的原理图


和GP2周边的外围器件图


申明:
宽创公司是德国acam官方授权的技术支持和供货总代理,是您可以信赖的长期合作伙伴,对您的长期技术开发和提供长期稳定的,价格最优惠

,最新版的原装德国进口芯片有严肃承诺。市场上最近出现了一些假货和冒牌供应者,请客户慎重选择合作伙伴,以免损伤您的利益。请使用和

正在使用的客户及时联系我公司,请注意每片芯片上的批号和其他标记,公司为确保客户利益,每次出货的芯片编号都会及时改变,供应商会做详

细的记录,以便增加芯片的可追述性和后续服务支持.如果有技术等任何问题,请及时与我单位沟通,谢谢.

**
上海宽创电子科技有限公司 http://www.acam-china.com
Address:上海市浦东新区长柳路58号证大立方大厦1603室  
联系人:周星星  (市场部经理), 张博士
Tel:86-21-51691922-131  
Fax:86-21-33927626
Mobile:13681676376, 13916212954
MSN: zhou_xingxing@msn.com  
Email: star@acam-china.com
*
作者: yuzhenzhen    时间: 2008-9-11 10:01
介绍的很详细,受教了!!!!
作者: zmkml    时间: 2008-9-26 15:47
请问楼主,
我5个寄存器设置如下
    spiwrite32 (0x80a38328);
    _NOP();
    spiwrite32 (0x81214400);
    _NOP();
    spiwrite32 (0x82e03200);
    _NOP();
    spiwrite32 (0x83083300);
    _NOP();
    spiwrite32 (0x84203400);
    _NOP();
    spiwrite32 (0x85080000);
为什么FIRE端只有两个脉冲输出?
作者: xiaoweiwb    时间: 2009-2-11 16:03
好资料!谢谢提供!!!!!!!!!!!!!!
作者: h-haiquan    时间: 2011-12-14 09:14
专业啊。脉冲法!




欢迎光临 光电工程师社区 (http://bbs.oecr.com/) Powered by Discuz! X3.2