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