单片机ADC采样算法----一阶低通滤波

发布者:Lihua521最新更新时间:2020-04-01 来源: eefocus关键字:单片机  ADC  采样算法  一阶低通滤波 手机看文章 扫描二维码
随时随地手机看文章

关于低通滤波,先看一下百度百科上的定义。

算法实现的公式如下:


y(n) = q*x(n) + (1-q)*y(n-1)    

其中Y(n)为输出,x(n)为输入,y(n-1)为上一次输出值,其中q为滤波系数。取值范围为0--1.


也就是说若q=0.5时,这个公式代表的意思就是取本次采样值的50%,加上上一次采样值的50%,做为本次的采样结果。也就是说每次的采样结果都和上一次的采样结果相关。


看一下在单片机中C代码的实现


//参数:com 为采样的原始数值

//返回值:iData 经过一阶滤波后的采样值

unsigned int lowV( unsigned int com )

{

    static unsigned int iLastData;    //上一次值

    unsigned int iData;               //本次计算值

    float dPower = 0.1;               //滤波系数

    iData = ( com * dPower ) + ( 1 - dPower ) * iLastData; //计算

    iLastData = iData;                                     //存贮本次数据

    return iData;                                         //返回数据

}

 

//主函数

void main( void )

{

  while( 1 )

    {

        val1 = ReadVol_CH3() ;         //   读取AD采样值   

        val3 = lowV( val1 );           //   采样值经过一阶滤波算法

        printf("A%drn",val1);        //   打印采样值

        printf("B%drn",val3);        //   打印经过滤波算法后的采样值

    }

}


通过ADC采样输入电压,然后将采样值经过一阶滤波运算,通过串口分别打印采样值和经过一阶滤波运算后的值。


通过串口波形显示软件可以看到采样的结果为:

当滤波系数q=0.1时,本次采样数据占采样结果的10%,上一次采样数据占采样结果的90%,也就是说采样数据突变时对采样结果影响不大,采样的波形比较平滑。


由上面的波形也可以看出,蓝色波形为原始数据波形,波动范围比较大,橙色波形为经过一阶滤波算法后的波形,波形比较平稳。


将q值改为0.5时,看看采样情况。

可以看到当滤波系数增大到0.5时,本次采样数据和上次采样数据对结果的影响分别占50%。通过波形可以看到,经过滤波后的波形也出现了波动,但是波动范围相对于原始波形来说小了一点。


将q值继续增大,改为0.9时,看看采样情况。

通过波形可以看到将采样系数增大后,本次采样数据对采样结果影响占到了90%,经过一阶滤波后的波形基本和原始波形保持了同步,实时性比较好,但是稳定性会差一点。


通过不同滤波系数的对比发现:


滤波系数越小,滤波结果越平稳,但是灵敏度越低;


滤波系数越大,灵敏度越高,但是滤波结果越不稳定。


在实际应用中根据不同的需求,选择合适的滤波系数,以满足系统要求。

关键字:单片机  ADC  采样算法  一阶低通滤波 引用地址:单片机ADC采样算法----一阶低通滤波

上一篇:单片机ADC采样算法----卡尔曼滤波
下一篇:单片机ADC采样算法----有效值采样法

推荐阅读最新更新时间:2024-11-09 20:56

