zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)
    利用trie树实现前缀输入提示及trie的python实现
    利用python实现简单词频统计、构建词云
    Xss-challenge-tour(1-10)
    CTFHub-SQL注入 思路
    Bugku-web40
    Buuctf-web-[极客大挑战 2019]HardSQL
    命令执行及代码执行漏洞
    CTFHub-RCE 思路&AWCTF部分web题
    upload-labs 11-12 00截断
  • 原文地址:https://www.cnblogs.com/tuzhuke/p/12169538.html
Copyright © 2011-2022 走看看