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


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

     正文:

    这一篇内容主要是通过官方源码理解SS-TWR 细节

    代码下载链接:https://download.csdn.net/download/duanfei255/10787882

    所有代码使用方法:复制example 中的main.c到Keil MDK工程目录,即可编译出不同的工程

    使用开发环境:Keil MDK 

    对应与SS-TWR工程一共有两个文件夹,分别是ex_06a_ss_twr_init 和 ex_05b_ds_twr_resp。 其中ex_06a_ss_twr_init 对应于上一节原理分析中的DeciveA 而 ex_05b_ds_twr_resp 对应于DeviceB

    分别编译下载到两个模块即可通过液晶查看二者直接的距离。

    这里留空,认为所有人都使用过Keil - MDK

    下面分析代码:

    DWM1000 代码所有都遵循如下原则初始化 +  任务循环(例如测距)

    下面摘录ex_06a_ss_twr_init 初始化代码(基本所有DWM1000 工程的初始化代码都是一样的在SS-TWR中会调用一些API,占到常用API 90%

     1 int main(void)
     2 {
     3     /* Start with board specific hardware init. */
     4     peripherals_init();
     5 
     6     /* Display application name on LCD. */
     7     lcd_display_str(APP_NAME);
     8 
     9     /* Reset and initialise DW1000.
    10      * For initialisation, DW1000 clocks must be temporarily set to crystal speed. After initialisation SPI rate can be increased for optimum
    11      * performance. */
    12     reset_DW1000(); /* Target specific drive of RSTn line into DW1000 low for a period. */
    13     spi_set_rate_low();
    14     dwt_initialise(DWT_LOADUCODE);
    15     spi_set_rate_high();
    16 
    17     /* Configure DW1000. See NOTE 6 below. */
    18     dwt_configure(&config);
    19 
    20     /* Apply default antenna delay value. See NOTE 2 below. */
    21     dwt_setrxantennadelay(RX_ANT_DLY);
    22     dwt_settxantennadelay(TX_ANT_DLY);
    23 
    24     /* Set expected response's delay and timeout. See NOTE 1 and 5 below.
    25      * As this example only handles one incoming frame with always the same delay and timeout, those values can be set here once for all. */
    26     dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);
    27     dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);

    上面初始化分为两部分,一部分是STM32 相关的初始化,例如设定IO SPI OLED等等

    1 /* Start with board specific hardware init. */
    2  peripherals_init();
    3 
    4 /* Display application name on LCD. */
    5 lcd_display_str(APP_NAME);
    6  
    7 spi_set_rate_low();
    8 spi_set_rate_high();

    这里一般不需要更改,除非针对不同的板子IO 发生变化或者更改液晶驱动。 关于SPI 速率设定,由于DWM1000初始化之前SPI 不能全速运行,所以开始的时候需要低速SPI,而待DWM1000 初始化完,可以全速运行了。

     1 reset_DW1000(); /* Target specific drive of RSTn line into DW1000 low for a period. */   
     2 dwt_initialise(DWT_LOADUCODE);
     3 /* Configure DW1000. See NOTE 6 below. */
     4 dwt_configure(&config);
     5 
     6 /* Apply default antenna delay value. See NOTE 2 below. */
     7 dwt_setrxantennadelay(RX_ANT_DLY);
     8 dwt_settxantennadelay(TX_ANT_DLY);
     9 
    10 /* Set expected response's delay and timeout. See NOTE 1 and 5 below.
    11 /* As this example only handles one incoming frame with always the same delay and timeout, those values can be set here once for all. */
    12 dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);
    13 dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);

    前面三个函数进行DWM1000 初始化,通常情况下无需修改

    note:所有以dwt_ 开头的函数均为DWM1000 官方标准API。

    后面四个标准API 比较重要,设定不好距离测试不准是小,很可能无法测距。

    先说前两个 setrxantennadelay/settxantennadelay 从字面意思就可以理解,这个是设定天线延时的。 在原理分析过程中明确到,DWM1000 可以精确知道无线信号何时到达,而无线信号通过天线接收,然后送给DWM1000模块,天线收到信号到送给DWM1000 这个是花费时间的,同样,当发送的时候也是,DWM1000 只知道自己将数据送出去,送给天线的时间,而天线收到信号到发射到空中也是需要时间的。 前者称为rxantennadelay 后者称为txantennadelay。而这两个值通常较大,而且基本认为是一样的。

    后面会有一节专门分析antennadelay 以及 软件设定技巧以及相关校准(calibration)

    在一次SS-TWR测距中,有两条无线消息,所有需要

    接着上一节原理 Tround - Treplay  - DeciveA txantennadelay  -  DeciveB rxantennadelay  - DeciveB txantennadelay  -  DeciveA rxantennadelay 才是无线信号真正在空中传输时间。

    后面两个是控制射频接收开启时间以及timeout的。 当DWM1000 发送一条信息后,如果明确知道收到信息的其它模块会回复一条信息,那么就需要在发送后打开接收器。当然可以选择立即打开接收器,但是根据实验数据大概估计会回复数据的时刻,可以延时一段时间在打开接收器,这个延时设定就setrxaftertxdelay。 接上面,打开接收器就在等数据,如果等不到就过段时间自动关闭接收器,不能一直无限期等下去啊,这个时间段就是setrxtimeout设定的。

    实验过程有时忘记加setrxaftertxdelay 或者timeout 设置的时间太短,都可能导致无法收到信息而报错。

  • 相关阅读:
    [React Native] Target both iPhone and iPad with React Native
    [Angular] Increasing Performance by using Pipe
    [Angular] Angular CDK Intro
    [React] Refactor componentWillReceiveProps() to getDerivedStateFromProps() in React 16.3
    [Python] Create a minimal website in Python using the Flask Microframework
    [GraphQL] Apollo React Mutation Component
    [Angular] Introduce to NGXS
    《火球——UML大战需求分析》(第2章 耗尽脑汁的需求分析工作)——2.4 UML助力需求分析
    《火球——UML大战需求分析》(第2章 耗尽脑汁的需求分析工作)——2.5 小结与练习
    [Django实战] 第4篇
  • 原文地址:https://www.cnblogs.com/tuzhuke/p/9967608.html
Copyright © 2020-2023  润新知