显示MSP 430错误值

时间:2009-02-26 19:23:09

标签: c embedded msp430

我正在开发压力测量装置。我使用过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

正如你可以看到的那样,显示了一个错误的值,我无法弄清楚原因。

5 个答案:

答案 0 :(得分:4)

在下面的代码中ptiveValue = value和d1 = value所以d2总是0然后在你的循环中你有     for(i = 0; i< = 3 || res [i]!='\ 0'; i ++) 应该是     for(i = 0; i< = 3&& res [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;

答案 1 :(得分:2)

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

'||'/'&amp;&amp;'上面的问题表明代码不是很直接,如果其他情况也是如此,这里的错误停止条件和固定长度的循环可能会导致这种情况。

只是一个'疯狂猜测'(TM),但我能在不知道实际代码的情况下给出最好的。

答案 2 :(得分:1)

看起来很可疑,是||可能应该是&amp;&amp;:

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

但我不知道它是如何导致你的问题的。

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

答案 3 :(得分:1)

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

就像我之前说的那样,虽然假设您的硬件需要去抖动,但指南应该帮助您识别这一点。即使你不需要它,你也会发现它很有趣!

附加:只是因为你知道我建议的原因是你提到了压力释放时发生的奇怪读数。在基于机械的开关和传感器的启动过程中,取样时的反弹误差很明显。

答案 4 :(得分:0)

查看您的代码我没有看到任何特殊原因您将获得该值,除非它反映了被感知的实际值。

你可以运行程序并输出32个值中的每一个值,然后平均出现问题的数字,前面的数字以及之后的数字吗?

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

- 亚当