DWM1000 測距原理簡單分析 之 SS-TWR代碼分析1 -- [藍點無限]

 藍點DWM1000 模塊已經打樣測試完畢,有興趣的能夠申請購買了,更多信息參見 藍點論壇 app

 正文:函數

這一篇內容主要是經過官方源碼理解SS-TWR 細節測試

 

代碼下載連接:https://download.csdn.net/download/duanfei255/10787882this

全部代碼使用方法:複製example 中的main.c到Keil MDK工程目錄,便可編譯出不一樣的工程spa

 

使用開發環境:Keil MDK .net

對應與SS-TWR工程一共有兩個文件夾,分別是ex_06a_ss_twr_init 和 ex_05b_ds_twr_resp。 其中ex_06a_ss_twr_init 對應於上一節原理分析中的DeciveA 而 ex_05b_ds_twr_resp 對應於DeviceBcode

分別編譯下載到兩個模塊便可經過液晶查看兩者直接的距離。orm

 

這裏留空,認爲全部人都使用過Keil - MDKblog

 

下面分析代碼:ip

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 設置的時間過短,均可能致使沒法收到信息而報錯。

相關文章
相關標籤/搜索