1.算数平均值滤波
void interrupt AD(void) { WREG_temp=WREG; //现场保护 STATUS_temp=STAUTS; ADIF=0; //清除中断标志 AD_total+=ADRESH; if(++count>=4) //AD转换次数超过4次? { count=0; //是,输出滤波结果 AD_result=AD_total/4; //存放在AD_result中 AD_total=0; } WREG=WREG_temp; STATUS=STAUTS_temp; //还原现场 } AD转换的主程序: void main(void) { ADCON0=0x01; //初始化ADCON0寄存器 TRISA=0xFF; //A口设置成模拟输入 ADCON1=0xFF; //初始化ADCON1寄存器 ADIE=1; //开AD中断 ADIF=0; GIE=1; //开总部中断 PEIE=1; //开外部中断 count=0; //清零计数器,在主函数外部声明的全局变量 GO=1; //开AD while(1); }2.滑动平均值滤波
void interrupt AD(void) { WREG_temp=WREG; //现场保护 STATUS_temp=STAUTS; ADIF=0; //清除中断标志 if(AD_enable=1) //AD转换次数超过4次? { if(count>=8) count=0; AD_total+=ADgot[count++]; //是,输出滤波结果 AD_result=AD_total/8; //存放在AD_result中 if(count>=8) count=0; AD_total-=ADgot[count]; //去掉最早AD结果 } else { if(count>=7) AD_enable=1; //最初的8次AD结果 ADgot[count]=ADRESH; //保存AD转换结果 AD_total+=ADgot[count++]; //累加AD转换结果 AD_result=AD_total/8; //计算8次采样AD转换平均结果 AD_total-=ADgot[0]; //去掉最早AD转换结果 } WREG=WREG_temp; STATUS=STAUTS_temp; //还原现场 }3.防脉冲干扰平均值滤波
void interrupt AD(void) { WREG_temp=WREG; //现场保护 STATUS_temp=STAUTS; ADIF=0; //清除中断标志 AD_temp=ADRESH; //保存1次AD采样结果 ADgot[count++]=AD_temp; //保存采样结果到数组中 if(AD_temp>AD_max) //当前采样大于最大值? { AD_max=AD_temp; //是,在AD_max中保存当前值 } else if(AD_temp<AD_min) //否,比较当前采样小于最小值? { AD_min=AD_temp; //是,在AD_min中保存当前值 } if(count>=8) //采样次数是否达到8次? { count=0; //是,采样次数清零, unsigned char i; for(i=0;i<8;i++) AD_total+=ADgot[i]; //累加8次采样数据 AD_total=AD_total-AD_min-AD_max; //减掉最大值和最小值,得到6次AD结果 AD_result=AD_total/6; //计算6次采样平均值 AD_total=0; } WREG=WREG_temp; STATUS=STAUTS_temp; //还原现场 }4.中值滤波
void interrupt AD(void) { WREG_temp=WREG; //现场保护 STATUS_temp=STAUTS; ADIF=0; //清除中断标志 ADgot[count++]=ADRESH; //保存AD转换结果到数组中 if(count>=5) //采样结果超过5次? { //是,则执行以下操作 unsigned char i,j,temp; for(i=0;i<4;i++) for(j=i;j<5;j++) if(ADgot[i]>ADgot[j] //将第i个数依次和第i+1到最后的数进行比较 { temp=ADgot[j]; //在第i个数的位置 ADgot[j]=ADgot[i]; //保存从i到最后个数中最小的一个 ADgot[i]=temp; //temp用于中间交换的临时变量 } AD_result=ADgot[2]; //把最中间的采样结果作为最后AD转换结果 //即5个数当中的第3个,从0到4的下标号为2 count=0; //计数器清零 } WREG=WREG_temp; STATUS=STAUTS_temp; //还原现场 }5.一阶滞后滤波
void interrupt AD(void) { WREG_temp=WREG; //现场保护 STATUS_temp=STAUTS; ADIF=0; //清除中断标志 AD_result=ADRESH; //AD结果存放到AD_result中; WREG=WREG_temp; STATUS=STAUTS_temp; //还原现场 }