【发布时间】:2017-04-26 08:09:30
【问题描述】:
我想做移动平均或类似的事情,因为我从 ADC 得到噪声值,这是我的第一次尝试,只是计算移动平均,但值每次都变为 0,你能帮帮我吗?
p>这是代码的一部分,它使这个神奇:
unsigned char buffer[5];
int samples = 0;
USART_Init0(MYUBRR);
uint16_t adc_result0, adc_result1;
float ADCaverage = 0;
while(1)
{
adc_result0 = adc_read(0); // read adc value at PA0
samples++;
//adc_result1 = adc_read(1); // read adc value at PA1
ADCaverage = (ADCaverage + adc_result0)/samples;
sprintf(buffer, "%d\n", (int)ADCaverage);
char * p = buffer;
while (*p) { USART_Transmit0(*p++); }
_delay_ms(1000);
}
return(0);
}
我通过 usart 发送此结果以显示值。
【问题讨论】:
-
你的等式不正确,试试
ADCaverage += (adc_result0-ADCaverage)/samples; -
伙计,它有效
-
如果噪声是一个问题,您可能还想使用整数而不是浮点数。
-
提出我的建议,请标记为正确。
-
请注意,您的(不正确的)代码和 eyllanesc 的更正版本是针对所有先前数据点的累积移动平均值,但您可能想要一个简单 i> 前 N 个数据点的移动平均值,用于噪声过滤。