我正在尝试实现一个循环缓冲区,以便对在嵌入式控制器上运行的 C 中的压力传感器生成的数据点流进行平均。这个想法是将最后 N 个压力读数存储在缓冲区中,同时保持缓冲区的运行总和。平均值 = sum / N。应该是微不足道的。
但是,我看到的平均值是从压力读数附近开始的值(我用典型值预加载缓冲寄存器),但随后趋向于零。如果我也显示总和,它也会逐渐下降到零。如果压力发生变化,平均值会在压力变化的方向上远离零,但一旦压力稳定,就会回到零趋势。
如果有人能发现我正在犯的错误,那将非常有帮助。
#define ARRAYSIZE 100
double Sum; // variable for running sum
double Average; // variable for average
double PressureValue[ARRAYSIZE]; // declare value array
int i; // data array index
int main(void) {
while (1)
{
if (i == ARRAYSIZE) i = 0; // test index, reset if it reaches the upper boundary
Sum = Sum - PressureValue[i]; // subtract the old datapoint from running sum
PressureValue[i] = PRESSURE; // replace previous loop datapoint with new data
Sum = Sum + PressureValue[i]; // add back the new current value to the running sum
Average = Sum / ARRAYSIZE; // calculate average value = SUM / ARRAYSIZE
++i; // increment index
} // end while loop
} // end main
平均代码发生在中断处理程序中;我正在通过 I2C 从压力传感器读取数据,并在每个 I2C 通信阶段结束时触发中断。在最后阶段,在检索到构成压力数据的四个字节后,将它们组合成一个完整的读数,然后转换为 PRESSURE 变量中包含的 PSI 中的十进制读数。
显然,这不是从我的代码中直接剪切和粘贴,但我不希望任何人都必须涉足整个事情,所以我将其限制为与计算平均值相关的内容,并更改了变量名更易读。不过,我无法发现我做错了什么。
感谢您的关注!
道格·G。