单片机ADC常见的几种滤波方法

发布者:yanfeng00最新更新时间:2023-03-27 来源: zhihu关键字:单片机  ADC  滤波方法 手机看文章 扫描二维码
随时随地手机看文章

如今传感器的种类越来越多,数量也越来越多,而这些传感器很多都会用到模拟量,模拟量就离不开ADC。


然而,我们单片机ADC采集的模拟量基本都会经过“滤波”处理才能使用,下面给大家分享一些常见的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 < N;count++)                                //获取采样值

 {

  value_buf[count] = get_ad();

  delay();

 }

 for(j = 0;j<(N-1);j++)

  for(i = 0;i<(n-j);i++)

  if(value_buf[i]>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  sum += get_ad();

 return (char)(sum/N);

}

四、递推平均滤波

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;count  Value_buf[count]= get_ad();

 for(j=0;j<(N-1);j++)

  for(i=0;i<(N-j);i++)

   if(Value_buf[i]>Value_buf[i+1])

   {

     temp = Value_buf[i];

     Value_buf[i]= Value_buf[i+1];

      Value_buf[i+1]=temp;

   }

   for(count =1;count    sum += Value_buf[count];

   return (char)(sum/(N-2));

}


六、限幅平均滤波

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)  value_buf[i++]=new_value;

 if(i==N)i=0;

 for(count =0 ;count  sum+=value_buf[count];

 return (char)(sum/N);

}


七、一阶滞后滤波

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 {

  value_buf[count]=get_ad();

 }

 for(count=0;count  sum+=value_buf[count]*coe[count];

 return (char)(sum/sum_coe);

}


九、消抖滤波

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)  {

  count++;

  if(count>=N) return new_value;

  new_value=get_ad();

  }

 return value;

 }

}



------------ END ------------


关键字:单片机  ADC  滤波方法 引用地址:单片机ADC常见的几种滤波方法

上一篇:3个字让你记住单片机的大小端模式
下一篇:常用的几种 IAP 升级技术方案

推荐阅读最新更新时间:2024-11-06 14:25

