【问题标题】:MSP 430 wrong values being displayedMSP 430 显示错误值
【发布时间】:2009-02-26 19:23:08
【问题描述】:

我正在开发压力测量装置。我使用过 MSP430F133 芯片并使用 IAR 嵌入式工作台。它以 3 个不同的单位显示压力。

我正在采集 32 个样本并取平均值。 P5上的单位选择,根据选择的单位计算输出值并显示在LCD上。

现在“IN WC”单元显示输入的二进制平均值,仅用于分析。

问题:默认单位(MM WC)值显示正确,但在测试情况下,当压力释放时,它会下降并且 LCD 显示如下

+31.8
+31.7
+31.6
+31.5
+31.4
+31.3
+31.2
+31.2
+31.1
+31.5 (wrong reading randomly between *.4 to *.7)
+30.9

您可能会显示一个错误的值,我无法找出原因。

【问题讨论】:

  • 您需要隔离问题。首先将原始 ADC 值发送到显示器,然后使用 excel 之类的东西进行转换并检查值。如果显示屏上有空间,则输出 adc 和计算值。您使用的任何常量或变量也会输出。
  • 源不再可用。

标签: c embedded msp430


【解决方案1】:

在下面的代码中 ptiveValue = value 和 d1 = value 所以 d2 总是 0 然后在你的循环中你有 对于 (i=0; i

错误代码:

if (cntd <= 4)
{
    d2 = (unsigned int) abs((ptiveValue - d1) * 10000); // get 4 digits of real part
    itoa1(d2, res, &cntreal);  
    for (i=0; i<= 3||res[i]!='\0'; i++)
    {
       wr_lcd_dr(res[i]);

    }
 }

固定代码

if (cntd <= 4)
{   
    // get 4 digits of real part
    d2 = (unsigned int) ((ptiveValue - (unsigned int)(d1)) * 10000); 
    itoa1(d2, res, &cntreal);  
    for (i=0; (i<= 3) && (res[i]!='\0'); i++)
    {
       wr_lcd_dr(res[i]);     
    }
 }

您还覆盖了缓冲区,并可能产生奇怪的行为。

unsigned short Adcinb[32];
for (i = 0; i <= 63; i++)
Adcinb[i] = 3180;

应该是

unsigned short Adcinb[32];
for (i = 0; i < 32; i++)
Adcinb[i] = 3180;

【讨论】:

  • 他正在覆盖其他内存,这可能会或可能不会给出这个结果,但它只在程序开始时发生一次。肯定需要修复的东西,但可能不是问题的根源......
  • 由于 MSP430 没有用于知道变量的内存的堆栈或堆,因此他正在破坏。但我同意可能不是问题的根源。
  • MSP430 的某些变体确实有缓冲区/堆栈。
  • 我知道,但不是大多数人在使用堆栈时想到的典型堆栈,它共享内存空间,因此破坏堆栈或其他内存变量很容易与缓冲区溢出有关。跨度>
  • 我尝试使用 Rex Logan 的固定代码。但同样的问题...我检查了 ADC 的模拟输入,其范围没有显示任何尖峰或任何东西
【解决方案2】:

不幸的是,源代码的两个链接都不再有效。 但据我所知,原因可能是这个地方预期的“正确”最后一个数字是零。 我的猜测是在计算或可视化代码的某个地方,这个零被错误地视为停止条件,并导致在其位置显示一个随机数字。 (仅向输出提供“31”,但向显示器发送 3 位数字)

上面的 '||'/'&&' 问题表明代码不是很直接,如果其余部分也是如此,则此处的错误停止条件和此处的固定长度循环可能会导致此问题。

只是一个“疯狂的猜测”(TM),但我可以在不知道实际代码的情况下给出最好的结果。

【讨论】:

    【解决方案3】:

    这看起来很可疑,||应该是 &&:

            for (i=0; i<= 3||res[i]!='\0'; i++)
    

    但我不明白它是如何导致您的问题的。

    此外,您应该清理和简化您的代码。因为它很难阅读。

    【讨论】:

      【解决方案4】:

      我将继续建议您可以尝试的一种 ADC 101 解决方案。根据您使用的传感器类型,您可能需要执行自己的去弹跳以清理样本读数。我过去参考过这篇文章,发现它对学习这项技术很有帮助:A Guide to De-bouncing by Jack G. Ganssle

      就像我之前所说的,虽然这是假设您的硬件需要去弹跳,但该指南应该可以帮助您识别这一点。即使您不需要它,您也可能会觉得它很有趣!

      附加:您知道我建议这样做的原因是您提到在释放压力时出现了奇怪的读数。在基于机械的开关和传感器的驱动过程中,采样中的去抖动误差很明显。

      【讨论】:

        【解决方案5】:

        查看您的代码,我看不出有任何特殊原因会获得该值,除非它反映了所感知的实际值。

        您能否运行程序并在对有问题的数字、之前的数字和之后的数字进行平均之前输出 32 个值中的每一个?

        或者,每次获得样本时写下新样本并将数据提供给我们。

        -亚当

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-19
          • 2019-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多