DWM1000 测距原理简单分析 之 SS-TWR代码分析2 -- [蓝点无限]

article/2025/10/7 19:38:55

蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 

 

正文:

首先将SS 原理介绍中的图片拿过来,将图片印在脑海里。

对于DeviceA 和 DeviceB来说,初始化代码都一样,而后面部分是一个while循环,一直执行测距任务。

DeviceA(ex_06a_ss_twr_init ) 部分代码

 1 tx_poll_msg[ALL_MSG_SN_IDX] = frame_seq_nb;
 2 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);
 3 dwt_writetxdata(sizeof(tx_poll_msg), tx_poll_msg, 0);
 4 dwt_writetxfctrl(sizeof(tx_poll_msg), 0);
 5 
 6 /* Start transmission, indicating that a response is expected so that reception is enabled automatically after the frame is sent and the delay
 7          * set by dwt_setrxaftertxdelay() has elapsed. */
 8 dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);
 9 
10 /* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */
11 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
12         { };

 

上述过程主要完成任务:发送数据以及打开接收器等待数据

DWM1000 发送数据通常只需要调用三个函数即可: dwt_writetxdata  dwt_writetxfctrl  dwt_starttx

dwt_writetxdata 指定发送什么数据,上述代码发送的数据是  tx_poll_msg,另外两个参数分别是发送数据长度,以及要将数据放到DWM1000 发送缓存的offset(默认设置为0即可)

dwt_writetxfctrl   发送控制参数设定,这个基本也是不需要修改,第一个参数是发送数据长度,第二个参数告诉DWM1000 从发送缓存那个offset 开始发送(也就是说,并不是放到发送缓存中的数据就会被发送出去)

dwt_starttx:启动发送,一共参数,可以按位控制,上述代码中第一个控制是否里面发送或者是延时发送,第二个控制是否在一定时间后打开接收器。

注意:在调试过程中,如果需要发送数据后再接收一个数据,通常需要使用DWT_RESPONSE_EXPECTED,而且要考虑POLL_TX_TO_RESP_RX_DLY_UUS,这个参数在dwt_setrxaftertxdelay中设定。

 

DWM1000 有很多事件,也有对应的标志flag,例如发送数据,对应的发送成功标志,接收数据,有对应的接收成功标志,当然也有fail的标志,具体可以参见《dw1000_user_manual.pdf》的 Register file: 0x0F – System Event Status Register。

事件flag 有很多,我们在基础实验中基本只会遇到上述代码中的 SYS_STATUS_TXFRS /SYS_STATUS_RXFCG/SYS_STATUS_ALL_RX_ERR,分表表示发送成功标志、接收成功标志以及接收错误,其中接收错误标志其实代码中是很多flag 的或,例如数据帧错误,timeout 等。所有flag 都是写1 清0.

完成上述代码分析,再看剩余两行代码

1 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);        
2 /* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */
3 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
4         { };

第一行是在发送之前,将可能的发送完成标志位清除,后面的while 循环是等待flag 置起来,也就是在等待DeviceB发送来的无线数据(并不是无限期等待,等待时间timeout 上面的代码直接设置过了)。

上述代码分析完成了DeviceA 在A点的任务。

DeviceB 代码分析

