【已解决】DW1000双边测距DS-TWR,UWB测距,双边收发,延时收发的问题

一. 原理

UWB测距的基本原理是三条消息的收发,也即Poll, Response, Final三条消息,通过读取时间戳,然后确定时间差,从而计算距离。
图1 双边测距原理
对应的代码(官方例程):
在这里插入图片描述

二、调试过程的问题

由于涉及到两个UWB之间的收发,1发2收,然后2发1收,如果其中一个出现问题,另一个也会显示读数的问题,因此来回调整非常麻烦。一般是一步一步地实现,比如保证1是在持续发送,然后看2是否能收到,没问题之后再让2发送1接收。
由于测距需要延时发送,以确定精确的时间戳。而如果延时设计不正确,则会导致发送失败。在前期调试的时候总是出现这个错误:已经接收到消息,但是延时响应总是失败。
在这里插入图片描述
可以看出T2端接收Poll成功,但是发送响应消息失败了,发送失败之后,T1端将无法发送Final消息。如果改成立即发送,则会发送成功。因此延时发送存在问题。为什么?原因在于延时参数设置小了,在还没启动发送的时候,就已经到了设置的时间。打个比方,比如延时10分钟,预计是9点发送,但是运行到dwt_startTx的时候就已经9点半了,那还怎么发送,这就会失败。如果延时1小时,预计10点发送,运行到准备发送的dwt_startTx的函数时,还有一些时间才到预定发送时间,因此这种就可以成功。
在这里插入图片描述
比如将官方例程中的参数改到10000,则会显示发送成功。当然根据实际情况再适当调整即可。另外Rx_TimeOut能设置为0就设置为0(禁止超时),免得小了会造成超时错误,等其他都调通了再改一下这个数。最终运行结果如下,耗时四五天的测距调试终于完成,仅仅ResPonse的报错就调试约两天多,主要开始不知道怎么改。然后改其他地方,又造成其他错误,然后又往回倒腾,反反复复调试。终于理解后,差不多半天就解决了调试问题。
在这里插入图片描述

三、其他问题

时间戳的理解很重要。DW1000的基本单位是us,但是需要转换成dtu(device time unit), 将dtu理解成计数器的值即可。比如延时1000us,在程序里面转换成dtu,则为1000*UUS_TO_DWt_TIME,也就是65536000.
在这里插入图片描述
时间戳和延迟传输时间,这两者都是以设备时间单位来表达的。延时函数dwt_setdelayedtrxtime()在官方手册介绍如下。在这里插入图片描述
重点在于这个函数是操作高32位的。因为时间分辨率是512个设备时间单位,低9位必须清零。在代码里面,清零低8位后,允许将40位的值编码到32位字中,这是通过将所有零位移到低8位来实现的。也就是用这个函数需要忽略低八位。
在这里插入图片描述
如上述程序,右移低8位之后的时间(dtu),才能使用dwt_setdelayedtrxtime()延时发送。
在这里插入图片描述
而计算Final-tx时间戳的时候,需要恢复成原来的时间,则左移8位,然后加上天线延迟的时间。
总之,DS-TWR的调试主要是对时间戳的理解,如果对这里理解不清楚,则调参数的时候就容易来回折腾,找不到问题所在。以上记录,欢迎批评指正!

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值