单片机实现数字滤波的算法

发布者:Tapir最新更新时间:2017-11-18 来源: eefocus关键字:单片机  数字滤波 手机看文章 扫描二维码
随时随地手机看文章

    单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。

    在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。

    采用数字滤波算法克服随机干扰的误差具有以下优点:

    1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。

    2、数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。

    3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。

    4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

    (1)限幅滤波算法

    该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。

    算法的程序代码如下:

    #defineA//允许的最大差值

    chardata;//上一次的数据

    charfilter()

    {

    chardatanew;//新数据变量

    datanew=get_data();//获得新数据变量

    if((datanew-data)>A||(data-datanew>A))

    returndata;

    else

    returndatanew;

    }

    说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。

    (2)中值滤波算法

    该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。

    算法的程序代码如下:

    #defineN11//定义获得的数据个数

    charfilter()

    {

    charvalue_buff[N];//定义存储数据的数组

    charcount,i,j,temp;

    for(count=0;count

    {

    value_buf[count]=get_data();

    delay();//如果采集数据比较慢,那么就需要延时或中断

    }

    for(j=0;j

    {

    for(value_buff[i]>value_buff[i+1]

    {

    temp=value_buff[i];

    value_buff[i]=value_buff[i+1];

    value_buff[i+1]=temp;

    }

    }

    returnvalue_buff[(N-1)/2];

    }

    说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。

    (3)算术平均滤波算法

    该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。

    算法的程序代码如下:

    charfilter()

    {

    intsum=0;

    for(count=0;count

    {

    sum+=get_data();

    delay():

    }

    return(char)(sum/N);

    }

    说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。

    (4)加权平均滤波算法

    由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:

    式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

    样例程序代码如下:

    charcodejq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//code数组为加权系数表,存在程序存储区

    charcodesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;

    charfilter()

    {

    charcount;

    charvalue_buff[N];

    intsum=0;

    for(count=0;count

    {

    value_buff[count]=get_data();

    delay();

    }

    for(count=0;count

    sum+=value_buff[count]*jq[count];

    return(char)(sum/sum_jq);

    }

    (5)滑动平均滤波算法

    以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。

    程序代码如下:

    charvalue_buff[N];

    chari=0;

    charfilter()

    {

    charcount;

    intsum=0;

    value_buff[i++]=get_data();

    if(i==N)

    i=0;

    for(count=0;count

    sum=value_buff[count];

    return(char)(sum/N);

    }

    (6)低通滤波

    将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:

    Yn=a*Xn+(1-a)*Yn-1

    式中Xn——本次采样值

    Yn-1——上次的滤波输出值;

    ,a——滤波系数,其值通常远小于1;

    Yn——本次滤波的输出值。

    由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算:

    fL=a/2Pitpi为圆周率3.14…

    式中a——滤波系数;

    ,t——采样间隔时间;

    例如:当t=0.5s(即每秒2次),a=1/32时;

    fL=(1/32)/(2*3.14*0.5)=0.01Hz

    当目标参数为变化很慢的物理量时,这是很有效的。另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,

    低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。

    设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H(整数)和33H(小数)中。

关键字:单片机  数字滤波 引用地址:单片机实现数字滤波的算法

上一篇:给单片机初学者的建议
下一篇:单片机怎么驱动继电器

推荐阅读最新更新时间:2024-03-16 15:45

51单片机-代码对比
1.延时函数退出舞台 有了上一讲的理论讲解,代码的实现就比较简单了,实验现象就是高6位的6盏灯不停流水,我们用K4按键控制LED2的亮灭,并且途中并没有影响到6盏流水灯的运行。 我们知道以前流水灯是需要延时才能看得到流水现象的,那么现在再用延时函数的话,按键就没有意义了。比如流水灯的跳变需要间隔50ms才看得出是一个灯一个灯的亮,如果在死循环里使用“delay_ms(50);”,那么不支持连按代码里的times要加1都需要过了50ms才行,这样显然行不通,我们只能从流水灯的代码去思考了。 其实一次死循环里不一定就要求灯实现跳变,可以等到过了很多次死循环再去执行灯的跳变的,所以我们在死循环里让变量x每次加1,死循环了300
[单片机]
基于AVR单片机的DDS信号源电路图
电路原理如下图所示,可分为四个部分:以IC1为核心的DDS;以IC2为核心的键盘、显示及控制电路;以IC3为核心的AGC电路;以IC4为核心的检波电路。 图 基于AVR单片机的DDS信号源电路图
[单片机]
基于AVR<font color='red'>单片机</font>的DDS信号源电路图
STC89C52单片机驱动CC1101无线模块的接收C语言程序
#include reg52.h #include intrins.h #defineINT8Uunsigned char #defineINT16Uunsigned int #define WRITE_BURST 0x40//连续写入 #define READ_SINGLE 0x80//读 #define READ_BURST 0xC0//连续读 #define BYTES_IN_RXFIFO 0x7F //接收缓冲区的有效字节数 #define CRC_OK 0x80 //CRC校验通过位标志 //************CC1100接口*************** sbit GDO0=P3^3;
[单片机]
NXP非接触式MCU用于德国家交通票务系统
恩智浦半导体近日宣布,VDV–Kernapplikations公司已选中恩智浦的安全非接触式微控制器芯片 – SmartMX以增强德国未来实施的电子交通票务方案。2012年之前,德国全国将要发售大约800万张非接触式卡,恩智浦将与卡片和嵌体制造商Cardag一起为这些卡片提供SmartMX芯片。该方案的目标是在全国所有交通运输网络上提供单一票务解决方案。 现在,德国全国的交通运输公司都将部署SmartMX驱动的电子票务平台。便捷且安全的非接触式票务平台一旦遍布德国各种不同公共旅行系统,必将大大提升乘客的整体旅行体验。 恩智浦的非接触式微控制器技术将集成到由Cardag开发和定制的智能卡中,该技术完全符合VDV-Kernappl
[单片机]
好玩的单片机——数码管原理(一)
一:数码管内部构造 数码管也称LED数码管,晶美、光电、不同行业人士对数码管的称呼不一样,其实都是同样的产品。 数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管; 按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极
[单片机]
好玩的<font color='red'>单片机</font>——数码管原理(一)
51单片机16X16点阵显示屏学习板基本原理
  1.功能      16×16点阵显示屏学习板如下图所示,LED显示屏各点亮度均匀、充足,可显示图形和文字,通过文字图像取模软件获得数据码,可以显示各类图形或文字。稳定、清晰、无串扰,图形或文字显示有静止、移入移出等显示方式。      2.基本原理      16×16点阵是用4个8×8点阵屏拼合而成,8X8点阵LED工作原理说明:8×8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置O电平,则相应的二极管就亮;因此要实现一根柱形的亮法。对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:      一根竖柱:对应的列置1,而行则采用扫描
[单片机]
51<font color='red'>单片机</font>16X16点阵显示屏学习板基本原理
51单片机上拉电阻多大
1、51单片机的p0口为了实现准3态,采用了oc输出,也就是集电极悬空输出,也有叫图腾柱输出的。这种电路结构,只有下拉能力,高电平输出没有电流,在高电平时表现为高阻态;加上上拉电阻,就会失去高阻态,变成 1、0 两态。 2、p0口上拉电阻的选择,应遵循基本的电路设计原则,不能盲目套用,要看后级情况而定: 例如,后级驱动的是1只npn三极管,这个三极管的放大倍数(β)=100倍,三极管的负载电流(ic)要求100ma,当电源为5v时: a、三极管的ib=ic/β=1ma; b、上拉电阻大约=r=5v/ib=5kω; c、为了使三极管注入ib后就迅速进入导通(开)状态,r应再小一些,如4k3; 3、由上面计算可见,三极管的负载大小、放
[单片机]
基于C8051单片机和FPGA实现导纳测量仪的系统设计
虚拟仪器的广泛应用,使得用户可以根据需求,设计自己的仪器系统。无源网络导纳测量仪即是虚拟仪器设计思想的一种具体运用,旨在实现对端口网络的导纳进行自动测量。测量仪是以C8051单片机为控制和处理核心,采用可编程逻辑器件EPF10K10,根据DDS原理产生信号源,将信号源连接到待测的网络上,对网络两端的电压和电流进行差分放大,使其输出电压尽可能达到ADC的最大输入电压,然后进行A/D采样,采样时,频率随信号频率而改变,一个周期内固定采32个点,用单片机的P1、P2直接接收数据,边采样边接收。对采样所得的电流、电压数据进行快速傅立叶变换(FFT),并分别求出其模值和相位,则导纳的模值为电流模值与电压模值之比,相位为电流与电压的相位之差。
[单片机]
基于C8051<font color='red'>单片机</font>和FPGA实现导纳测量仪的系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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