DeviceB的代码在ex_06b_ss_twr_resp目录,同样有dwm1000初始化,这个所有dwm1000 基础工程都一样,剩余部分也是一个while1 大循环。现在拿出部分代码,分析DeviceB在B点的动作。

 1         /* Activate reception immediately. */
 2         dwt_rxenable(0);
 3 
 4         /* Poll for reception of a frame or error/timeout. See NOTE 6 below. */
 5         while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
 6         { };
 7 
 8         if (status_reg & SYS_STATUS_RXFCG)
 9         {
10             uint32 frame_len;
11 
12             /* Clear good RX frame event in the DW1000 status register. */
13             dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);
14 
15             /* A frame has been received, read it into the local buffer. */
16             frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
17             if (frame_len <= RX_BUFFER_LEN)
18             {
19                 dwt_readrxdata(rx_buffer, frame_len, 0);
20             }
21 
22             /* Check that the frame is a poll sent by "SS TWR initiator" example.
23              * As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */
24             rx_buffer[ALL_MSG_SN_IDX] = 0;
25             if (memcmp(rx_buffer, rx_poll_msg, ALL_MSG_COMMON_LEN) == 0)
26             {
27                 uint32 resp_tx_time;
28 
29                 /* Retrieve poll reception timestamp. */
30                 poll_rx_ts = get_rx_timestamp_u64();

上面代码摘自ex_06b_ss_twr_resp while 大循环部分代码

首先是 dwt_rxenable(0), 这个作用是强制打开接收器,参数为timeout,设置为0,意思就是一直打开。 后面的while在Device 中已经看到,是等待接收数据,如果接收成功,SYS_STATUS_RXFCG 被置为1。 可以看到除了判断SYS_STATUS_RXFCG 还判断了SYS_STATUS_ALL_RX_ERR,这个是所有RX 可能出现ERROR 合集事件,我们期望的结果是SYS_STATUS_RXFCG ,弱实际中由于干扰接收到错误的信息SYS_STATUS_ALL_RX_ERR 会被置起来,也会退出while 等待,会接着执行后面的else,else的任务是清除SYS_STATUS_ALL_RX_ERR ,然后重新回到大while 循环等待接收数据。

假如接收到数据,就会执行if 判断力的代码,首先清除接收标志SYS_STATUS_RXFCG,然后通过两个API读取数据长度以及数据

1 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
2  if (frame_len <= RX_BUFFER_LEN)
3  {
4      dwt_readrxdata(rx_buffer, frame_len, 0);
5 }

后面的判断是判断数据类型

1  if (memcmp(rx_buffer, rx_poll_msg, ALL_MSG_COMMON_LEN) == 0)

在DWM1000 基础例子中,有很多种不同的数据,数据通常包括三部分(A+B+C),A是数据头,B是实际用户希望传输的数据,C是两byte 校验码,其中A部分是Device之前相互约定,C是DWM1000 自动生成的,B根据实际应用更改。

在SS-TWR中,有两种信息,分别是 rx_poll_msg 和 tx_resp_msg ,poll_msg是DeviceA 发送给DeviceB的,而 resp_meg 是DeviceB发送给DeviceA 的,而在DS-TWR中会有更多信息,这个完全可以自由扩展。

而代码中通过if 判断,判断信息是DeviceA发送给DeviceB的poll_msg后,紧接着就读取了自己接收数据的时刻

1  poll_rx_ts = get_rx_timestamp_u64();

注意:虽然 get_rx_timestamp_u64 不是标准dwt API,但是这个函数里面是直接调用API实现的,保持下来以后可以直接当API使用。

以上代码就是DeviceB 在B 时刻接收数据的代码。

 

转载于:https://www.cnblogs.com/tuzhuke/p/9986226.html


http://chatgpt.dhexx.cn/article/ALESFLRx.shtml

相关文章

Java 处理资源的try语句 (try-with-resources, TWR)

JAVA中try块的标准形式很通用&#xff0c;但有些常见的情况需要开发者小心编写catch和finally块。这些情况是清理或关闭不再需要使用的资源。 正常情况下&#xff0c;我们用try-catch-finally语句来实现打开文件资源&#xff0c;最后再关闭清理文件资源。例如下面的代码&#…

DWM1000 测距原理简单分析 之 SS-TWR

蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: DWM1000 超宽带测距,使用的TOF(time of fly) 的方式,也就是计算无线电磁波传输时间,通过传输的时间换算成距离。 电磁波传输速率和光速一样,速度是299792.458km/s,可参见百度百…

完成“LPS node 与Crazyflie在TWR协议下的成功双向测距”实现心路历程总结

完成“LPS node 与Crazyflie在TWR协议下的成功双向测距”实现心路历程总结 1.初识TWR协议2. TWR进阶1.03.TWR协议进阶2.04.TWR协议进阶3.05.TWR协议进阶4.06.总结 说来惭愧&#xff0c;这一点点东西做了快3个月[手动狗头.jpg] 但是这个协议的深入学习让我真正认识到研究生该怎样…

惠普台式机EliteDesk TWR安装双系统

关于HP EliteDesk 800 G4 TWR安装双系统 磁盘分区BIos界面操作Linux系统安装 由于需要在Linux系统下跑ros&#xff0c;但电脑有安装win10系统&#xff0c;为了不破坏Win10系统内的资料&#xff0c;所以就选择安装双系统&#xff0c;根据我之前的安装经验&#xff0c;装个双系统…

24C02 Twr

连续写24C02&#xff0c;只有第一次能够成功,后面写都失败了。这次调整写的时间间隔。调成了5ms&#xff0c;才成功。 查看datasheet,发现有一个tWR参数。表示写的最小时间间隔。这个时间应该是内部写入所需要的时间&#xff0c;如果连续写的时间过短&#xff0c;就会失败。 但…

DWM1000 测距原理简单分析 之 SS-TWR代码分析1 -- [蓝点无限]

蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 这一篇内容主要是通过官方源码理解SS-TWR 细节 代码下载链接:https://download.csdn.net/download/duanfei255/10787882 所有代码使用方法:复制example 中的main.c到Keil MDK工…

UWB定位算法比较TDOA和TWR究竟哪个好

使用UWB技术进行定位时&#xff0c;有两种基本定位算法&#xff1a;基于差分飞行时间&#xff08;TDOA&#xff09;和双向测距&#xff08;TWR&#xff09;的UWB定位算法&#xff0c;这两种算法各有优劣&#xff0c;下面将进行比较。 超宽带是一种可用于室内定位的短距离无线电…

HP EliteDesk 880 G2 TWR无法从U盘启用

一、客户需求 客户一台HP EliteDesk 880 G2 TWR台式机&#xff0c;想更换一块固态盘&#xff0c;于是即到哥带了一块固态盘上门给客户更换固态盘&#xff0c;重新安装系统。 更换完固态盘后&#xff0c;准备重新给客户安装系统。 客户的台式机型号是&#xff1a;HP EliteDesk …

java TWR是怎么优雅我们的代码的?

我们在编写IO代码的时候&#xff0c;有的时候真的是对对java IO那种模板化的代码感到厌倦&#xff0c;而且写出来的代码&#xff0c;很臃肿丑陋。像下面这样的代码&#xff1a; public void readFile(String filePath) {FileInputStream fis null;InputStreamReader inReader …

基于UWB的室内SDS_TWR测距算法优化和定位算法融合的研究

1、内容简介 略257 2、内容说明 1、RSSI定位方法 基于接收信号强度RSS(Receive Signal Strength)[57]方法通过三个及以上己知位置的锚节点来测量移动节点发射的信号场强强度&#xff0c;从而通过己有的传播损耗模型来估算移动节点距锚节点的距离&#xff0c;从而实现位置测量…

UWB-DW1000的TWR测距及代码(五)

UWB测距过程很简单&#xff0c;两个设备&#xff08;A和B&#xff09;。设备A先发送&#xff0c;设备B等待接收 设备A 发送 P 给 设备B&#xff0c;此时读取时间戳&#xff0c;也可以等收到应答再进行读取&#xff0c;发送时间戳和接收时间戳都会保留最新一次&#xff0c;只要…

UWB DW1000 TWR测距定位功能实现

3基站对1标签进行测距的流程如下&#xff1a; 1、标签发起测距poll&#xff0c;等待3个基站的回应resp&#xff1b;依次收到3个基站的resp后&#xff0c;发送携带时间戳的final&#xff1b; 2、基站等待poll&#xff1b;收到poll后&#xff0c;发送resp&#xff0c;再继续等待…

hp 800 g4 twr linux,【拆机】HP EliteDesk 800 G4 TWR—探究塔式机箱的秘密

惠普商务台式机在专业领域口碑一直强势,其优良的结构设计与出色的稳定性素来为用户所青睐。今天的拆机要为大家带来的是——HP EliteDesk 800 G4 TWR。这款商务台式机内部做工到底如何?今天我就为大家带来答案。 按照惯例先为大家介绍一下这款产品的外观。 作为一台商务台式机…

uwb最详细的DS-TWR测距

简介 •测距、定位和数据传输。 •利用双向测距&#xff08;TOF&#xff09;测量或单向到达时间差&#xff08;TDOA&#xff09;到达时间差&#xff0c;误差在10cm&#xff0c;经过一定的滤波可以达到更低。 •跨越 3.5 GHz 至 6.5 GHz 的 6 个 RF 频段。 •支持 110 kbps&…

DRAM知识整理系列(三):部分时序参数整理

目录 一、时序参数整理 第一时序&#xff1a; 1、tCL - CAS Lantency Control 2、tRCD - RAS to CAS Delay 3、tRP - Row Precharge Timing 4、tRAS - RAS Active Time 第二时序&#xff1a; 5、CWL - CAS Write Latency 6、tRC - Row Cycle Time 7、tRFC - Row Refr…

超宽带(UWB)学习笔记——TWR测距

文章目录 前言1. 单边双向测距&#xff08;SS-TWR, Single Side - Two Way Ranging&#xff09;1.1 测距方式1.2 误差分析 2 双边双向测距&#xff08;DS-TWR, Double Side - Two Way Ranging&#xff09;2.1 测距方式2.2 误差分析 参考文献 前言 TOF&#xff08;Time Of Figh…

UWB定位的3种算法:TWR、TOA和TDOA算法

UWB定位的3种算法&#xff1a;TWR、TOA和TDOA算法 文章目录 UWB定位的3种算法&#xff1a;TWR、TOA和TDOA算法UWB定位技术一、TER定位算法二、 TOA定位算法三、 TDOA定位算法相关链接 UWB定位技术 UWB 定位原理和卫星导航定位原理相类似&#xff0c;由多个定位基站和定位标签组…

【提高准确率方法总结】

文章目录 1.数据集扩增2.增大数据集差异性&#xff0c;随机性3.使用tensor transform对数据进行预处理4.调节batch_size大小5.设置shuffleTrue6.调节学习率&#xff08;learning rate&#xff09;7.权重衰减 &#xff08;weight_decay&#xff09;8.适当增加训练轮次&#xff0…

准确率、召回率和mAP、AP50/75

1、准确率和召回率 真实值与预测值之间的关系如下左图所示&#xff0c;右图是二者之间的一个直观表示&#xff0c;同时也能清晰的看出准确率和召回率的具体含义。准确率 P P P 给出了“预测为真值的样本中确实有多少比例为真值”&#xff0c;召回率 R R R 则给出了“本来就是…

如何区分精确率(precision)、准确率(accuracy)和召回率(recall)

理解精确率(precision)、准确率(accuracy)和召回率&#xff08;recall&#xff09; 正样本 负样本 预测正例 TP FP 预测反例 FN TN TN&#xff0c;预测是负样本&#xff0c;预测对了 FP&#xff0c;预测是正样本&#xff0c;预测错了 FN&#xff0c;预测是负样本&am…