单片机AD采样用到的滤波算法

一、限幅滤波

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<N;count++)   sum += get_ad();  return (char)(sum/N); }

四、递推平均滤波

1、方法

  • 取N个采样值形成队列,先进先出
  • 取均值
  • 一般N=4~12
  • 采用队列作为测量数据存储器 , 设队列的长度为 N ,每进行一次测量 ,把测量结果放于队尾, 而扔掉原来队首的一个数据, 这样在队列中始终就有 N 个 “最新” 的数据。当计算平均值时, 只要把队列中的 N 个数据进行算数平均 ,就可得到新的算数平均值。这样每进行一次测量, 就可得到一个新的算术平均值。

2、优缺点

  • 对周期性干扰抑制性好,平滑度高
  • 适用于高频振动系统
  • 灵敏度低,RAM占用较大,脉冲干扰严重

3、代码

/*定义滤波数据类型*/ typedef int filter_type; // 函数声明 filter_type filter(filter_type value_buf[], filter_type new_value, int num);  /* 递推平均滤波函数 */ filter_type filter(filter_type value_buf[], filter_type new_value, int num) { static int i; int count; filter_type sum = 0;  value_buf[i++] = new_value;  if (i == num) i = 0; for (count=0; count<num; count++) sum += value_buf[count];  return (filter_type)(sum/num); }

五、中位值平均滤波

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<N;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<N-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)<A)   value_buf[i++]=new_value;  if(i==N)i=0;  for(count =0 ;count<N;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<N;count++)  {   value_buf[count]=get_ad();  }  for(count=0;count<N;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)<A)   {   count++;   if(count>=N) return new_value;   new_value=get_ad();   }  return value;  } }

推荐这些技术文章:

AVR单片机 ATMEGA8单片机 ADC电压采样 数码管输出

1. 先看原理图,使用内部的ADC电压采样,通过数码管输出

 
2. 相关代码

#include <avr/io.h>

//1 总的来说,ADC总共有3个寄存器,
// 这个ADC是10位的,原来找到了寄存器的头文件
#define LED_DATA PORTD
#define LED_CONTROL PORTB
#define LED_0 PORTB0...

基于单片机炉温温度恒温控制系统设计

设计思路:
测温,温度可设定,继电器电路,数码管显示。此系统用于控温,当设定温度高于实际温度时,继电器吸合加热单元加热,当实际温度大于设定温度时,继电器释放。

#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P0
sbit RED_ALARM=P1^0;
s...

【蓝桥杯-单片机省赛】第三届自动售水机

自己做的答案,疏漏之处在所难免,代码仅供参考
mian.c
#include "stc15f2k60s2.h"
#include "hc138.h"
#include "display.h"
#include "key.h"
#include "pcf8591.h"

void S6_display();
void S7_display();

void main(){
unsigned c...

@Html.TextBoxFor生成的Input标签中无法给value属性赋初值

问题

按道理来说生成的input标签的value的值应该是new with{}中赋予value的值,但现在页面上却显示不出来,html中的value也为空
求甚解!!!

最佳回答
  直接<input value='Model.value' type="text"/> 这样可以吗? 可以就这样写吧 这写更灵活啊 ...

Vue 过滤器filters 使用时犯的一个弱智的错误(Failed to resolve filter)

过滤器

filter:{
FdishList:function(value){
if (!value) return ''
value = value.toString()
return value.slice(1)+' '
}
}

报错:

filter后面忘了加s,应该是filters

原文链接:https://w...

AD认证的问题请教大家

问题
我们公司内部系统,原先不是用AD认证,现在老板要一个用AD认证的可行性方案,请教大家AD认证有哪些好处,有哪些缺点。我们的系统也有外部的用户,请问如果用AD认证,这部分用户该怎么做认证处理,谢谢,在线等。

最佳回答
Form认证和ad认证結合

...

20220323-day12:利用type判断value类型

info = { "1":[11,22,33], "2":{"k1":123,"k2":456,"k3":999},}index = input("请输入编号:")value = info[index]if type(value) == list: for i in value: print(i)if type(value) == dict: for k,v...

查找最后一位小于等于 value 的元素(从中位数查找,节约大量性能)

-- 查找最后一位小于等于value的元素
-- 有序数组 从小到大
-- @param t 待搜索table
-- @param filter_func 刷选器,支持数组元素可以为table
-- @param value 搜索值
-- @return index 返回位置下标 -1没找到
function BinaryUtils:bindSearchLastLessOrEqual(t, v...

判断数组对象里的value是否含数组值集合(一个数组里对象的值是否与另一个数组的值相匹配)

let val = ['zhinan','shejiyuanze','fankui']let vals = this.getCascaderObj(val, this.options5);console.log(this.getCascaderObj(val, this.options5))结果是:

 
 

getCascaderObj(val,opt) { conso...

filter常用的情况 可精简代码

var cur = this.contractTypeList.filter(item => { return item.value == this.contractId })

...

文章标题:单片机AD采样用到的滤波算法
文章链接:https://www.dianjilingqu.com/2875.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>