我正在PIC单片机上读取一个10位A/D转换器,并希望将该值平均超过几千个调用,并将平均值最终再次作为char.返回的值是16位字符.
我想做的事情如下:
float f = 0.0;
for (int i=0; i<5000; i++) {
n = readADC(); // Returns a char, 0->1023
f = f + (float)n;
}
f = f / 5000.0;
n = (char)f;
// Send n somewhere as the final char which is a mean of 5000 calls to the ADC.
Run Code Online (Sandbox Code Playgroud)
我得到了奇怪的价值,好像我没有正确地施展.我该如何解决这个问题?
如果你有一个最大1023(10位)的读数,并希望平均5000次(~13位),那么应该很清楚,用于平均的16位累加器(远)太小.
如果输入卡在1023,则5000次加法后的总和将为5000*1023 = 5115000,这显然不适合16位变量.甚至不是unsigned
一个,最大值为65535,超过78 次太少.
使用uint32_t
的蓄电池总和.
还要考虑平均4096或8192值,因此可以通过右移12或13位来完成除法.