|
關注+星標公眾號,不錯過精彩內容素材來源 | 網絡
物聯網的很多終端設備都有傳感器,而這些傳感器很多都會用到模擬量,模擬量就離不開ADC。
然而,我們單片機ADC采集的模擬量基本都會經過“濾波”處理才能使用,下面給大家分享一些常見的ADC濾波算法。
一、限幅濾波 1、方法
根據經驗判斷兩次采樣允許的最大偏差值A每次采新值時判斷:若本次值與上次值之差A,本次無效,用上次值代替本次。
2、優(yōu)缺點
克服脈沖干擾,無法抑制周期性干擾,平滑度差。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、方法
連續(xù)采樣N次,按大小排列取中間值為本次有效值
2、優(yōu)缺點
克服波動干擾,對溫度等變化緩慢的被測參數有良好的濾波效果,對速度等快速變化的參數不宜。3、代碼
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for(count = 0;count //獲取采樣值
{
value_buf[count] = get_ad();
delay();
}
for(j = 0;j-1);j++)
for(i = 0;iif(value_buf>value_buf[i+1])
{
temp = value_buf;
value_buf = value_buf[i+1];
value_buf[i+1] = temp;
}
return value_buf[(N-1)/2];
}
三、算數平均濾波 1、方法
連續(xù)采樣N次,取平均N較大時平滑度高,靈敏度低N較小時平滑度低,靈敏度高一般N=12
2、優(yōu)缺點
適用于存在隨機干擾的系統(tǒng),占用RAM多,速度慢。3、代碼
#define N 12
char filter()
{
int sum = 0;
for(count = 0;countreturn (char)(sum/N);
}
四、遞推平均濾波 1、方法
取N個采樣值形成隊列,先進先出取均值一般N=4~12
2、優(yōu)缺點
對周期性干擾抑制性好,平滑度高適用于高頻振動系統(tǒng)靈敏度低,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、優(yōu)缺點融合了中位值,平均值的優(yōu)點消除脈沖干擾計算速度慢,RAM占用大
[/ol]3、代碼
char filter()
{
char count,i,j;
char Value_buf[N];
int sum=0;
for(count=0;countfor(j=0;j-1);j++)
for(i=0;iif(Value_buf>Value_buf[i+1])
{
temp = Value_buf;
Value_buf= Value_buf[i+1];
Value_buf[i+1]=temp;
}
for(count =1;count-1;count++)
sum += Value_buf[count];
return (char)(sum/(N-2));
}
六、限幅平均濾波 1、方法
每次采樣數據先限幅后送入隊列取平均值
2、優(yōu)缺點
融合限幅、均值、隊列的優(yōu)點消除脈沖干擾,占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) value_buf[i++]=new_value;
if(i==N)i=0;
for(count =0 ;countreturn (char)(sum/N);
}
七、一階滯后濾波 1、方法
取a=0~1本次濾波結果=(1-a)* 本次采樣 + a * 上次結果
2、優(yōu)缺點
良好一直周期性干擾,適用波動頻率較高場合靈敏度低,相位滯后
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、優(yōu)缺點
適用有較大滯后時間常數和采樣周期短的系統(tǒng),對滯后時間常數小,采樣周期長、變化慢的信號不能迅速反應其所受干擾。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;countfor(count=0;countreturn (char)(sum/sum_coe);
}
九、消抖濾波 1、方法
設置一個濾波計數器將采樣值與當前有效值比較若采樣值=當前有效值,則計數器清0若采樣值不等于當前有效值,則計數器+1若計數器溢出,則采樣值替換當前有效值,計數器清0
2、優(yōu)缺點
對變化慢的信號濾波效果好,變化快的不好避免臨界值附近的跳動,計數器溢出時若采到干擾值則無法濾波
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、優(yōu)缺點
融合了限幅、消抖的優(yōu)點避免引入干擾值,對快速變化的信號不宜
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) {
count++;
if(count>=N) return new_value;
new_value=get_ad();
}
return value;
}
}
聲明:本文素材來源網絡,版權歸原作者所有。如涉及作品版權問題,請與我聯系刪除。
------------ END ------------
wpiu3ux0j5k64012375202.gif (71.87 KB, 下載次數: 1)
下載附件
保存到相冊
wpiu3ux0j5k64012375202.gif
2024-10-18 07:29 上傳
●專欄《嵌入式工具》
●專欄《嵌入式開發(fā)》
●專欄《Keil教程》
●嵌入式專欄精選教程
關注公眾號回復“加群”按規(guī)則加入技術交流群,回復“1024”查看更多內容。
點擊“閱讀原文”查看更多分享。 |
|