一种经典适用的AD采样值进行滤波的方法
时间:01-20 13:44 阅读:1634次
*温馨提示:点击图片可以放大观看高清大图
简介:在这里为大家介绍一种经典适用的AD采样值进行滤波的方法。
本节讲讲一种非常适用的采样AD值进行滤波的方法
此滤波方法是把AD采样值经过两种处理:
1 对当前三次AD采样值进行提取中间值处理
在通常情况下,中值处理一次就够,但是必须的,因为AD偶尔会受到干扰导致
采样到的值为0XFF或0X00,那么中值处理就可以滤掉这个干扰数据,否则你把
这个干扰信号值即使累加后取平均,也会影响到整体的最终取值。
2 对以上中间值进行累加取平均值处理
累加次数看实际应用情况设定,一般8至64次足够,如果是做NTC温度采集的话
建议把累加次数放大一些,这样温度不会跳得过于频繁。
以下是一个采集电位器AD的实际应用
//*************************************
// 函数名称:Order_Byte
// 函数功能:选择法对数组从小到大排序,返回中间数据
// 入口参数:排序数据的首地址
// 出口参数:无
// 返 回 值:该列数据是的中间值 VC已验证
//***************************************
uint8 Order_Byte(uint8 *a)
{
uint8 i,j,k;
uint8 tmp;
uint8 R_Tmp[3] ;
uint8 DataLong = 3 ;
for(i=0;i<DataLong;i++,a++)
{
R_Tmp[i] = *a ;
}
for(i=0;i<DataLong-1;i++)
{
k=i; /*给记号赋值*/
for(j=i+1;j<DataLong;j++)
{
if(R_Tmp[k]>R_Tmp[j]) k=j; /*是k总是指向最小元素*/
}
if(i!=k)
{ /*当k!=i是才交换,否则a[i]即为最小*/
tmp=R_Tmp[i];
R_Tmp[i]=R_Tmp[k];
R_Tmp[k]=tmp;
}
}
i = DataLong >> 1 ;
return R_Tmp[i] ;
}
//*************************************
// 函数名称:CalculateAD
// 函数功能:对所读的AD值进行滤波处理 得到稳定的AD值
// 入口参数:无
// 出口参数:无
//***************************************
void CalculateAD(void)
{
static uint8 R_Save[3];
// static uint8 R_Save2[3];
static uint16 R_SaveSum = 0 ;
static uint8 Tcon = 0 ;
uint8 Tmp,i ;
/*第一次排序*/
for(i=2;i>0;i--)
{
R_Save[i] = R_Save[i-1]
}
R_Save[0] = R_ADValue; //取AD值
Tmp = Order_Byte(R_Save);// 排序 取中值
/*第二次排序*/
/*
for(i=2;i>0;i--)
{
R_Save2[i] = R_Save2[i-1]
}
R_Save2[0] = Tmp ;
Tmp = Order_Byte(R_Save2);// 排序 取中值
*/
R_SaveSum += Tmp ;
Tcon ++ ;
if(Tcon >= (1<<4)) //16次累加
{
Tcon = 0 ;
R_CuVr = (uint8)(R_SaveSum>>4) ;//取最终结果 10MS*16=160MS 出一次结果
R_SaveSum = 0 ;
}
}
//========================================
void main(void)
{
while(1)
{
while(!F_10MS); //10MS 跑一次主程序
F_10MS = 0 ;
CalculateAD() ; //计算AD采样值
}
}