ADC 的移动平均线

Moving Average for 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

参考图片

请参考此图片以获取相对于参考值(或 avgA)的上限和下限

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

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

In my case I am taking Delta(x) = 15.

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

请帮忙

谢谢

现在有了对发生的事情的描述,我想你想要三个 运行 平均值:

  1. 输入信号。轻轻平均它以帮助抑制噪音。
  2. upper_limit 当您确定局部最大值时,将它们推入此平均值。
  3. lower_limit 当您确定局部最小值时,将它们推入此平均值。

您的增量将是 (upper_limit-lower_limit)/8(或 4,或其他)。您的滞后点将是 upper_limit - deltalower_limit + delta.

每次转换到“1”时,将当前局部最小值推入 lower_limit 移动平均线,然后开始搜索新的局部最大值。当您过渡到“0”时,将局部最大值推入 upper_limit 移动平均线并开始搜索新的局部最小值。

如果您的信号强度变化很大(您可能会到达一个点,您的信号突然下降到滞后带并且您再也无法进行任何转换),就会出现问题。您可以通过几种方式解决此问题:

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

  1. 对于滞后带中的每个样本,将 upper_limitlower_limit 稍微靠近一点。最终它们会崩溃到您再次开始检测转换的程度。

对此持保留态度。如果你是为学校项目做这件事,它几乎肯定不会符合你的教授正在寻找的任何学术方法。