【NXP FRDM-MCXW72蓝牙信道探测】历尽千辛万苦,终于跑通ChannelSounding(中文资料首例)
https://forum.eepw.com.cn/thread/401940/1
接上篇,调通了FRDM-MCXW72蓝牙信道探测,就想着做个项目。
手头刚好有一块TAB5可以做终端显示和控制,这样就可以脱离电脑,测试信道探测成功了。
首先是对官方例程的改造,使得终端显示测距结果 + 蓝牙信号强度。
在frdmmcxw72_loc_reader_bm项目中,对loc_rader.c中的BleApp_PrintRADEResults函数加以改造
首先去除多余提示信息,仅显示距离值,
其次,增加RSSI信号强度显示,并且通过换算,将dBm转换为%,这样显示信号强度更直观
static bool_t BleApp_PrintRADEResults
(
deviceId_t deviceId,
localizationAlgoResult_t *pResult
)
{
bool_t bUIUpdated = FALSE;
if ((pResult->algorithm & eMciqAlgoEmbedRADE) != 0U)
{
int8_t rssiRemoteAverage = (int8_t)gRssiNotAvailable_c;
if (pResult->rssiInfo.rssiRemoteNo != 0U)
{
int16_t rssiSum = 0;
uint8_t rssiValid = 0U;
for (uint8_t idx = 0U; idx < pResult->rssiInfo.rssiRemoteNo; idx++)
{
if ((idx < gCsMaxStepsPerProcedure_c) &&
(pResult->rssiInfo.aRssiRemote[idx] != (int8_t)gRssiNotAvailable_c))
{
rssiSum += (int16_t)pResult->rssiInfo.aRssiRemote[idx];
rssiValid++;
}
}
if (rssiValid != 0U)
{
rssiRemoteAverage = (int8_t)(rssiSum / (int16_t)rssiValid);
}
}
if (pResult->radeError != 0U)
{
shell_write("] RADE Error: ");
shell_writeDec(pResult->radeError);
shell_write("!\r\n");
}
else if (pResult->resultRADE.dqiIntegerPart == 0U)
{
shell_write("] Low Quality data for RADE! Quality indicator is 0! \n\r");
}
else if (pResult->resultRADE.distanceIntegerPart > gMaxDistanceMeters_c)
{
shell_write("] Outlier RADE distance result - discarded. Check gMaxDistanceMeters_c value. \n\r");
}
else
{
/* 测距显示*/
shell_writeDec(pResult->resultRADE.distanceIntegerPart);
shell_write(".");
for (uint8_t i = 0U; i < pResult->resultRADE.leadingZeroesDecimalPart; i++)
{
shell_write("0");
}
shell_writeDec(pResult->resultRADE.distanceDecimalPart);
shell_write(" m ");
if(rssiRemoteAverage != (int8_t)gRssiNotAvailable_c)
{
uint8_t rssiPercent;
// 计算信号百分比
if (rssiRemoteAverage <= -100)
{
rssiPercent = 0;
}
else
{
rssiPercent = ( (int32_t)(rssiRemoteAverage + 100) * 72 ) / 44;
if(rssiPercent > 100)
{
rssiPercent = 100;
}
}
shell_writeDec(rssiPercent);
shell_write("%%");
}
else
{
shell_write("N/A");
}
shell_write("\r\n");
/* Flash LEDs if distance is less than 1m. */
if ((mPreviousDistance <= (float)1) && (pResult->resultRADE.distanceInMeters <= (float)1))
{
LedStartFlashingAllLeds();
bUIUpdated = TRUE;
}
else if ((mPreviousDistance > (float)1) && (pResult->resultRADE.distanceInMeters > (float)1))
{
LedStopFlashingAllLeds();
Led1On();
bUIUpdated = TRUE;
}
else
{
/* MISRA */
}
mPreviousDistance = pResult->resultRADE.distanceInMeters;
}
}
return bUIUpdated;
}Rader运行结果如下:

为了能连续测量,还需要输入loop指令,并输入tdm指令开启测距。
(loop tdm等shell指令都是例程中已预设好,可以直接利用的)
为了能脱离电脑实现测距并显示,我利用TAB5做为测距终端显示和控制设备。

硬件连接方面,5V-GND接上,TAB5的G38 RXD0 G37 TXD0分别与FRDM-MCXW72的J4-2(发送)、J4-1(接收)连接。

TAB5的界面和程序,使用非常简洁易用的uiflow2来实现。
左侧是画面设计,就一个简单的label0
右侧是图形化程序设计,在setup里对串口进行端口设置、初始化——》分别发送sb、loop、tdm指令开启循环测距。
在loop里将串口收到的内容显示在label0中。

运行结果如下:

视频效果如下,最远测试到5米,效果非常明显。
我要赚赏金
