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