TOF方案在DW1000上的实现(一):时间戳和延时收发

发布时间 2023-03-24 18:24:26作者: 不回本不改名

说明

我在之前的一篇博客《基于飞行时间的测距理论介绍》中介绍了基本的方案原理,现在再研究一下DW1000芯片内部跟TOF相关的功能。

系统时钟

DW1000内部有一个40bit长的系统时钟计数寄存器组Register file: 0x06 – System Time Counter

DW1000芯片使用38.4Mhz晶振作为外部时钟源,通过PLL进行13倍频到499.2Mhz后再进行四分频到124.8Mhz信号作为内部系统总时钟。

在UWB系统中一般以一个tick为基本的时间单位,一个tick为15.65皮秒。因此一个124.8Mhz的时钟周期(1/124.8Mhz ≈ 8012.82ps)约等于512个tick的时间(512 * 15.65ps = 8012.8ps)。

对于这个40bit的寄存器来讲,他的单位为1个tick,但又由于他以124.8Mhz为时钟进行累加,所以它每次累加都要累加512(2^9)个tick,因此它的低9bit总是为0。

该寄存器的溢出时间便为2^40 * 15.65ps(1个tick时间) ≈ 17s,溢出后重新归零。每次上电复位开始运行,休眠时暂停。

收发时间戳

首先介绍RMARKER,在IEEE 802.15.4 UWB PHY标准规定,UWB传输帧中的PHR(也就是PHY的头部)的起始事件作为作为标定数据接收或者发送的关键时间点。

以接收为例,接收端通过天线接收空中的UWB信号,当接收机成功接收到前导码和SFD后,接收机继续接收到达天线上的UWB信号帧中PHR的第一个symbol时,就可以认为该帧被接收到了。因此便把这个时间点作为接收机接收到UWB数据的时间点。这个点便称之为RMARKER,ranging marker。

同样的,发送便是发射机发送的UWB信号帧中PHR的第一个symbol送到天线端即将发送到空中的时间。

可以看到,无论是SS_TWR还是DS_TWR测距算法,都离不开RMARKER来计算飞行时间。

在DW1000芯片中,芯片发送或者接收UWB帧时,能够把出现RMARKER事件时的系统事件作为时间戳保存到相关寄存器组中去。

对于发送,会记录到发送时间戳寄存器组Register file: 0x17 – Transmit Time Stamp。

对于接收,会保存到接收时间戳寄存器组Register file: 0x15 – Receive Time Stamp

以发送时间戳寄存器组为例,该寄存器组在手册中的说明如下:

可以看到,该寄存器组由3个32bit寄存器组合而成。主要分为TX_STAMP和TX_RAWST两部分。每部分占用40个bit。

TX_RAWST为芯片内部数字电路读到RMARK的原始时间,而TX_STAMP是经过天线延迟补偿后的修正值。我们知道信号从天线传输到内部数字寄存器实际上会存在一定的延迟,为了提高测距的准确度,芯片特意设计了这一个补偿机制在里面。关于这一部分的说明后面有空再细讲。

可以看到时间戳的长度为40个bit,格式和单位和系统定时器一样。当发送UWB到出现RMARKER事件时,芯片会将系统时钟寄存器值记录到该时间戳寄存器中。

接收数据时亦然。

延时收发

延时收发功能也是用于测距的重要功能,该功能通过设置Register file: 0x0A – Delayed Send or Receive Time寄存器组进行延时时间设置

该延时寄存器和系统时间寄存器格式和单位一致,但由于你不能设置小于512个tick单位的时间,所以低九位无法设置,或者说设置无效。

并且要注意设置的值是一个具体的时间值。例如当你想在收到一个数据包后,想要延时100ms后回发一个数据包,那么延时时间应该是先把前面收到数据的时间戳读出来,再加上100ms写到延时收发寄存器里,而不是直接写100ms的值到寄存器中。

通过这种延迟收发功能,可以更方便的控制收发时序。例如在上面的SS-TWR中,就可以通过这种方式来实现设备B收到数据后延时回发的功能。