UWB DWM1000 开源项目框架 之 信号强度指示RSSI

时间:2024-04-15 13:04:29

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