不论是在TWR 还是TDOA定位算法中,delayed tx 都会用到,这篇博文主要解析delayed tx 实现。

何为delayed tx? delayed tx 是延时发送,为何要延时?因为这个延时可以控制,设定好延时后,可以把延时信息放到数据包中,接收者收到信息后,除了知道接收时间还能知道发送时间。具体作用参考TWR或者TDOA算法代码。

首先说几个dwm1000中用到的time

1 最重要的是dwm1000 内部时钟

从上面描述中可以得知时钟频率为63.8976GHz,这个Counter 每增加一个step,对应的时间是1/63.8976G=15.56ps ,这个时间再乘以光速,大概距离是0.0047m.

但是根据标黄的地方知道,低9bit 一直是0.

2 delayed counter

与系统时间counter对应,低9bit 也是0.

Delayed Tx 代码分析

final_tx_time = dwt_readsystimestamphi32() +0x100000;
dwt_setdelayedtrxtime(final_tx_time);

1 首先使用dwt_readsystimestamphi32() 读取系统时间counter的高32位(最低位是0,另外8bit 也是0,没有去读),然后再这个基础上加了0x100000

2 使用API 设定delayed tx时间dwt_setdelayedtrxtime(txdelay),同样,这里设置的是高32位,而不是全部40bit。

整个delay时间为0x100000 00 *15.5ps = 4160749568 ps =0.416s

这个计算方法是错的,因为用dwt_readsystimestamphi32() 读取的是高32位,低8bit虽然为0,但是实际时间可能不为0,虽然看不到,但实际存在。

例如连续两次dwt_readsystimestamphi32(),可能返回一样的值,但是低9bit 0是有差异的。所以不能用上述公式计算delay,哪如何算? 没法算,其实也没有太大用,或者实际上没用!

如何理解?

我们设定了delaytx 时间,高32bit,低8bit是0后,系统counter 增加,等到某一个时间系统counter与 delaytx counter 相等,这个时候低9bit 的0 是真实的0!

理解了上面部分再往下看代码

final_tx_ts = (((uint64)(final_tx_time & 0xFFFFFFFE)) << ) + TX_ANT_DLY;
final_msg_set_ts(&msg_f_send.messageData[FIRST_TX], final_tx_ts);
这个代码final_tx_time & 0xFFFFFFFE,是因为高32bit 的counter其实最低一位也是0,把它清楚掉。
然后右移8位,完整的时间,产生40bit 时间,后面加上tx 天线延时,就是发送端真实的发送时间。 那tx_ant_dly 低8位可以是非零吗? 可以! 因为rx tx timestamp 40bit 都是有效的,没有说低9bit为0. 当接收端接收到信息,解析messageData 就可以知道这个信息准确的发送时间。

更多内容参考蓝点无限论坛bphero.com.cn

TDOA基础之 delayed tx 实现说明的更多相关文章

  1. TDOA Delayed Tx 实现以及验证

    在博文:https://www.cnblogs.com/tuzhuke/p/11638221.html 中描述了delayed tx实现方法,这里贴出全部delayed tx 代码以及对应验证代码 1 ...

  2. TDOA 基础之 双曲线

    TDOA 的算法基础就是时间差,根据时间差换算出距离差,后面的数学理论知识就是双曲线交点问题. 双曲线方程是2次方程,解算曲线交点也就是两个2次方程求解. 首先看双曲线定义(百度百科): 双曲线(Hy ...

  3. TDOA基站 之 时间同步

    TDOA 和 TWR相比,标签可以用最少的信息来定位,但是对于基站要求很高,需要“时间同步”. 这也是TDOA算法的核心部分,很多套件对此讳莫如深,希望能沟通过本文使读者能对TODA同步有一定初步了解 ...

  4. TDOA 之 基站逻辑代码实现

    在前一篇博文里描述了基站的逻辑部分,这里贴出来具体代码实现.https://www.cnblogs.com/tuzhuke/p/11689881.html 1 Sync 信息部分 case 'S': ...

  5. TDOA 之 基站接收数据

    基站主要 接收同步节点发来的同步信号,代码里定义为S信息. 以及标签节点发来的定位信号,代码中定义为T信号. 代码中使用中断以及帧过滤功能,对模块只接收自己关心设定好的信息,通过中断告知上层,而不是长 ...

  6. 【DWM1000】 code 解密2一 工程初始化代码分析

    instance_init 函数追下去,绝大多数的代码都在初始化如下结构体 typedef struct { INST_MODE mode; instance_init -ANCHOR //insta ...

  7. 【DWM1000】 code 解密1一 去掉Main 函数多余内容

    蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 室内定位兴起,DWM1000 作为超宽带UWB的代表,在国内用的越来越多,但是可见资料非常少. 一方面 ...

  8. [Spring+SpringMVC+Mybatis]框架学习笔记(六):事务

    第7讲 事务 7.1 事务的概念 事务是一系列作为一个逻辑单元来执行的操作集合. 它是数据库维护数据一致性的单位,它讲数据库从一个一致状态,转变为新的另外一个一致状态.说的简单一点就是:如果一组处理步 ...

  9. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题

    现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...

随机推荐

  1. 017 Android 获取手机SIM卡序列号和读取联系人

    1.获取手机SIM卡序列号 //5.存储sim卡系列号 //5.1获取sim卡系列号 TelephonyManager manager = (TelephonyManager) getSystemSe ...

  2. todo---callback

    todo---callback https://blog.csdn.net/u010158267/article/details/51426963/

  3. OSI七层模型对应功能及协议

    前言 OSI七层模型:纯理论模型,所有实际设备和协议都不能对应理论模型. 每一层对应着实际的设备 物理层:中继器.集线器.双绞线 数据链路层:网桥.以太网交换机.网卡 网路层:路由器.三层交换机 传输 ...

  4. linux终端提示符修改

    Linux主机名莫名其妙的由@myhostname变成了@bogon了之后 1.在linux下添加一个127.0.0.2名叫bogon的主机此方法使用后,bogon主机名得以解析,使用的主机名仍为bo ...

  5. xorm表结构操作实例

    获取数据库信息 package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "git ...

  6. javascript:void(0);的含义以及使用场景

    一.含义: javascript:是伪协议,表示内容通过javascript执行. void(0)表示不作任何操作. 二.使用场景 1.href=”javascript:void(0);” 作用:为了 ...

  7. .Dot NET Cored简介

    一.诞生原因 1..Net平台封闭. 2.不支持跨平台. 3.受限于Windows平台性能,无法解决高性能场景. 二.优势 1.支持跨平台.开源.系统建设成本低. 2.效率和性能较好. 三.缺点 1. ...

  8. 使用VS2012编译和使用C++ STL(STLport)

    使用VS2012编译和使用C++ STL(STLport) http://cstriker1407.info/blog/use-vs2012-to-compile-and-use-the-c-stl- ...

  9. physdiskwrite 的简单使用

    physdiskwrite 的简单使用 参考  https://m0n0.ch/wall/physdiskwrite.php 来源 https://www.cnblogs.com/EasonJim/p ...

  10. Go 实现短 url 项目

    首先说一下这种业务的应用场景: 把一个长 url 转换为一个短 url 网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长 url 地址转换为短 url 地址 通过短 url ...