下面开始测距程序的移植。因为官方提供的ds_twr测距程序是分A、B设备的,所以这就意味着接下来需要同时调试两份程序,双倍的快乐QAQ
首先测试双方能否顺利收发。
在此之前需要重新对SPI的波特率进行配置,KEA128的SPI通道最大波特率为总线时钟二分频,这里取12MHz。
对于设备A(发送方):

  /* Configure DW1000. See NOTE 7 below. */dwt_configure(&config);//  /* Apply default antenna delay value. See NOTE 1 below. */
//  dwt_setrxantennadelay(RX_ANT_DLY);
//  dwt_settxantennadelay(TX_ANT_DLY);
//  /* Set expected response's delay and timeout. See NOTE 4, 5 and 6 below.
//  * As this example only handles one incoming frame with always the same delay and timeout, those values can be set here once for all. */
//  dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);
//  dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);
//  dwt_setpreambledetecttimeout(PRE_TIMEOUT);

之后直到while循环为止的这一部分除了第一句dwt_configure(&config); 是必须的外,其余的都用于双向测距,而当前仅测试两个DWM1000模块间能否正常收发信息包,故直接注释。

    /* Write frame data to DW1000 and prepare transmission. See NOTE 4 below.*/dwt_writetxdata(sizeof(tx_msg), tx_msg, 0); /* Zero offset in TX buffer. */dwt_writetxfctrl(sizeof(tx_msg), 0, 0); /* Zero offset in TX buffer, no ranging. *//* Start transmission. */dwt_starttx(DWT_START_TX_IMMEDIATE);/* Poll DW1000 until TX frame sent event set. See NOTE 5 below.* STATUS register is 5 bytes long but, as the event we are looking at is in the first byte of the register, we can use this simplest API* function to access it.*/while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS)){ };/* Clear TX frame sent event. */dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);/* Execute a delay between transmissions. */systick_delay_ms(TX_DELAY_MS);/* Increment the blink frame sequence number (modulo 256). */tx_msg[BLINK_FRAME_SN_IDX]++;

while循环体内直接移植官方提供的Simple TX例程,同理对于设备B(接收方)也直接移植Simple RX例程,唯一多出来的就是接收完一帧数据后利用UART0将收到的数据中的一部分发到PC端以校验具体数据传输情况:

    if (status_reg & SYS_STATUS_RXFCG){frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;if (frame_len <= FRAME_LEN_MAX){dwt_readrxdata(rx_buffer, frame_len, 0);uart_putchar(uart0,rx_buffer[2]);uart_putchar(uart0,rx_buffer[3]);}dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);}

在程序中要求发送的信息包如下:

而在PC端接收到的回馈信息如下:

从之前的uart发送函数可以知道,两个模块之间可以正常收发信息包。然而还是存在一点问题。使用官方的例程虽然可以收发信息包,但是在PC端看回馈信息的时候博主有注意到,官方的例程在KEA128上跑得似乎并不稳定,每一组DE都是不等时地回馈回来,而且在接收了54字节的时候更是彻底停下来了orz…
目前先不考虑代码优化的问题,暂且将SPI通信速率下调到8MHz,先把整体框架搭出来。那么,接下来的工作就是将官方提供的Double-sidedTwo-way Ranging例程移植到KEA里,然后逐步进行调试(直接移植过来直接就能用只需要校准一下这种情况是不存在的,毕竟用的是KEA128不是STM32QAQ)。
Double-sidedTwo-way Ranging的测距具体原理及实现算法网上不难找到,熊大已经很好地进行了说明:熊大UWB系列教程三,故在此不再赘述,只记录调试过程。
先将原来的收发测试部分移除,并将DS测距部分的程序全部移植到KEA这边。由于官方例程的DS测距程序也是在调用官方的库函数(带dwt前缀的函数),所以代码基本上是兼容的,不同的地方有两点:一是保留中断状态的函数 decamutexon() 与 decamutexoff(stat)的调用,这里暂时不考虑中断,所以直接移除;二是关于延时函数的问题,官方例程中默认调用STM32的延时函数,而博主在KEA这边直接替换成了滴答定时器延时。
接着根据DS的单次测距流程,逐步检查流程中各步骤的执行情况。规定1:A发送起始poll包 2:B接收到poll包 3:B发送resp包 4:A接收到resp包 5:A发送final包 6:B接收到final包。这里直接使用之前测试双机收发的方式,即在相应的步骤执行完毕后,使用UART将对应的标号回发到PC端。
在设备A端读取到的回馈情况如下:

