- 大部分ADC转换的第一次是不准的,所以第一次先转换一下,丢弃,后面再转换,保存ADC
- 滤波方法建议采用中值平均滤波法,有两种,第一种占用内存烧,第二种滤波更好,占内存大,和时间慢
/*********************************************************
函数名: unsigned int ADCRead()
描 述: ADC转换程序,转换18次,去掉最小值和最大值,求16次平均值
输入值: 无
输出值: 无
返回值: data—ADC结果
**********************************************************/
unsigned int ADCRead()
{
unsigned int max, min, sum, ad_temp;
unsigned char i;
unsigned int data;
max = 0x00;
min = 0xffff;
sum = 0x00;
for (i=0; i<18; i++)
{
ad_temp = ADCConvert();
if (ad_temp > max)
{
max = ad_temp; //替换最大值
}
if (ad_temp < min)
{
min = ad_temp; //替换最大值
}
sum += ad_temp;
}
sum -= min;
sum -= max;
data = sum >> 4; //除以16,取平均值
return data;
}
-
/*
中位值平均滤波法(又称防脉冲干扰平均滤波法)
*/
unsigned char ADC_FILTER(void)
{
unsigned char i,j,tmp;
unsigned int sum=0;
for(i=0;i<ADC_FILTER_N-1;i++)
{
for(j=0;j<ADC_FILTER_N-i-1;j++)
{
if(ADC_u8Arr_ValueBuf[j]>ADC_u8Arr_ValueBuf[j+1])
{
tmp = ADC_u8Arr_ValueBuf[j];
ADC_u8Arr_ValueBuf[j] = ADC_u8Arr_ValueBuf[j+1];
ADC_u8Arr_ValueBuf[j+1] = tmp;
}
}
}
for(i=2;i<ADC_FILTER_N-2;i++)
{
sum += ADC_u8Arr_ValueBuf[i];
}
return (unsigned char)(sum/(N-4));
}