如今傳感器的種類越來越多,數量也越來越多,而這些傳感器很多都會用到模擬量,模擬量就離不開ADC。
然而,我們單片機ADC采集的模擬量基本都會經過“濾波”處理才能使用,下面給大家分享一些常見的ADC濾波算法。
一、限幅濾波
1、方法
根據經驗判斷兩次采樣允許的最大偏差值A
每次采新值時判斷:若本次值與上次值之差<=A,則本次有效;若本次值與上次值之差>A,本次無效,用上次值代替本次。
2、優缺點
克服脈沖干擾,無法抑制周期性干擾,平滑度差。
3、代碼
/* A值根據實際調,Value有效值,new_Value當前采樣值,程序返回有效的實際值*/ #defineA10 charValue; charfilter() { charnew_Value; new_Value=get_ad();//獲取采樣值 if(abs(new_Value-Value)>A)returnValue;//abs()取絕對值函數 returnnew_Value; }
二、中位值濾波
1、方法
連續采樣N次,按大小排列
取中間值為本次有效值
2、優缺點
克服波動干擾,對溫度等變化緩慢的被測參數有良好的濾波效果,對速度等快速變化的參數不宜。
3、代碼
#defineN11 charfilter() { charvalue_buf[N]; charcount,i,j,temp; for(count=0;countvalue_buf[i+1]) { temp=value_buf[i]; value_buf[i]=value_buf[i+1]; value_buf[i+1]=temp; } returnvalue_buf[(N-1)/2]; }
三、算數平均濾波
1、方法
連續采樣N次,取平均
N較大時平滑度高,靈敏度低
N較小時平滑度低,靈敏度高
一般N=12
2、優缺點
適用于存在隨機干擾的系統,占用RAM多,速度慢。
3、代碼
#defineN12 charfilter() { intsum=0; for(count=0;count
四、遞推平均濾波
1、方法
取N個采樣值形成隊列,先進先出
取均值
一般N=4~12
2、優缺點
對周期性干擾抑制性好,平滑度高
適用于高頻振動系統
靈敏度低,RAM占用較大,脈沖干擾嚴重
3、代碼
/* A值根據實際調,Value有效值,new_Value當前采樣值,程序返回有效的實際值*/ #defineA10 charValue; charfilter() { charnew_Value; new_Value=get_ad();//獲取采樣值 if(abs(new_Value-Value)>A)returnValue;//abs()取絕對值函數 returnnew_Value; }
五、中位值平均濾波
1、方法
采樣N個值,去掉最大最小
計算N-2的平均值
N= 3~14
2、優缺點
融合了中位值,平均值的優點
消除脈沖干擾
計算速度慢,RAM占用大
3、代碼
charfilter() { charcount,i,j; charValue_buf[N]; intsum=0; for(count=0;countValue_buf[i+1]) { temp=Value_buf[i]; Value_buf[i]=Value_buf[i+1]; Value_buf[i+1]=temp; } for(count=1;count
六、限幅平均濾波
1、方法
每次采樣數據先限幅后送入隊列
取平均值
2、優缺點
融合限幅、均值、隊列的優點
消除脈沖干擾,占RAM較多
3、代碼
#defineA10 #defineN12 charvalue,i=0; charvalue_buf[N]; charfilter() { charnew_value,sum=0; new_value=get_ad(); if(Abs(new_value-value)
/*為加快程序處理速度,取a=0~100*/ #definea30 charvalue; charfilter() { charnew_value; new_value=get_ad(); return((100-a)*value+a*new_value); }
對遞推平均濾波的改進,不同時刻的數據加以不同權重,通常越新的數據權重越大,這樣靈敏度高,但平滑度低。
適用有較大滯后時間常數和采樣周期短的系統,對滯后時間常數小,采樣周期長、變化慢的信號不能迅速反應其所受干擾。
/*coe數組為加權系數表*/ #defineN12 charcodecoe[N]={1,2,3,4,5,6,7,8,9,10,11,12}; charcodesum_coe={1+2+3+4+5+6+7+8+9+10+11+12}; charfilter() { charcount; charvalue_buf[N]; intsum=0; for(count=0;count
#defineN12 charfilter() { charcount=0,new_value; new_value=get_ad(); while(value!=new_value) { count++; if(count>=N)returnnew_value; new_value=get_ad(); } returnvalue; }
#defineA10 #defineN12 charvalue; charfilter() { charnew_value,count=0; new_value=get_ad(); while(value!=new_value) { if(Abs(value-new_value))>;count++)> )> ;count++)>;count++)> ;count++)>
-
傳感器
+關注
關注
2552文章
51288瀏覽量
755160 -
單片機
+關注
關注
6040文章
44592瀏覽量
636902 -
adc
+關注
關注
98文章
6524瀏覽量
545206
原文標題:單片機ADC常見的幾種濾波方法
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論