在设备B端读取到的回馈情况如下:

设备B回馈的标号只有2而没有3,也就是说设备B在接收到设备A发出的poll包后,在校验poll包的时候发现错误或是在发送resp包的过程中出现了问题。设备B收到的数据表明接收方接收到的poll包是正确的,但是却没有成功发送resp包:

//设备A的poll包
static uint8 tx_poll_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x21, 0, 0};
//设备B的校验包
static uint8 rx_poll_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x21, 0, 0};


接下来的测试也验证了博主的推测:

        ret = dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED);        /* If dwt_starttx() returns an error, abandon this ranging exchange and proceed to the next one. See NOTE 11 below. */if (ret == DWT_ERROR){uart_putchar(uart0,'E');continue;}


跟进dwt_starttx() 函数一看,官方在报错的情况处给出了说明:

        else{// I am taking DSHP set to Indicate that the TXDLYS was set too late for the specified DX_TIME.// Remedial Action - (a) cancel delayed sendtemp = (uint8)SYS_CTRL_TRXOFF; // This assumes the bit is in the lowest bytedwt_write8bitoffsetreg(SYS_CTRL_ID, SYS_CTRL_OFFSET, temp);// Note event Delayed TX Time too Late// Could fall through to start a normal send (below) just sending late.....// ... instead return and assume return value of 1 will be used to detect and recover from the issue.pdw1000local->wait4resp = 0;retval = DWT_ERROR ; // Failed !}

嗯,简单来说就是设备B程序设定的 POLL_RX_TO_RESP_TX_DLY_UUS小了,程序从dwt_setdelayedtrxtime(resp_tx_time); 这一句执行到 ret = dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED); 这一句的时间已经超过了原本设置的延迟发送时间 resp_tx_time 而使得程序报错。把POLL_RX_TO_RESP_TX_DLY_UUS 上调到2800,问题就解决了:

再回接到设备A这边,设备B已经回发了resp包,但设备A并没有成功接收:

A没有成功接收只有两种情况,一是B在A打开接收之前就回发了,二是A的接收超时时间太短。但是,官方例程在A端的例程中设定的A打开接收的延迟时间POLL_TX_TO_RESP_RX_DLY_UUS只有150,而在B端的例程中设定的B接收以后延迟发送的时间POLL_RX_TO_RESP_TX_DLY_UUS 就达到了2600,在这里更是上调到了2800,所以第一种情况是不可能发生的。A端的接收超时时间RESP_RX_TIMEOUT_UUS原值为2700,将其上调到3000,再看B端回馈的数据时,整个过程就通了:

236后面这一段奇怪的东西就是距离了,只不过还没有进行转化而已,另外天线延迟也还需要调整,但就目前来说主体工作算是完成了。在使用官方例程完成DWM1000的校准后就可以进行正常的测距了,后续若有时间将尝试对官方测距代码进行优化。

