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.

[参考译文] MSP430F5529:有关 MSP430F5529微控制器上 IQmath 库行为的问题

Guru**** 2589275 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1023128/msp430f5529-question-about-behaviors-of-iqmath-library-on-msp430f5529-microcontroller

器件型号:MSP430F5529

大家好、  

我目前正在开发一个 MSP430F5529芯片上的应用、以实现 Steinhart-Hart 方程、从而根据热敏电阻的电阻读数计算温度。 由于该项目处于开发阶段的早期、我将使用预定义电阻值及其对应温度的查找表来测试 Steinhart-Hart 方程的精度、而不是使用 ADC 将处理器直接连接到热敏电阻。

我知道 MSP 系列不支持浮点算术(或不支持我希望的空间/时间要求、无论如何)、因此我决定改用 Qmath 和 IQmath 库来实现定点方案。 但是、即使在阅读了库中的指南之后、我也会遇到一些问题、无法使内容正常工作。 当我调试应用程序时、我使用 _IQtoF 函数将 IQ 值转换为浮点值、以便它出现在我的变量框中。 在首次使用此函数时、我获得了一个非常精确的计算、并使用计算器进行了双倍检查。 但是、在第二次使用此函数时、该值会略有变化、并抛出以下所有计算。 例如:

_iq ln_r_therm = _IQlog(r_therm); // r_therm = 49670
test = _IQtoF(ln_r_therm);        // this would return 10.8131409

_iq shhe_equation_part_2 = _IQmpy(shhe_coeff_b, ln_r_therm); // shhe_coeff_b = 0.234283447
test = _IQtoF(shhe_equation_part_2); // should return ~2.5333, but instead returns 2.6448

_iq ln_r_therm_cubed = _IQpow(ln_r_therm, 3);  
test = _IQtoF(ln_r_therm_cubed); // should return ~1264.3052, but instead returns 1438.7345

然后、我意识 到在我的后续计算中、r_them 使用的值为11.2891235、而不是最初计算的10.81。 即使是~0.4的微小变化也会导致雪球后续计算中出现误差。

我的问题是、导致这种行为的原因是什么、如果这是预期的、我会错过什么? 我如何纠正这种不精确的情况? 我是否应该对 Steinhart-Hart 等式采取不同的方法?

提前感谢大家的帮助!

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

    您是否使用 global_IQ 设置了合理的格式?

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

    如果删除"test =_IQtoF (ln_r_therm")、您能否检查是否有任何变化?

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

    尊敬的 David:

    感谢您的回复、抱歉我的回复很晚。

    从数据表中、我选择的 global_IQ 值为15、因为 它具有我要定位的 r_therm 值的范围、这恰好是我在计算中迄今为止观察到的最大数。 由于我还在缩放 SHHE 系数值、因此我认为该  global_IQ 值也具有足够的精度。  

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

    您好、伊斯天、  

    感谢您的回复、很抱歉我的回复很晚。  

    删除  test =_IQtoF (ln_r_therm);代码的一部分确实会导致后续计算返回预期值、但我想知道 _IQtoF ()函数会导致此精度问题的开始吗?  

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

    尊敬的 Denis:

    很抱歉,我不知道。 我也无法看到 _IQtoF 的源代码。

    伊斯天

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

    您实际上不需要源代码。 从库中提取函数(_IQNtoF.o)、然后将其反汇编。 我看到测试和各种位操作、但没有什么会产生副作用。 在任何情况下、它都不应对 ln_r_therm 执行任何操作、因为 C 是按值传递的。

    我怀疑在所示代码片段之外的某个位置出现了问题。

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

    我会继续调查。 非常感谢您的帮助!  

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

    我想您可以调试代码并在汇编视图中看到它们。 然后、您可以逐步运行代码、以了解导致此问题的代码。

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

    您好、伊斯天、  

    我一段时间内没有查看汇编代码、因此我没有查看汇编视图。 感谢您的建议!

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

    希望您能找到根本原因。