【问题标题】:Floating average with reading of ADC values读取 ADC 值的浮动平均值
【发布时间】:2017-04-26 08:09:30
【问题描述】:

我想做移动平均或类似的事情,因为我从 ADC 得到噪声值,这是我的第一次尝试,只是计算移动平均,但值每次都变为 0,你能帮帮我吗?

p>

这是代码的一部分,它使这个神奇:

unsigned char buffer[5];
    int samples = 0;
    USART_Init0(MYUBRR);
    uint16_t adc_result0, adc_result1;
    float ADCaverage = 0;

    while(1)
    {

        adc_result0 = adc_read(0);      // read adc value at PA0
        samples++;
        //adc_result1 = adc_read(1);      // read adc value at PA1

        ADCaverage = (ADCaverage + adc_result0)/samples;

        sprintf(buffer, "%d\n", (int)ADCaverage); 
        char * p = buffer;
        while (*p) { USART_Transmit0(*p++); }
        _delay_ms(1000);
    }
    return(0);
}

我通过 usart 发送此结果以显示值。

【问题讨论】:

  • 你的等式不正确,试试ADCaverage += (adc_result0-ADCaverage)/samples;
  • 伙计,它有效
  • 如果噪声是一个问题,您可能还想使用整数而不是浮点数。
  • 提出我的建议,请标记为正确。
  • 请注意,您的(不正确的)代码和 eyllanesc 的更正版本是针对所有先前数据点的累积移动平均值,但您可能想要一个简单 i> 前 N 个数据点的移动平均值,用于噪声过滤。

标签: c average adc ansi-c


【解决方案1】:

你的等式不正确。

然后让s_n = (sum_{i=0}^{n} x[i])/n

s_(n-1) = sum_{i=0}^{n-1} x[i])/(n-1)

sum_{i=0}^{n-1} x[i] = (n-1)*s_(n-1)
sum_{i=0}^{n} x[i] = n*s_n


sum_{i=0}^{n} x[i] = sum_{i=0}^{n-1} x[i] + x[n]

n*s_n = (n-1)*s_(n-1) + x[n] =  n*s_(n-1) + (x[n]-s_(n-1))
s_n = s_(n-1) + (x[n]-s_(n-1))/n

你必须使用

ADCaverage += (adc_result0-ADCaverage)/samples; 

【讨论】:

    【解决方案2】:

    您可以使用只需要 1 个内存单元的指数移动平均线。
    y[0] = (x[0] + y[-1] * (a-1) )/a
    其中 a 是过滤因子。

    如果 a 是 2 的倍数,您可以使用班次并显着优化速度:
    y[0] = ( x[0] + ( ( y[-1] << a ) - y[-1] ) ) >> a

    这对左对齐 ADC 尤其有效。只需留意移位结果的字长即可。

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 2020-07-07
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 2020-11-12
      • 2020-08-08
      • 1970-01-01
      • 2016-06-10
      相关资源
      最近更新 更多