单片机在模拟电路中使用的时候,经常需要用到AD功能,而通过单片机ADC采集回来的数据往往不能直接使用,在不同场合下需要对采集到的数据要通过不同的算法对数据进行处理,先来看看最简单的平均值采样法。
平均值采样法就是在一定时间内对采样的数据直接进行累加,然后用累加和除以采样的次数。将计算出来的平均值做为有效数据使用。
直接看C代码的实现
//累加100次求平均值
u16 get_ave1( void )
{
static u8 cnt = 0;
static u32 sum = 0;
static u16 ave = 0;
if( cnt < 100 )
{
sum += ReadVol_CH4(); //读取ADC数据
cnt++;
}
if( cnt >= 100 )
{
ave = sum / 100;
cnt = 0;
sum = 0;
}
return ave;
}
代码很简单,每采样一次数据就累加一次,采样到100次数据后计算平均值就行。
下来测试一下采样效果,首先通过函数发生器产生一个100HZ的正弦波,最小值0V,最大值4V。
在主函数中读取采样到的平均值,并通过串口打印出来,然后用串口波形显示软件将采样到的数据显示出来。
while( 1 )
{
val1 = get_ave1();
printf( "A%drn", val1 );
}
串口波形软件显示的波形如下:
可以看到采样回来的数据还算比较稳定,平均值为418,由于单片机自带的是10位AD,所以ADC采样值最大为2^10 =1024,单片机是5V供电,可以计算出采样的平均电压为 418/1024*5=2.04V,通过上面示波器测的波形可以看到,示波器测的正弦波平均值为2.02V,说明平均值采样的方法还是比较准确的。串口波形软件上显示的波形有点波动,那是因为采样回来的平均值在 418 和 422 之间波动,可以计算出波动电压范围是(422-418)/1024*5=0.01953125V,如果要求不高的话,这个波动还是可以接受的。
在采样数据比较规律时,采样数据如果能采样到整个周期的数据时,平均值采样法还是比较简单的。如果采样的结果波动较大,可以通过增加采样次数来调整采样结果的稳定性。