在STM32中把12位的ADC精度提高到15位,程序中部分使用下面转载处的代码,得到的ADC误差值估计在50左右(既5mv左右,在电源1.6v以上时),可能实验室的万用表也存在一定误差,使得误差被放大了一点。
//2.中位值滤波法
/*
* description: 连续采样N次(N取奇数),把N次采样值按大小排列,
* 取中间值为本次有效值
* advantage: 能够有效克服偶然因素引起的波动干扰,
* 对温度、液位等变化缓慢的被测参数有良好的滤波效果
* disadvantage: 对流量、速度等快速变化的参数不宜
*/
/* N值可根据实际情况调整
排序采用冒泡法*/
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for ( count=0;count<N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}