ADC的移动平均线

时间:2015-10-26 18:35:37

标签: c microcontroller moving-average adc

大家好我正在研究一个项目,我必须计算ADC读数的移动平均值。来自ADC的数据代表正弦波。

这是我用来获取给定信号的移动平均值的代码。

longNew = (8 bit data from ADC);
longNew = longNew << 8;
//Division
longNew = longNew >> 8;    //255 Samples
longTemp = avgALong >> 8;

avgALong -= longTemp;// Old data 
avgALong += longNew;// New Data

avgA = avgALong >> 8;//256 Point Average

enter image description here

参考图像

Reference Image

请参考此图像查看相对于参考(或avgA)的上限和下限

目前我正在使用常数值来获取我的应用的电压上限和下限 我正在计算如下

upper_limit = avgA + Delta(x); lower_limit = avgA - Delta(x);

  

就我而言,我正在服用Delta(x)= 15。

我想根据信号强度计算这个常量表达式或Delta(x)。 信号的最大电压电平为255或5V。 信号的最小电压电平经常变化,因为恒定值对于确定下限和上限的我的应用是无用的。

请帮忙

谢谢

1 个答案:

答案 0 :(得分:1)

现在有关于发生了什么的描述,我想你想要三个平均值:

  1. 输入信号。轻微平均它有助于遏制噪音。
  2. upper_limit当您确定本地最大值时,请将它们推入此平均值。
  3. lower_limit当您确定本地最小值时,请将它们推入此平均值。
  4. 您的delta将是(upper_limit-lower_limit)/8(或4,或其他)。您的滞后点为upper_limit - deltalower_limit + delta

    每次转换到&#39; 1&#39;时,将当前的本地最小值推入lower_limit移动平均线,然后开始搜索新的局部最大值。当您转换为&#39; 0&#39;时,将本地最大值推入upper_limit移动平均线并开始搜索新的本地最小值。

    如果您的信号强度发生巨大变化,则会出现问题(您可能会遇到信号突然下降到滞后带并且您再也无法获得更多转换的点)。您可以通过以下几种方式解决这个问题:

    1. 计算您在滞后带中花费的时间,如果您花费太多时间,请重置所有内容。
    2. 或者

      1. 对于滞后带中的每个样本,将upper_limitlower_limit稍微靠近在一起。最终它们会崩溃到你再次开始检测转换的程度。
      2. 带上一粒盐。如果你为一个学校项目做这件事,它几乎肯定不会与你教授正在寻找的任何学术方法相匹配。