ExpressLRS开源之基本调试数据含义

这篇具有很好参考价值的文章主要介绍了ExpressLRS开源之基本调试数据含义。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 源由

基于ExpressLRS开源代码对基本调试验证数据进行详细的研读理解,以期望更深入的理解相关数据的实际含义。

ID(packetCounter),Antenna,RSSI(dBm),LQ,SNR,PWR,FHSS,TimingOffset
IRQ_CNT,RSSI_AVE,SNR_AVE,SNV_MAX,TELEM_CNT,FAIL_CNT

2. 代码

2.1 debugRcvrLinkstats

static void debugRcvrLinkstats()
{
#if defined(DEBUG_RCVR_LINKSTATS)
    if (debugRcvrLinkstatsPending)
    {
        debugRcvrLinkstatsPending = false;

        // Copy the data out of the ISR-updating bits ASAP
        // While YOLOing (const void *) away the volatile
        crsfLinkStatistics_t ls = *(crsfLinkStatistics_t *)((const void *)&CRSF::LinkStatistics);
        uint32_t packetCounter = debugRcvrLinkstatsPacketId;
        uint8_t fhss = debugRcvrLinkstatsFhssIdx;
        // actually the previous packet's offset since the update happens in tick, and this will
        // fire right after packet reception (a little before tock)
        int32_t pfd = PfdPrevRawOffset;

        // Use serial instead of DBG() because do not necessarily want all the debug in our logs
        char buf[50];
        snprintf(buf, sizeof(buf), "%u,%u,-%u,%u,%d,%u,%u,%d\r\n",
            packetCounter, ls.active_antenna,
            ls.active_antenna ? ls.uplink_RSSI_2 : ls.uplink_RSSI_1,
            ls.uplink_Link_quality, ls.uplink_SNR,
            ls.uplink_TX_Power, fhss, pfd);
        Serial.write(buf);
    }
#endif
}

2.2 debugRcvrSignalStats

static void debugRcvrSignalStats(uint32_t now)
{
#if defined(DEBUG_RCVR_SIGNAL_STATS)
    static uint32_t lastReport = 0;

    // log column header:  cnt1, rssi1, snr1, snr1_max, telem1, fail1, cnt2, rssi2, snr2, snr2_max, telem2, fail2, or, both
    if(now - lastReport >= 1000 && connectionState == connected)
    {
        for (int i = 0 ; i < (isDualRadio()?2:1) ; i++)
        {
            DBG("%d\t%f\t%f\t%f\t%d\t%d\t",
                Radio.rxSignalStats[i].irq_count,
                (Radio.rxSignalStats[i].irq_count==0) ? 0 : double(Radio.rxSignalStats[i].rssi_sum)/Radio.rxSignalStats[i].irq_count,
                (Radio.rxSignalStats[i].irq_count==0) ? 0 : double(Radio.rxSignalStats[i].snr_sum)/Radio.rxSignalStats[i].irq_count/RADIO_SNR_SCALE,
                float(Radio.rxSignalStats[i].snr_max)/RADIO_SNR_SCALE,
                Radio.rxSignalStats[i].telem_count,
                Radio.rxSignalStats[i].fail_count);

                Radio.rxSignalStats[i].irq_count = 0;
                Radio.rxSignalStats[i].snr_sum = 0;
                Radio.rxSignalStats[i].rssi_sum = 0;
                Radio.rxSignalStats[i].snr_max = INT8_MIN;
                Radio.rxSignalStats[i].telem_count = 0;
                Radio.rxSignalStats[i].fail_count = 0;
        }
        if (isDualRadio())
        {
            DBGLN("%d\t%d", Radio.irq_count_or, Radio.irq_count_both);
        }
        else
        {
            DBGLN("");
        }
        Radio.irq_count_or = 0;
        Radio.irq_count_both = 0;

        lastReport = now;
    }
#endif
}

3. 含义解释

对于debug给出参数含义解释,有助于理解性能测试结果。

ID(packetCounter),Antenna,RSSI(dBm),LQ,SNR,PWR,FHSS,TimingOffset
IRQ_CNT,RSSI_AVE,SNR_AVE,SNV_MAX,TELEM_CNT,FAIL_CNT

