在之前博文開源一套uwb 框架,后面幾篇博文會基於這個開源框架進行簡單開發。 讓uwb使用者更清楚了解基於這個basecode 開發工作。
信號強度指示RSSI,在zigbee中可以用來實現定位,雖然在UWB不需要RSSI來定位,但是可以通過這個指標判斷信號的質量。
常用引用場景:
多基站定位中根據RSSI 強度來選擇最優基站,尤其在TDOA應用中
優化射頻設計。
目前正在做TDOA和長距離模塊,所以暫時只考慮這兩個場景。對於射頻優化,例如在選擇天線的時候,相同距離下,RSSI值越小,說明改天線性能越好,同理,可調節其它參數。
官方文檔說明在user_manual 4.7 節,具體內容參考user_manual說明
所有開發都是基於之前basecode 開發,開發耗時約2h。 RSSI關鍵代碼(參考某開源代碼實現):
static float calculatePower(float base, float N, uint8_t pulseFrequency) { float A, corrFac; if(DWT_PRF_16M == pulseFrequency) { A = 115.72; corrFac = 2.3334; } else { A = 121.74; corrFac = 1.1667; } float estFpPwr = 10.0 * log10(base / (N * N)) - A; if(estFpPwr <= -88) { return estFpPwr; } else { // approximation of Fig. 22 in user manual for dbm correction estFpPwr += (estFpPwr + 88) * corrFac; } return estFpPwr; } float dwGetReceivePower(void) { dwt_rxdiag_t *diagnostics; dwt_readdiagnostics(diagnostics); float C = (&diagnostics->stdNoise)[3]; float N = diagnostics->rxPreamCount; float twoPower17 = 131072.0; return calculatePower(C * twoPower17, N, config.prf); }
在rx_main ,接收回調函數中,調用dwGetReceivePower計算RSSI值。將之前其它多余代碼去掉,回調代碼如下
同時加了freq_count,來簡單測試丟包情況
if (status_reg & SYS_STATUS_RXFCG)//good message { /* A frame has been received, copy it to our local buffer. */ 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); msg_f = (srd_msg_dsss*)rx_buffer; //copy source address as dest address msg_f_send.destAddr[0] = msg_f->sourceAddr[0]; msg_f_send.destAddr[1] = msg_f->sourceAddr[1]; //copy source seqNum msg_f_send.seqNum = msg_f->seqNum; switch(msg_f->messageData[0]) { case 'D'://distance led_on(LED_ALL); uwb_rssi = dwGetReceivePower(); freq_count++; break; default: break; } } //enable recive again dwt_enableframefilter(DWT_FF_DATA_EN); dwt_setrxtimeout(0); dwt_rxenable(0);
rx main函數中,使用定時器4來周期性顯示rssi 和 freq_count
while (1) { if(time4_overflow == 1) { time4_overflow = 0; sprintf(lcd_char,"RSSI:%2.2f, %d ",uwb_rssi,freq_count); freq_count = 0; OLED_ShowString(0,4,lcd_char);
tx main無需修改,編譯rx 和 tx 兩個hex(注意短地址區別,具體參考basecode說明),分別下載到兩個模塊測試
本文完,basecode開源地址:51uwb.cn