電子產業(yè)一站式賦能平臺

PCB聯盟網

搜索
查看: 45|回復: 0
收起左側

分享幾種單片機常見的濾波方法

[復制鏈接]

300

主題

300

帖子

2202

積分

三級會員

Rank: 3Rank: 3

積分
2202
跳轉到指定樓層
樓主
發(fā)表于 5 天前 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
關注+星標公眾,不錯過精彩內容素材來源 | 網絡
物聯網的很多終端設備都有傳感器,而這些傳感器很多都會用到模擬量,模擬量就離不開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)缺點
  • 適用于存在隨機干擾的系統,占用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)缺點
  • 對周期性干擾抑制性好,平滑度高
  • 適用于高頻振動系統
  • 靈敏度低,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)缺點
  • 適用有較大滯后時間常數和采樣周期短的系統,對滯后時間常數小,采樣周期長、變化慢的信號不能迅速反應其所受干擾。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 ------------



    ●專欄《嵌入式工具
    ●專欄《嵌入式開發(fā)》
    ●專欄《Keil教程》
    ●嵌入式專欄精選教程

    關注公眾號回復“加群”按規(guī)則加入技術交流群,回復“1024”查看更多內容。

    點擊“閱讀原文”查看更多分享。
  • 回復

    使用道具 舉報

    發(fā)表回復

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則

    關閉

    站長推薦上一條 /1 下一條


    聯系客服 關注微信 下載APP 返回頂部 返回列表