3.1 ID(packetCounter),Antenna,RSSI(dBm),LQ,SNR,PWR,FHSS,TimingOffset

  • ID(packetCounter):报文ID(递增,需打开Tx发射端DEBUG_RCVR_LINKSTATS)

报文ID是在发射机发射信号是递增,接收机解析报文是获取ID信息的。

//接收机
OtaUpdateSerializers
 ├──> UnpackChannelDataHybridSwitch8/UnpackChannelDataHybridWide
 │   └──> UnpackChannelDataHybridCommon - ota4->dbg_linkstats.packetNum
 │       └──> debugRcvrLinkstatsPacketId
 │           └──> packetCounter
 └──> UnpackChannelData8ch - ota8->dbg_linkstats.packetNum
     └──> debugRcvrLinkstatsPacketId
         └──> packetCounter

//发射机
OtaUpdateSerializers
 └──> GenerateChannelData8ch/GenerateChannelData12ch
     └──> GenerateChannelData8ch12ch
         └──> <DEBUG_RCVR_LINKSTATS> ota8->dbg_linkstats.packetNum = packetCnt++
  • Antenna:天线编号(0或1)

目前,天线配置方面有以下几种工作模式:

  1. Basic:一根天线
  2. Antenna Diversity:两根天线,其中一根天线接收信号
  3. True Diversity:两根天线,同时接收信号
  4. Gemini:两根天线,同时接收信号,并且工作在两个不同的频点。
    ExpressLRS开源之基本调试数据含义,DIY Drones,开源,ELRS
  • RSSI(dBm):信号强度,单位dBm

分贝毫瓦简写为dBm或dBmW,是一个表示绝对功率的量。

uplink_RSSI_1/uplink_RSSI_2
 └──> rssiDBM
     └──> LastPacketRSSI
         └──> GetLastPacketRSSI/GetLastPacketStats
             └──> readRegister(SX127X_REG_PKT_RSSI_VALUE)/ReadCommand(SX1280_RADIO_GET_PACKETSTATUS)
  • LQ(Link Quality):链路质量

链路接收到数据包与预期数据包的百分比,表示信号中丢包的概率。

uplink_Link_quality
 └──> uplinkLQ
     └──> LQCalc.getLQ()/LQCalcDVDA.getLQ()
  • SNR(Signal-to-noise ratio):信噪比

信号与干扰加噪声比 (Signal to Interference plus Noise Ratio)是指接收到的有用信号的强度与接收到的干扰信号(噪声和干扰)的强度的比值。

uplink_SNR
 └──> LastPacketSNRRaw
     └──> GetLastPacketSNRRaw/GetLastPacketStats
         └──> readRegister(SX127X_REG_PKT_SNR_VALUE)/ReadCommand(SX1280_RADIO_GET_PACKETSTATUS)
  • PWR(Power):功率

发射机工作时的发射功率。

RX::uplink_TX_Power
 └──> RX::UnpackChannelData8ch/UnpackChannelDataHybridWide
     └──> TX::GenerateChannelDataHybridWide/GenerateChannelData8ch12ch
         └──> TX::CurrentPower
             └──> TX::decPower/incPower
                 └──> TX::DynamicPower_Update
                     └──> TX::loop

其对应输出数值与功率之间的对应关系。

uint8_t powerToCrsfPower(PowerLevels_e Power)
{
    // Crossfire's power levels as defined in opentx:radio/src/telemetry/crossfire.cpp
    //static const int32_t power_values[] = { 0, 10, 25, 100, 500, 1000, 2000, 250, 50 };
    switch (Power)
    {
    case PWR_10mW: return 1;
    case PWR_25mW: return 2;
    case PWR_50mW: return 8;
    case PWR_100mW: return 3;
    case PWR_250mW: return 7;
    case PWR_500mW: return 4;
    case PWR_1000mW: return 5;
    case PWR_2000mW: return 6;
    default:
        return 0;
    }
}
  • FHSS(Frequency-hopping spread spectrum):跳频频率

FHSS,跳频技术 (Frequency-Hopping Spread Spectrum)在同步、且同时的情况下,接受两端以特定型式的窄频载波来传送讯号,对于一个非特定的接受器,FHSS所产生的跳动讯号对它而言,也只算是脉冲噪声。FHSS所展开的讯号可依特别设计来规避噪声或One-to-Many的非重复的频道,并且这些跳频讯号必须遵守要求。

debugRcvrLinkstatsFhssIdx
 └──> getRFlinkInfo
     └──> ProcessRFPacket
         └──> RXdoneISR
             └──> setupRadio
                 └──> setup

注:关于跳频方面的设置,详见FHSSrandomiseFHSSsequenceFHSSgetNextFreq

  • TimingOffset

这里的时间差是指HWtimerCallbackTock调用到ProcessRFPacket报文开始处理的时间差。

PfdPrevRawOffset
 └──> PFDloop.calcResult() = PFDloop.intEvent(HWtimerCallbackTock) - PFDloop.extEvent(ProcessRFPacket)
     └──> updatePhaseLock
         └──> HWtimerCallbackTick
             └──> setup

3.2 IRQ_CNT,RSSI_AVE,SNR_AVE,SNV_MAX,TELEM_CNT,FAIL_CNT

  • IRQ_CNT

接收机收到RF芯片中断的数量。

setup
 └──> setupRadio
     └──> RXdoneISR
         └──> ProcessRFPacket
             └──> GetLastPacketStats
                 └──> instance->rxSignalStats[i].irq_count++
  • RSSI_AVE

接收机平均RSSI信号强度。

double(Radio.rxSignalStats[i].rssi_sum)/Radio.rxSignalStats[i].irq_count
  • SNR_AVE

接收机平均SNR信号强度。

double(Radio.rxSignalStats[i].snr_sum)/Radio.rxSignalStats[i].irq_count/RADIO_SNR_SCALE
  • SNV_MAX

接收机最大SNR信号强度。

float(Radio.rxSignalStats[i].snr_max)/RADIO_SNR_SCALE
  • TELEM_CNT

接收机发送报文数量。

setup
 └──> HWtimerCallbackTock
     └──> HandleSendTelemetryResponse
         └──> TXnb
             └──> telem_count++
  • FAIL_CNT

判断双天线是否第二根天线受到同样的报文,如果没有收到则fail++。

setup
 └──> setupRadio
     └──> RXdoneISR
         └──> ProcessRFPacket
             └──> GetLastPacketStats
                 └──> fail_count++

4. 总结

通过对上面调试参数含义的分析,在对单/双天线模块配置下:

可以根据以下表格内容进行可选择性的分析比对,详细比对方法请见:
【1】ExpressLRS开源之RC链路性能测试
【2】ExpressLRS开源之接收机固件编译烧录步骤

ID(packetCounter) Antenna RSSI(dBm) LQ SNR PWR FHSS TimingOffset
报文ID 天线编号 信号强度 信号质量 信噪比 发射功率 跳频频率 中断时延
单、双 单、双 单、双 单、双 单、双 单、双 单、双
IRQ_CNT RSSI_AVE SNR_AVE SNV_MAX TELEM_CNT FAIL_CNT
中断数量 平均信号强度 平均信噪比 最大信噪比 发送报文数量 报文缺失次数
单、双 单、双 单、双 单、双 单、双

,

5. 参考资料

【1】ExpressLRS开源之RC链路性能测试
【2】ExpressLRS开源之接收机固件编译烧录步骤
【3】High-performance Open Source Radio Control Link文章来源地址https://www.toymoban.com/news/detail-685512.html

到了这里,关于ExpressLRS开源之基本调试数据含义的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM DIY 硬件调试

    之前打样的几块 ARM 板,一直放着没去焊接。今天再次看到,决定把它焊起来。 为了提高焊接效率,先使用加热台焊接。不过板子为双面贴片,使用加热台只能焊接一面,那就优先焊主芯片那面,并把 Type C、SD 卡座还有一些关键电阻电容一并焊接。 (不过后来发现这个决定

    2024年02月12日
    浏览(38)
  • ARM DIY(六)音频调试

    今天,调试一下音频 硬件部分核心是 LM4871 音频功放芯片 对于 SOC 来讲很简单,就一个引脚 HPOUTL(单声道);对于扬声器来讲也很简单,就两个引脚,插上就可以了。 另外一个关键点是电容和电阻要焊到位,有没有噪音,音质好坏,全屏电容电阻打下手。 arch/arm/boot/dts/sun

    2024年02月10日
    浏览(39)
  • ARM DIY(四)WiFi 调试

    换个粗点的风枪嘴,让热风覆盖 RTL8823BS 整体模块,最终实现自动归位 焊接 SDIO 接口的上拉电阻以及复位引脚上拉电阻 硬件部分就这么多比较简单,接下来是软件部分 搜索 RTL8723BS RTL8723BS 默认关闭,不过要使能该驱动之前,需要先使能 WLAN 和 CFG80211 搜索 WLAN 使能 WLAN 搜索

    2024年02月11日
    浏览(37)
  • ARM DIY(七)麦克风调试

    上篇文章介绍了扬声器调试,今天介绍下麦克风调试。 焊接:咪头、电阻、电容 音频调试时已完成,参考上篇文章 使能 mic1 录音 10s -f 是设置录音质量, -f cd 表示录音质量为 cd 级别。-d 是指定录音时间,单位是 s,这条指令就是录制一段 cd 级别 10s 的 wav 音频,音频名字为

    2024年02月10日
    浏览(43)
  • ARM Linux DIY(六)音频调试

    今天,调试一下音频 硬件部分核心是 LM4871 音频功放芯片 对于 SOC 来讲很简单,就一个引脚 HPOUTL(单声道);对于扬声器来讲也很简单,就两个引脚,插上就可以了。 另外一个关键点是电容和电阻要焊到位,有没有噪音,音质好坏,全屏电容电阻打下手。 arch/arm/boot/dts/sun

    2024年02月03日
    浏览(36)
  • ARM Linux DIY(四)WiFi 调试

    换个粗点的风枪嘴,让热风覆盖 RTL8823BS 整体模块,最终实现自动归位 焊接 SDIO 接口的上拉电阻以及复位引脚上拉电阻 硬件部分就这么多比较简单,接下来是软件部分 搜索 RTL8723BS RTL8723BS 默认关闭,不过要使能该驱动之前,需要先使能 WLAN 和 CFG80211 搜索 WLAN 使能 WLAN 搜索

    2024年02月07日
    浏览(35)
  • ARM Linux DIY(八)USB 调试

    V3s 带有一个 USB 接口,将其设置为 HOST 或 OTG 模式,这样可以用来接入键盘、鼠标等 USB 外设。 USB 有两种设备:HOST 和 USB 功能设备。 在 USB2.0 中又引入了一个新的概念 OTG,即设备角色可以动态切换。 切换方式一:硬件 使用 USB_ID 引脚,默认上拉,处于 device 状态。 如果需要

    2024年02月20日
    浏览(31)
  • ARM Linux DIY(五)摄像头调试

    今天,就着摄像头的调试,从嵌入式工程师的角度,介绍如何从无到有,一步一步地调出一款设备。 摄像头型号:OV2640 分为 2 个阶段 5 个步骤 阶段一: 设备树、驱动、硬件 阶段二: 应用程序、测试 a) 摄像头用到了 I2C 和 CSI 接口,所以要在 pinctrl 节点中添加这两种接口的

    2024年03月16日
    浏览(35)
  • ARM DIY(一)电源、SD卡座、SOC 调试

    之前打样的几块 ARM 板,一直放着没去焊接。今天再次看到,决定把它焊起来。 为了提高焊接效率,先使用加热台焊接。不过板子为双面贴片,使用加热台只能焊接一面,那就优先焊主芯片那面,并把 Type C、SD 卡座还有一些关键电阻电容一并焊接。 (不过后来发现这个决定

    2024年02月10日
    浏览(39)
  • ARM DIY(三)板载串口和 LCD 调试

    今天焊接两大关键输入输出设备:串口和屏幕。 串口部分使用 CP2102N 芯片(USB 转 TTL),这样用一根数据线连接板子和 PC 就可以直接调试了。 焊接 CP2102 和 Type C 上电调试,串口可以正常输入输出。 看来,虽然是 QFN 封装,只要尺寸大一点,还是很容易焊接成功的。 重头戏在

    2024年02月11日
    浏览(113)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包