組み込みコントローラーで実行されている C の圧力センサーによって生成されたデータ ポイントのストリームを平均化するために、循環バッファーを実装しようとしています。アイデアは、バッファの実行中の合計を維持しながら、最後の N 個の圧力読み取り値をバッファに保存することです。平均 = 合計 / 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 経由で圧力センサーからデータを読み取っています。最後の段階で、圧力データを構成する 4 バイトが取得された後、それらは完全な読み取り値に組み立てられ、次に PRESSURE 変数に含まれる PSI の 10 進数の読み取り値に変換されます。
明らかに、これは私のコードからの直接のカット アンド ペーストではありませんが、私は誰もがすべてのことを苦労する必要がないようにしたかったので、平均を計算することに関連するものだけに制限し、変数名を読みやすくします。それでも、私は自分が間違っていることを見つけることができません。
ご清聴ありがとうございました!
ダグ G.