上面這段GetADCResult()是原來的AD采集,沒什么變化,看看就行了
GetResult()這個是軟件濾波的,10位AD的之前弄濾波總出錯,今天剛弄好。
關鍵在于(unsigned long)(),不加這個就總出錯!計算過程中溢出,感覺好像是計算時自動降位了
ulong GetADCResult(uchar ch) { ulong AD_result; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag ADC_CONTR &= ~ADC_FLAG; //Close ADC AD_result=ADC_RES*4+ADC_RESL; return AD_result; //Return ADC result 10bit } ulong GetResult(uchar ch) //濾波段 { ulong AD_result=0,AD_result1=0; ulong AD_max,AD_min,AD_temp; char AD_i,AD_o; for(AD_i=0;AD_i<4;AD_i++) { AD_min=AD_max=GetADCResult(ch); AD_result=0; for(AD_o=0;AD_o<8;AD_o++) { AD_temp=GetADCResult(ch); if(AD_temp<AD_min){AD_result =(unsigned long)(AD_result + (unsigned long)AD_min); AD_min=AD_temp;} else if(AD_temp>AD_max){AD_result =(unsigned long)(AD_result + (unsigned long)AD_max); AD_max=AD_temp;} else AD_result =(unsigned long)(AD_result + (unsigned long)AD_temp); } AD_result=(unsigned long)(AD_result/8); AD_result1=AD_result1+ (unsigned long)(AD_result); } AD_result1=(unsigned long)(AD_result1/4); return AD_result; //Return ADC result 10bit }
方法是基于:去除最大最小值后平均。共采樣了33次去掉9個后的結果平均值,我自己做電壓表,速度足夠!如果嫌慢的話可以把AD_i<4中的這個4改小點或者把這個循環去掉。