英飞凌将亮相2024国际嵌入式展,集中展示面向绿色未来的创新半导体和微控制器解决方案
【2024年4月8日,德国慕尼黑讯】 低碳化和数字化是当今时代人们面临的两大核心挑战,人类社会需要依靠创新和先进的技术,才能破除挑战、推动转型进程。在德国纽伦堡举办的2024国际嵌入式展(Embedded World 2024)上,英飞凌科技股份公司将展示其创新的半导体解决方案如何支持与推动低碳化和数字化发展 。特别是微控制器在其中扮演着重要的角色,微控制器能够为各种应用提供核心技术支撑,其用途广泛涵盖电动汽车、可再生能源系统、智能家居和工业自动化等领域。有鉴于此,英飞凌将展示其采用最新技术、融合各种创新功能(如增强的安全性和高精度)设计的高质量微控制器,该微控制具有出色的性能,同时能够实现低功耗。 英飞凌将亮相2024国际
[半导体设计/制造]
英飞凌将亮相2024国际嵌入式展,集中展示面向绿色未来的创新半导体和<font color='red'>微控制器</font>解决方案
单片机为何没有输出速度这个配置选项
这是一个初学者不会去了解的问题,但,会使老司机掉坑的问题。 这也是最近在技术交流群看到的一个问题,所以,就出来简单分享一下。 概述 这个问题看起来比较简单,我相信很多人都能说出答案。 但是,很多人都只是停留在表面,没有在项目中经历过,也没有更深入的去了解。 很早之前年的单片机可能没有输出速度这个配置选项,但是这后面的单片机基本都有配置速度的选项,下面结合STM32来简单介绍一下。 GPIO输出速度 不管标准外设库,还是STM32CubeMX配置GPIO输出引脚,都会有速度GPIO_InitStruct.Speed这个选项。 类似如下: GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_In
[单片机]
<font color='red'>单片机</font>为何没有输出速度这个配置选项
利用蜂鸣器和单片机演奏简单的音乐电路设计
利用蜂鸣器和单片机演奏简单的音乐 实验原理图 实验程序 /* =========================================================== */ /* ----------------------------------------------------------- */ /* 曲谱存贮格式 uchar code 数组名{音高,音长,音高,音长....} */ /* 音高由三位数字组成: */ /* 个位是表示 1~7 这七个音符. */ /* 十位是表示音符所在的音区,1-低音,2-中音,3-高音; */ /* 百位表示这个音符是否要升半音 0(不写)-不升,1
[单片机]
利用蜂鸣器和<font color='red'>单片机</font>演奏简单的音乐电路设计
拿ARM当超级单片机用有什么不好
有的兄弟说用ARM就上操作系统,否则ARM就是超级单片机,甚是鄙夷。 有的兄弟说ARM7资源太少,上LINUX不好用,好似鸡肋。 有的人认为8位单片机能解决问题,ARM太贵。 我的想法与此不同,我一直把ARM7当超级单片机用,拿我刚做的一个东西来说吧。 需要: 两个串口、两个SPI口、14~16个I/O、加上一个液晶模块(得12~13根线吧) 就此系统,让我拿51来做,得累吐血。可能有大侠能做出来,但得在51的基础上加很多外围器件吧,编程时更复杂吧。其稳定性肯定不如用一片ARM7做的,出毛病也不好找,大量的外围器件加起来不比ARM7便宜。 所以我用ARM7做,几乎不需要附加的外围器件,而且此系统的功能并不复杂,ARM7的RAM
[单片机]
JTAGICE mkII 或是 AVR单片机 的问题
这两天 用 JTAGICE mkII 的 JTAG功能 仿真 一个程序,发现 一个问题,不知 是芯片问题,还是 仿真器的问题。我 是用AVRSTDIO4的GCC 写的 程序,用 JTAGICE mkII 来 仿真,芯片 是 ATmega32。 程序 见 附录,出现的问题是:当 代码 如附录所写 时,程序 运行正常,当 把 函数func()中的代码 直接放到while(1)中,即如下:(原程序 是 用 func() 代替了 几行代码) while(1) { atimer = 0; //清1ms定时标志 atmp = (aclock)/2; if (anum!=atmp ) { anum = atmp; atimer
[单片机]
富士通半导体44款新型FM3家族32位微控制器首次面市
富士通半导体(上海)有限公司日前宣布推出44款32位通用RISC微控制器产品,这些产品采用了ARM Cortex-M3 内核 ,是新型FM3家族产品的首次面市。这一系列产品将于2010年11月底提供样片,并于2011年1月底开始量产。 FM3是集成了ARM Cortex-M3全球化标准处理器内核,并整合了富士通多年来在开发FR微控制器而积累的大量优良外设性能基础上,推出的32位微控制器家族产品。FM3产品将针对32位微控制器应用市场推出高性能MB9BF500/400/300/100系列,以满足要求高速性能的需求。而标准MB9AF100系列主要应用于高性价比和低功耗需求的16位微控制器市场。 FM3家族产品应用了高性能AR
[工业控制]
用CPLD实现单片机与ISA总线接口的并行通信
摘要:介绍了用ALTERA公司MAX7000系列CPLD芯片实现单片机与PC104ISA总线接口之间的关行通信。给出了系统设计方法及程序源代码。 关键词:CPLD ISA总线 并行通信 CPLD(Complex Programmable Logic Device)是一种复杂的用户可编程逻辑器件,由于采用连续连接结构,易于预测延时,从而使电路仿真更加准确。CPLD是标准的大规模集成电路产品,可用于各种数字逻辑系统的设计。近年来,由于采用先进的集成工艺和大指量生产,CPLD器件成本不断下降,集成密度、速度和性能大幅度提高,一个芯片就可以实现一个复杂的数字电路系统;再加上使用方便的开发工具,使用CPLD器件可以极大地缩短产品开发周期
[工业控制]
单片机常用功能模块的使用 Part3. 多位共阴共阳数码管
  多位数码管和单个数码管的区别就在于:数量 (说了跟没说一样)   单个数码管使用时,只要将八位显示接到单片机的 I/O 口(如 P1)就可以了,多个数码管就要考虑管脚的 复用 问题了。因为多位数码管不仅要在单个数码管显示某种字符,还要指定哪一个数码管显示。以 8 位数码管为例,就需要 16 根线控制,8 个控制段码显示,8 个控制位码显示,这样单片机还可以承受。要是 16 位数码管呢,那就是 8+16=24 位了,再多了呢   想想大街上的霓虹灯广告牌,博主倒是不知道那是个什么原理,不过如果是用单片机实现,使用上述方法的话,单片机引脚肯定不够用!   因此,对于多数码管,需要使用 锁存器 ,达到 引脚复用 的目的。
[单片机]
<font color='red'>单片机</font>常用功能模块的使用 Part3. 多位共阴共阳数码管
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved