自创滤波,希望能免费收拾些砖头~哈哈
#define COUN 50 static struct AccountVar{
uint16 MeanCount; //平均值 uint16 CountMax;//最大值 uint16 CountOut;//数值输出
uint16 CountSimilar[10];//近似数值BUF
uint16 ADCCount[COUN];//读取AD值BUF };
static struct AccountVar StAcVar;
/********************** 函数名称:ADC_CountAnalyse() 函数功能:平稳滤波 输入量: 输出量: 创建人:jtgetja 建立日期:2006-12-30 修改日期:2007-01-01 函数说明:由于湿敏电容在直流电下显电容特性,在交流电下主显电阻特性. 如果采用正弦波电路较为复杂成本高,因此采用方波测量但其电阻又显特性 因此设计了此法.估且称为"近拟值平均算法" ***********************/
uint16 ADC_CountAnalyse(void) { //#define ADC_Count_ERROR 30 //#define COUN 50
//typedef StAcVar ADCAn; uint16 ADC_Count_ERROR; //声明误差值
uint8 Cou=0,Cou1=0,Cou2=0;//声明循环计数器 //uint16 TCount=0;
StAcVar.CountMax=0; for(Cou=0;Cou<COUN;Cou++) { StAcVar.ADCCount[Cou]=ReadData_ADC();//读取50个AD值 delay1N(10); //延时读取方波脉冲间隙 if(StAcVar.CountMax < StAcVar.ADCCount[Cou]) StAcVar.CountMax=StAcVar.ADCCount[Cou];//选取最大值 } ADC_Count_ERROR=StAcVar.CountMax*0.05;//计出允许偏移量 for(Cou=0,Cou1=0;Cou<COUN;Cou++) { if(((StAcVar.CountMax - StAcVar.ADCCount[Cou])<ADC_Count_ERROR))//先取偏移量内的近拟值 { StAcVar.CountSimilar[Cou1]=StAcVar.ADCCount[Cou];// Cou1++; if(Cou1>10)//近拟值个数 { //Serial_Transmit('A'); break; //Cou1=0; } } } for(Cou2=0,StAcVar.MeanCount=0;Cou2<Cou1;Cou2++) { StAcVar.MeanCount=(StAcVar.MeanCount+StAcVar.CountSimilar[Cou2]);//总和近拟值 } StAcVar.MeanCount=(StAcVar.MeanCount/Cou1);//近拟值平均 if(Cou1>=4)StAcVar.CountOut=StAcVar.MeanCount;//选取近拟值多的平均值输出 Serial_Transmit(Cou1); return (StAcVar.CountOut);//返回输出数
}
此法创立了该湿敏电阻测量(稳定,精确度上的)的新历史.该法只适合对数据连续性\和速度不高的场合 希望能给有需要的朋友有所帮助. 同时发现不足之恳请给予批正谢谢! 欢迎交流,讨论: powqeras620@21cn.com
|