三星S3C/S3P/S3F9XXX系列单片机实现查表操作的一个示例
三星S3C/S3P/S3F9XXX系列 单片机 实现查表操作的一个示例 ;实现查表操作须首先定义表地址,有两种定义方式 ;方式一常用于参数表定义: ORG 0040H CODE_TABLE: DB 01H DB 02H DB 03H ;方式二常用于系列子程序地址表定义: ORG 0050H DISPLAY_TABLE: VECTOR $,DISPLAY_TR ;DISPLAY_TR是一个子程序名称,以下同 VECTOR $,DISPLAY_SET ;注意这里每个地址均占用一个字(两个
[单片机]
51单片机分外功用寄存器操作进程
  51单片机特有的程序语法以及 Keil 软件的根柢操作进程,请咱们必定要有耐性。   咱们首要是用 C 言语来对单片机编程,而有的单片机有那么几条很分外的特有的编程句子,51 单片机就有,先介绍 2 条。   榜首条句子是:sfr P0 = 0x80;   sfr 这个要害字,是 51 单片机特有的,他的作用是界说一个单片机分外功用寄存器(special function register)。51 单片机内部有许多个小模块,每个模块寓居在具有仅有房间号的房间内,一同每个模块都有 8 个操控开关。P0 便是一个功用模块,就住在了 0x80 这个房间里,咱们便是经过设置 P0 内部这个模块的 8 个开关,来让单片机的 P0 这
[单片机]
51<font color='red'>单片机</font>分外功用寄存器操作进程
51单片机是如何产生串口中断的
首先,你要用软件允许中断, 即C语言中EA = 1; 允许总中断ES = 1; //允许串口中断汇编中可用 SETB EA ;允许总中断 SETB ES ;允许串口中断 当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。 当然,单片机发送完一帧数据,TI也会置1,同样会产生中断! 一般我们在发送数据时要关中断,因为一般你不用在发送时不用处理数据; 接收数据时要开中断,以便你在中断服务程序中将接收到的数据进行存储并处理。 补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在数据缓
[单片机]
基于52单片机控制编码器显示程序
#include reg52.h #define uchar unsigned char #define uint unsigned int #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6; sbit DIR=P1^0; sbit STEP=P1^1; sbit K1=P3^1; sbit K2=P3^0; typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; uchar code digit ={ 01234
[单片机]
单片机玩PID控制—从理想PID控制至先进PID控制_11
3.4PID参数自整定 工程控制中,PID参数整定是一桩耗时又费力的活,即使你富有经验,那也不容易搞定,如果能自动整定PID参数,显然是好事一件,可以极大降低工程人员的劳动强度,下面介绍两种自动整定PID参数方法。 3.4.1继电反馈法PID自整定 继电反馈法PID自整定原理如图1所示,图中的继电特性环节,迫使系统振荡,根据振荡的频率及继电环节的增益,可以计算获得PID参数,如果继电环节有滞环,可以一定程度上克服干扰的影响,总的来说,继电反馈法是一种简单而靠谱的自动整定PID方法,整定效果如图2所示,从图中可以看出控制效果不赖。
[单片机]
用<font color='red'>单片机</font>玩PID控制—从理想PID控制至先进PID控制_11
单片机应用系统的开发流程
我们学习单片机的目的就是为了进行嵌入式系统的开发,学好单片机首先要有一个整体认识,下面将简要介绍一下单片机应用系统的开发流程,如图1-22所示。 图1-22 单片机系统开发流程 (1)明确任务 分析和了解项目的总体要求,并综合考虑系统使用环境、可靠性要求、可维护性及产品的成本等因素,制定出可行的性能指标。 (2)划分软、硬件功能 单片机系统由软件和硬件两部分组成。在应用系统中,有些功能既可由硬件来实现,也可以用软件来完成。硬件的使用可以提高系统的实时性和可靠性;使用软件实现,可以降低系统成本,简化硬件结构。因此在总体考虑时,必须综合分析以上因素,合理地制定硬件和软件任务的比例。 (3)确定希望使用的单片机及其他关键部件 根
[单片机]
<font color='red'>单片机</font>应用系统的开发流程
用51单片机来测试成分的含铁量
仪器的原理是借助电磁感应,为线圈通电,不同含铁量的成分会使线圈产生不同频率的震荡,由此来测试成分的含铁量。我做的部分也非常简单,使用51单片机操作12864做显示,矩阵键盘控制系统的行为,1302存储时间,可有可无,24c02用来存储预设参数,用于方便计算,仅此而已。 接到任务后,准备一晚上把它弄完。这也是上大学以来首次通宵做东西(其实后半夜基本都在发呆),第一天晚上进展还算比较快,每个基本模块的基本操作都能进行了。然后就可以回家轻松过五一啦。其实艰巨的任务还在后面。碰到的第一个问题就做一个什么样的操作界面比较靠谱。由于没有gui支持,做什么玩意全都需要自己安排。原仪器用的是数码管,自然参考价值不大。起初就试着按照操作步骤来
[单片机]
单片机I2C寻址模式
上一节介绍的是 I2C 每一位信号的时序流程,而 I2C 通信在字节级的传输中,也有固定的时序要求。I2C 通信的起始信号(Start)后,首先要发送一个从机的地址,这个地址一共有 7位,紧跟着的第 8 位是数据方向位(R/W),“0”表示接下来要发送数据(写),‘“1”表示接下来是请求数据(读)。 我们知道,打电话的时候,当拨通电话,接听方捡起电话肯定要回一个“喂”,这就是告诉拨电话的人,这边有人了。同理,这个第九位 ACK 实际上起到的就是这样一个作用。当我们发送完了这 7 位地址和 1 位方向后,如果发送的这个地址确实存在,那么这个地址的器件应该回应一个 ACK(拉低 SDA 即输出“0”),如果不存在,就没“人”回应 AC
[单片机]
<font color='red'>单片机</font>I2C寻址模式
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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