基于DWM1000的UWB测距调试(二)相关推荐

  1. 基于DWM1000的STM32F103C8T6的三维室内定位(一)

    自小马写了一篇 [基于DWM1000的stm32f103c8测距调试(一)] 之后,有不少的朋友联系我一起学习DWM1000的测距,一起学习进步很大.这次小马打算在尝试一下开源一下基于DWM1000的 ...

  2. 汽车数字钥匙设计03:UWB测距原理

    传统PEPS钥匙及蓝牙钥匙采用场景RSSI来进行定位测距,而UWB是基于时间戳来进行定位测距的. IEEE 802.15-4z-2020标准列出UWB主要有三种定位测距方式:SS-TWR.DS-TWR ...

  3. 基于matlab的dsp调试方法,基于Matlab7.0的DSP调试

    基于Matlab7.0的DSP调试 通过Matlab7.0中的CCSLink与CCS3.3软件连接,实现对DSP程序的调试. CCSLink的主要特点:在MATLAB环境下完成对DSP器件的调试.数据 ...

  4. matlab车辆测距,一种基于单目视觉的车辆测距方法

    一种基于单目视觉的车辆测距方法 [专利说明]一种基于单目视觉的车辆测距方法 所属技术领域 [0001] 本发明属于目标检测与测距领域,尤其涉及一种基于单目视觉的车辆测距方法. [背景技术] [0002 ...

  5. 2维FFT算法实现——基于GPU的基2快速二维傅里叶变换

    2维FFT算法实现--基于GPU的基2快速二维傅里叶变换 上篇讲述了一维FFT的GPU实现(FFT算法实现--基于GPU的基2快速傅里叶变换),后来我又由于需要做了一下二维FFT,大概思路如下. 首先 ...

  6. UWB定位 三基站加一个标签UWB相关资料 dwm1000模块 uwb定位

    UWB定位 三基站加一个标签UWB相关资料 dwm1000模块 uwb定位 ds-twr测距 dw1000模块,双边双向测距,研创物联代码,最多支持4基站8标签测距,基站和标签.信道.速率等配置可通过 ...

  7. 双目立体视觉案例源代码 基于HALCCN的双目立体视觉系统实现 基于openev的双目测距 双目测距-opency 通用化视堂系线板架 Halcon视觉例子程序

    双目立体视觉案例源代码 双目测距 双目摄像头图像获取 标定代码 1.Halcoa 10三椎视党 2.Halcon视觉例子程序 wa2013 3.OpenCV+OpencL.双目立体视觉三幢重建 vs2 ...

  8. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  9. 【运动学】基于matlab脉冲多普勒测距测速【含Matlab源码 1947期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[运动学]基于matlab脉冲多普勒测距测速[含Matlab源码 1947期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  10. UWB测距原理及实现

    1.测距 距离(长度)是最常用的物理量之一,距离的测量是我们日常生活中最常见的,如日常生活工作中的物体的长度尺寸测量,人身高的测量. 长度是一维空间的度量,是点到点的距离.长度的国际单位是" ...

最新文章

  1. solaris 10安装mysql5
  2. C# winform DataGridView 常见属性
  3. ViP解读:视觉MLP结构新作
  4. python数据库连接池使用
  5. 【转】细说.NET 中的多线程 (一 概念)
  6. python lambda 判断_在Python的Filter中使用lambda函数时,为何达不到预期效果?
  7. 安装mariadb---通用二进制格式安装
  8. MyBatis多参数传递之混合方式——MyBatis学习笔记之十五
  9. php+mysql+json android 连接wamp
  10. 如何开发和维能hold住全场的软件
  11. RHEL/Centos下VSFTPD服务器搭建
  12. 河南省谷歌高清卫星地图下载
  13. 常用网线T568A或T568B类型详细讲解
  14. [Linux]history命令用法详解
  15. 艾美捷-临床数量排名前20的药物靶点分析-磷酸二酯酶(PDEs)抗体
  16. 二阶魔方还原 - 4步2公式
  17. 猫眼网历史日票房数据爬取
  18. 人工智能未来十大趋势,22年最新
  19. php html5 cms,建站教程|CMS教程|PHP教程|html5教程 - 站长图库
  20. Copyright 格式

热门文章

  1. 高大上必备!D3.js对产品的贡献度剖析
  2. 移动iptv安装三方软件
  3. kuangbin专题五并查集总结
  4. 此操作要求使用 IIS 集成管线模式
  5. 如何快速的把JSON转Excel怎么转?
  6. htmlCSS面试题
  7. java有关物流管理的简历_Java开发实习生大学生简历模板
  8. KDD数据库知识发现流程
  9. 虽迟但到,手眼标定代码实现篇
  10. C语言题目:输出三角形面积和周长 (15 分)