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 設置的時間太短,都可能導致無法收到信息而報錯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM