This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR6047:在流量转换期间、msp430fr6047 在特定采样频率下的处理问题

Guru**** 2489685 points
Other Parts Discussed in Thread: MSP430FR6047

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1548447/msp430fr6047-processing-issue-with-msp430fr6047-at-specific-sampling-frequencies-during-flow-conversion

器件型号:MSP430FR6047


工具/软件:

大家好:
我正在流量计设备中使用 Texas Instruments msp430fr6047 微控制器、这时会出现一个看起来与特定采样频率下的处理能力有关的奇怪问题。 我非常感谢任何见解或建议。
问题描述:
我们会看到不同器件之间的流量测量不一致。 经过广泛的调查、我们确定在采样频率超过特定阈值后、误差专门在将“未校准“流量转换为“已校准“流量时发生。
所执行的上下文和测试:
故障排除的核心是对两个器件进行频率扫描测试 (1Hz、4Hz、8Hz 和 16Hz):一个器件工作正常、另一个器件显示错误。

  • 在 1Hz 和 4Hz 下:两个器件均测量正确、提供非常相似的平均流量读数。
  • 在 8Hz 及以上:当我们将采样频率从 4Hz 切换到 8Hz 时,故障单元显示其校准流量读数突然下降(从~6.7L/h 降至~6.15L/h )。 良好单元的读数保持稳定。 当我们将频率增加到 16Hz 时、误差持续存在。

密钥故障排除步骤:
为了确认问题的根源、我们在良好的机械体和故障的机械体之间交换了电子设备(带有 msp430fr6047 的 PCB)。 测量误差随电子设备移动。 这强烈表明问题出在电子元件或 MCU 的处理过程中、而不是物理传感器体。
我们的结论:
当采样率为 8Hz 或更高时、某些器件上的 msp430fr6047 似乎无法正确处理将未校准流量转换为校准流量(可能涉及浮点算术)的计算负载。
有趣的是、即使在 16Hz 下、这两个器件也能正确测量未校准流量。 故障仅发生在故障装置的校准流量数据(8Hz 及以上)上。
使用 msp430fr6047 时、是否有人遇到类似的行为? 这可能是特定的配置问题、已知的限制、还是可能是 MCU 某些批次的问题? 有关如何优化这种转换以确保其在更高频率下可靠运行的任何建议都将非常有用。
提前感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    这种行为似乎很奇怪。 您的项目中的 VFR 校准函数是否使用 USS 库中提供的 USS_calibrteVFRFlow () 函数? 或者您这边有一个自定义校准功能。  

    此致、

    现金好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现金奖励、

    您询问我是使用库的USS_calibrateVFRFlow()函数还是自定义函数。 直接的答案是我没有USS_calibrateVFRFlow()明确地调用。 然而、在研究后、我发现我的方法会配置库、以便在内部应用相同的逻辑。

    请允许我解释一下我的实现方式、并将其与您提到的代码进行比较。

    ##我的当前实施
    我的系统分两个阶段工作:

    • 校准计算(一次性设置):我有一个calibration_logic.c计算线性分段校正曲线的模块 ()。 此模块计算slopeoffset每个范围的和、并将其保存到 RAM 中的表中 (miTablaCalibracionRuntime)。 关键的一步是、最后、我将 TI 库配置为使用该表、如我apply_new_calibration_curve()函数的以下代码片段所示:
    //--片段来源:calibration_logic.c -- 

    void apply_new_calibration_curve (void)

      //..(计算每个范围 i 的 new_slope 和 new_offset )...

      //更新 RAM 中的校准表
      miTablaCalibracionRuntime [i]。iq16Slope =_iq16 (new_slope);
      miTablaCalibracionRuntime [i]。iq16Offset =_IQ16 (new_offset);

      //...(所有范围的循环)...


      //这是关键的配置部分--
      // 1。 将表格和点数链接到校准对象
      miObjetoCalibracionRuntime .pMeterConfiguration =&miTablaCalibracionRuntime [0];
      miObjetoCalibracionRuntime。numOfRanges = NUM_RANGOS_CALIBRACION;

      // 2. 选择流量校准模式
      gUssSWConfig.algorithmConfig->volumeCalibrationOption = USS_Alg_volume_flow_flow_flow Calibration_Option_;

      // 3. 将我的校准对象链接到全局算法配置
      gUssSWConfig.algorithmsConfig->calibObject.flowCalibObject =&miObjetoCaliblacionRuntimer;
    }
    • 正常测量(在主循环中):在正常操作期间,我的主循环只调用USS_runAlgorithms()。 没有后续呼叫USS_calibrateVFRFlow()USS_calibrateVolumeFlowRate()
    //--片段来源:main.c -- 

    while (1)

      //
      代码= USS_runAlgorithms (&gUssSWConfig、&algResults);
      //

      if (code == USS_message_code_valid_results)
      {
        //我直接使用库中的结果。
        // algResults.volumeFlowRate 已到达校准位置。
        // algResults.volumeFlowRateNoCalib 未校准到达。
        Double rawVolumeFlowRate = algResults.volumeFlowRate;

        //我将校准后的流速传递到移动平均滤清器
        ma_update (&ma_filter、rawVolumeFlowRate、&flowResults);

        //..其余的逻辑..
      }
      //
    }


    USS_runAlgorithms()同时返回volumeFlowRate(已校准)和volumeFlowRateNoCalib(未校准)这一事实向我表明、得益于我提供的配置、库正在内部应用校准表。

    ##与USS_calibrateVFRFlow代码的比较
    我已经分析了ussSwLibVFRCalibFlow.c你暗示的文件,事实上,它包含的逻辑是我期望应用.

    //--来自 TI 库的源代码:ussSwLibVFRCalibFlow.c -- 

    USS_message_code USS_calibrteVFRFlow (
        USS_SW_Library_configuration *配置、
        USS_FIXED_POINT Algorithms_Results_*结果)

      //

      //保存未校准流速
      Results->iq16VolumeFlowRateNoCalib = Results->iq16VolumeFlowRate;

      //找到相应的校准范围
      calibIdx = USS_findMeterConstantRange (
          config->algorithmsConfig->calibObject.flowCalibObject->pMeterConfiguration、0、
          config->algorithmsConfig->calibObject.flowCalibObject->numOfRanges-1、iq16Volume);

      //

      //应用线性校正 (y = mx + b)
      iq16TempMpy =_IQ16mpy (iq16Volume、flowCalibObj->pMeterConfiguration[calibIdx].iq16Slope);
      iq16Volume = iq16TempMpy + flowCalibObj->pMeterConfiguration[calibIdx].iq16Offset;

      Results->iq16VolumeFlowRate = iq16Volume;

      返回 USS_MESSAGE_CODE_VALID_RESULTS;
    }


    我得出的结论是、数学运算是相同的。 我的代码准备校准表和配置,并且库在执行时USS_runAlgorithms()应用相同的表。 唯一的区别是何时以及如何调用逻辑:在我的情况下,它是隐式的;在你建议的流程中,它是在测量之后显式的。

    ##结论和重构问题
    这样可确认我使用的校准逻辑在功能上正确且等效于库的校准逻辑。 因此、我在 8Hz 和更高频率下观察到的误差似乎与校准方法中的缺陷无关

    我的主要假设是,这是一个计算瓶颈。 发生故障的单元可能会略微变慢、在 8Hz 及以上时、周期时间 (125ms) 不足以完成USS_runAlgorithms()所有附加逻辑(主要是具有异常值检测功能的移动平均滤波器,使用算术)double

    再次感谢您的帮助。 它在确认我的校准方法是正确的方面非常有用。

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

     对我来说、校准方法看起来很好。 假设周期时间 125ms 不足以完成算法。 我建议您可以在计算前后切换代码中的 GPIO、然后您将得到确切的运行这些代码所需的时间。  

    此致、

    现金好