3

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

如您所见,显示了一个错误的值,我无法找出原因。

4

5 回答 5

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;
于 2009-02-26T20:06:10.590 回答
2

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

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

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

于 2009-04-29T12:06:25.563 回答
1

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

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

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

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

于 2009-02-26T19:44:16.150 回答
1

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

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

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

于 2012-08-12T02:53:03.190 回答
0

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

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

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

-亚当

于 2009-02-26T20:21:03.630 回答