基于DWM1000的UWB测距调试(二)
下面開始測距程序的移植。因為官方提供的ds_twr測距程序是分A、B設(shè)備的,所以這就意味著接下來需要同時調(diào)試兩份程序,雙倍的快樂QAQ
首先測試雙方能否順利收發(fā)。
在此之前需要重新對SPI的波特率進(jìn)行配置,KEA128的SPI通道最大波特率為總線時鐘二分頻,這里取12MHz。
對于設(shè)備A(發(fā)送方):
之后直到while循環(huán)為止的這一部分除了第一句dwt_configure(&config); 是必須的外,其余的都用于雙向測距,而當(dāng)前僅測試兩個DWM1000模塊間能否正常收發(fā)信息包,故直接注釋。
/* 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循環(huán)體內(nèi)直接移植官方提供的Simple TX例程,同理對于設(shè)備B(接收方)也直接移植Simple RX例程,唯一多出來的就是接收完一幀數(shù)據(jù)后利用UART0將收到的數(shù)據(jù)中的一部分發(fā)到PC端以校驗具體數(shù)據(jù)傳輸情況:
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);}在程序中要求發(fā)送的信息包如下:
而在PC端接收到的回饋信息如下:
從之前的uart發(fā)送函數(shù)可以知道,兩個模塊之間可以正常收發(fā)信息包。然而還是存在一點問題。使用官方的例程雖然可以收發(fā)信息包,但是在PC端看回饋信息的時候博主有注意到,官方的例程在KEA128上跑得似乎并不穩(wěn)定,每一組DE都是不等時地回饋回來,而且在接收了54字節(jié)的時候更是徹底停下來了orz…
目前先不考慮代碼優(yōu)化的問題,暫且將SPI通信速率下調(diào)到8MHz,先把整體框架搭出來。那么,接下來的工作就是將官方提供的Double-sidedTwo-way Ranging例程移植到KEA里,然后逐步進(jìn)行調(diào)試(直接移植過來直接就能用只需要校準(zhǔn)一下這種情況是不存在的,畢竟用的是KEA128不是STM32QAQ)。
Double-sidedTwo-way Ranging的測距具體原理及實現(xiàn)算法網(wǎng)上不難找到,熊大已經(jīng)很好地進(jìn)行了說明:熊大UWB系列教程三,故在此不再贅述,只記錄調(diào)試過程。
先將原來的收發(fā)測試部分移除,并將DS測距部分的程序全部移植到KEA這邊。由于官方例程的DS測距程序也是在調(diào)用官方的庫函數(shù)(帶dwt前綴的函數(shù)),所以代碼基本上是兼容的,不同的地方有兩點:一是保留中斷狀態(tài)的函數(shù) decamutexon() 與 decamutexoff(stat)的調(diào)用,這里暫時不考慮中斷,所以直接移除;二是關(guān)于延時函數(shù)的問題,官方例程中默認(rèn)調(diào)用STM32的延時函數(shù),而博主在KEA這邊直接替換成了滴答定時器延時。
接著根據(jù)DS的單次測距流程,逐步檢查流程中各步驟的執(zhí)行情況。規(guī)定1:A發(fā)送起始poll包 2:B接收到poll包 3:B發(fā)送resp包 4:A接收到resp包 5:A發(fā)送final包 6:B接收到final包。這里直接使用之前測試雙機收發(fā)的方式,即在相應(yīng)的步驟執(zhí)行完畢后,使用UART將對應(yīng)的標(biāo)號回發(fā)到PC端。
在設(shè)備A端讀取到的回饋情況如下:
在設(shè)備B端讀取到的回饋情況如下:
設(shè)備B回饋的標(biāo)號只有2而沒有3,也就是說設(shè)備B在接收到設(shè)備A發(fā)出的poll包后,在校驗poll包的時候發(fā)現(xiàn)錯誤或是在發(fā)送resp包的過程中出現(xiàn)了問題。設(shè)備B收到的數(shù)據(jù)表明接收方接收到的poll包是正確的,但是卻沒有成功發(fā)送resp包:
接下來的測試也驗證了博主的推測:
跟進(jìn)dwt_starttx() 函數(shù)一看,官方在報錯的情況處給出了說明:
嗯,簡單來說就是設(shè)備B程序設(shè)定的 POLL_RX_TO_RESP_TX_DLY_UUS小了,程序從dwt_setdelayedtrxtime(resp_tx_time); 這一句執(zhí)行到 ret = dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED); 這一句的時間已經(jīng)超過了原本設(shè)置的延遲發(fā)送時間 resp_tx_time 而使得程序報錯。把POLL_RX_TO_RESP_TX_DLY_UUS 上調(diào)到2800,問題就解決了:
再回接到設(shè)備A這邊,設(shè)備B已經(jīng)回發(fā)了resp包,但設(shè)備A并沒有成功接收:
A沒有成功接收只有兩種情況,一是B在A打開接收之前就回發(fā)了,二是A的接收超時時間太短。但是,官方例程在A端的例程中設(shè)定的A打開接收的延遲時間POLL_TX_TO_RESP_RX_DLY_UUS只有150,而在B端的例程中設(shè)定的B接收以后延遲發(fā)送的時間POLL_RX_TO_RESP_TX_DLY_UUS 就達(dá)到了2600,在這里更是上調(diào)到了2800,所以第一種情況是不可能發(fā)生的。A端的接收超時時間RESP_RX_TIMEOUT_UUS原值為2700,將其上調(diào)到3000,再看B端回饋的數(shù)據(jù)時,整個過程就通了:
236后面這一段奇怪的東西就是距離了,只不過還沒有進(jìn)行轉(zhuǎn)化而已,另外天線延遲也還需要調(diào)整,但就目前來說主體工作算是完成了。在使用官方例程完成DWM1000的校準(zhǔn)后就可以進(jìn)行正常的測距了,后續(xù)若有時間將嘗試對官方測距代碼進(jìn)行優(yōu)化。
總結(jié)
以上是生活随笔為你收集整理的基于DWM1000的UWB测距调试(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用pgd和fgsm方法进行攻击并使用m
- 下一篇: labview小波包分解