UWB DWM1000 開源項目框架 之 信號強度指示RSSI


在之前博文開源一套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


免責聲明!

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



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