前言
單片機主要作用是控制外圍的器件,并實現一定的通信和數據處理。但在某些特定場合,不可避免地要用到數學運算,盡管單片機并不擅長實現算法和進行復雜的運算。下面給大家介紹十種常見的ADC濾波算法。
一、限幅濾波
1、方法
根據經驗判斷兩次采樣允許的最大偏差值A
每次采新值時判斷:若本次值與上次值之差<=A,則本次有效;若本次值與上次值之差>A,本次無效,用上次值代替本次。
2、優缺點
克服脈沖干擾,無法抑制周期性干擾,平滑度差。
3、代碼
/* A值根據實際調,Value有效值,new_Value當前采樣值,程序返回有效的實際值?*/ #define?A?10 char?Value; char?filter() { ??char?new_Value; ??new_Value?=?get_ad();????????????????????????????????????????//獲取采樣值 ??if(?abs(new_Value?-?Value)?>?A)???return?Value;?????????????//abs()取絕對值函數 ??return?new_Value; }
二、中位值濾波
1、方法
連續采樣N次,按大小排列
取中間值為本次有效值
2、優缺點
克服波動干擾,對溫度等變化緩慢的被測參數有良好的濾波效果,對速度等快速變化的參數不宜。
3、代碼
#define?N?11 char?filter() { ?char?value_buf[N]; ?char?count,i,j,temp; ?for(count?=?0;count?value_buf[i+1]) ??{ ???temp?=?value_buf[i]; ???value_buf[i]?=?value_buf[i+1]; ???value_buf[i+1]?=?temp; ??} ?return?value_buf[(N-1)/2]; }
三、算數平均濾波
1、方法
連續采樣N次,取平均
N較大時平滑度高,靈敏度低
N較小時平滑度低,靈敏度高
一般N=12
2、優缺點
適用于存在隨機干擾的系統,占用RAM多,速度慢。
3、代碼
#define?N?12 char?filter() { ?int?sum?=?0; ?for(count?=?0;count四、遞推平均濾波
1、方法
取N個采樣值形成隊列,先進先出
取均值
一般N=4~12
2、優缺點
對周期性干擾抑制性好,平滑度高
適用于高頻振動系統
靈敏度低,RAM占用較大,脈沖干擾嚴重
3、代碼
/* A值根據實際調,Value有效值,new_Value當前采樣值,程序返回有效的實際值?*/ #define?A?10 char?Value; char?filter() { ??char?new_Value; ??new_Value?=?get_ad();????????????????????????????????????????//獲取采樣值 ??if(?abs(new_Value?-?Value)?>?A)???return?Value;?????????????//abs()取絕對值函數 ??return?new_Value; } 五、中位值平均濾波
1、方法
采樣N個值,去掉最大最小
計算N-2的平均值
N= 3~14
2、優缺點
融合了中位值,平均值的優點
消除脈沖干擾
計算速度慢,RAM占用大
3、代碼
char?filter() { ?char?count,i,j; ?char?Value_buf[N]; ?int?sum=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、代碼
#define?A?10 #define?N?12 char?value,i=0; char?value_buf[N]; char?filter() { ?char?new_value,sum=0; ?new_value=get_ad(); ?if(Abs(new_value-value)七、一階滯后濾波
1、方法
取a=0~1
本次濾波結果=(1-a)* 本次采樣 + a * 上次結果
2、優缺點
良好一直周期性干擾,適用波動頻率較高場合
靈敏度低,相位滯后
3、代碼
/*為加快程序處理速度,取a=0~100*/ #define?a?30 char?value; char?filter() { ?char?new_value; ?new_value=get_ad(); ?return?((100-a)*value?+?a*new_value); }八、加權遞推平均濾波
1、方法
對遞推平均濾波的改進,不同時刻的數據加以不同權重,通常越新的數據權重越大,這樣靈敏度高,但平滑度低。
2、優缺點
適用有較大滯后時間常數和采樣周期短的系統,對滯后時間常數小,采樣周期長、變化慢的信號不能迅速反應其所受干擾。
3、代碼
/*?coe數組為加權系數表?*/ #define?N?12 char?code?coe[N]={1,2,3,4,5,6,7,8,9,10,11,12}; char?code?sum_coe={1+2+3+4+5+6+7+8+9+10+11+12}; char?filter() { ?char?count; ?char?value_buf[N]; ?int?sum=0; ?for(count=0;count九、消抖濾波
1、方法
設置一個濾波計數器
將采樣值與當前有效值比較
若采樣值=當前有效值,則計數器清0
若采樣值不等于當前有效值,則計數器+1
若計數器溢出,則采樣值替換當前有效值,計數器清0
2、優缺點
對變化慢的信號濾波效果好,變化快的不好
避免臨界值附近的跳動,計數器溢出時若采到干擾值則無法濾波
3、代碼
#define?N?12 char?filter() { ?char?count=0,new_value; ?new_value=get_ad(); ?while(value!=new_value) ?{ ??count++; ??if(count>=N)?return?new_value; ??new_value=get_ad(); ?} ?return?value; }十、限幅消抖濾波
1、方法
先限幅 后消抖
2、優缺點
融合了限幅、消抖的優點
避免引入干擾值,對快速變化的信號不宜
3、代碼
#define?A?10 #define?N?12 char?value; char?filter() { ?char?new_value,count=0; ?new_value=get_ad(); ?while(value!=new_value) ?{ ??if(Abs(value-new_value)=N)?return?new_value; ??new_value=get_ad(); ??} ?return?value; ?} }編輯:黃飛
評論
查看更多