单片机10种软件滤波程序

发布者:JoyfulExplorer最新更新时间:2015-09-23 来源: eefocus关键字:单片机  软件滤波 手机看文章 扫描二维码
随时随地手机看文章
假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();

1、限副滤波

#define A 10

char value;

char filter()
{
    char   new_value;
    new_value = get_ad();
    if ( ( new_value - value> A ) || ( value - new_value> A )
       return value;
    return new_value;
         
}

2、中位值滤波法

#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     {
       for (i=0;i        {
          if ( 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];
    

3、算术平均滤波法


#define N 12

char filter()
{
    int   sum = 0;
    for ( count=0;count     {
       sum + = get_ad();
       delay();
    }
    return (char)(sum/N);
}

4、递推平均滤波法(又称滑动平均滤波法)

#define N 12

char value_buf[N];
char i=0;

char filter()
{
    char count;
    int   sum=0;
    value_buf[i++] = get_ad();
    if ( i == N )    i = 0;
    for ( count=0;count        sum = value_buf[count];
    return (char)(sum/N);
}

5、中位值平均滤波法(又称防脉冲干扰平均滤波法)

#define N 12

char filter()
{
    char count,i,j;
    char value_buf[N];
    int   sum=0;
    for   (count=0;count     {
       value_buf[count] = get_ad();
       delay();
    }
    for (j=0;j     {
       for (i=0;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[count];
    return (char)(sum/(N-2));
}

6、限幅平均滤波法
  
略 参考子程序1、3

7、一阶滞后滤波法


#define a 50

char value;

char filter()
{
    char   new_value;
    new_value = get_ad();
    return (100-a)*value + a*new_value;
}

8、加权递推平均滤波法


#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();
       delay();
    }
    for (count=0,count        sum += value_buf[count]*coe[count];
    return (char)(sum/sum_coe);
}

9、消抖滤波法

#define N 12

char filter()
{
    char count=0;
    char new_value;
    new_value = get_ad();
    while (value !=new_value);
    {
       count++;
       if (count>=N)    return new_value;
        delay();
       new_value = get_ad();
    }
    return value;    
}

10、限幅消抖滤波法

略 参考子程序1、9

11、IIR滤波例子

int   BandpassFilter4(int InputAD4)
{
     int   ReturnValue;
     int   ii;
     RESLO=0;
     RESHI=0;
     MACS=*PdelIn;
     OP2=1068; //FilterCoeff4[4];
     MACS=*(PdelIn+1);
     OP2=8;     //FilterCoeff4[3];
     MACS=*(PdelIn+2);
     OP2=-2001;//FilterCoeff4[2];
     MACS=*(PdelIn+3);
     OP2=8;     //FilterCoeff4[1];
     MACS=InputAD4;
     OP2=1068; //FilterCoeff4[0];
     MACS=*PdelOu;
     OP2=-7190;//FilterCoeff4[8];
     MACS=*(PdelOu+1);
     OP2=-1973; //FilterCoeff4[7];
     MACS=*(PdelOu+2);
     OP2=-19578;//FilterCoeff4[6];
     MACS=*(PdelOu+3);
     OP2=-3047; //FilterCoeff4[5];
     *p=RESLO;
     *(p+1)=RESHI;
     mytestmul<<=2;
     ReturnValue=*(p+1);
     for   (ii=0;ii<3;ii++)
     {
      DelayInput[ii]=DelayInput[ii+1];
      DelayOutput[ii]=DelayOutput[ii+1];
      }
      DelayInput[3]=InputAD4;
      DelayOutput[3]=ReturnValue; 
      

     return ReturnValue;  
}
关键字:单片机  软件滤波 引用地址:单片机10种软件滤波程序

上一篇:中断多任务+状态机 单片机软件结构设计
下一篇:74HC573锁存器用法

推荐阅读最新更新时间:2024-03-16 14:32

STM8单片机串口发送引脚和接收引脚分开使用
在使用STM8S003单片机时,需要用到ADC采样功能,STM8S003总共有5个ADC采样口,但是其中两个采样口是和串口复用的,如果当ADC口用,就不能用串口,如果当串口用,就不能用ADC口。 通过芯片管脚的原理图可以看到PD5口可以当作模拟采样第5通道使用,也可以用当做串口发送口使用。PD6口可以当做模拟采样第6通道使用,也可以当做串口接收口使用。 在项目中需要将串口当做AD口使用,但是也需要串口向外发送监控数据。AD功能和串口功能需要同时使用,于是想到,串口只用到了发送引脚,那么能不能将串口的接收引脚当做AD功能用。这样PD5口作为串口发送引脚使用,PD6口作为模拟采样第6通道使用。 先写一个简单的测试程序测试一
[单片机]
STM8<font color='red'>单片机</font>串口发送引脚和接收引脚分开使用
51单片机学习笔记———4.两个按键控制LED小灯
两个按键的控制LED的程序: /* * @Author: 王云龙 * @Date: 2020-02-23 12:48:51 * @Last Modified by: 王云龙 * @Last Modified time: 2020-02-23 15:37:24 */ #include reg52.h #define LED P0;//设置LED引脚 sbit KEY1 = P3^4;//设置按键1引脚 sbit KEY2 = P3^5;//设置按键2引脚 void LightLed1();//点亮方式1 void LightLed2();//点亮方式2 void delay(unsigned int n);//n
[单片机]
恩智浦交付基于CortexTM-M3的微控制器
恩智浦半导体(NXP Semiconductors)近日确认,根据嵌入式微处理器基准协会(EEMBC)的测试结果,LPC1700系列为业界性能最高的Cortex-M3微控制器。EEMBC测试结果显示,以相同时钟速度运行时,LPC1700执行应用程序代码的速度比其它主要Cortex-M3竞争产品平均快35%。当LPC1700以较高时钟速度运行时,恩智浦的性能优势愈加显著。LPC1700已通过EEMBC 72,100和120 MHz认证。速度和效能的提高主要归功于该微控制器的智能架构、灵活的直接存储访问(DMA)和市场最佳闪存的使用。LPC1700系列旨在同时操作以太网、USB On-The-Go/Host/Device和CAN
[嵌入式]
一文详解80C51单片机的中断系统
中断系统是计算机或者单片机的主要功能部件。 有了中断系统,便可以使微处理器具备对外部的异步事件进行处理的能力。 当微处理器的CPU正在执行程序的过程中,如果外部硬件或者内部组件有紧急的请求(如通信,断点,发生重大故障等),中断系统就可以将当前的程序暂停,优先处理这些中断请求。 这种处理方式,对整个系统的稳定性,健壮性至关重要,同时也能大大提高处理器的效率,使得系统的应用更加灵活多变。 中断的概念 中断是指单片机在执行程序的过程中,当出现异常情况或特殊请求时,单片机停止当前程序的运行,转向对这些异常情况或特殊请求进行处理,当处理结束后再返回原程序的间断处,继续执行原程序,这一现象称为中断。 中断是单片机实时处理内部或外部事件的一
[单片机]
一文详解80C51<font color='red'>单片机</font>的中断系统
单片机+VB上位机温湿度检测制作
单片机源程序如下: #include reg52.h // 头文件包含 #include intrins.h #define uchar unsigned char // 以后unsigned char就可以用uchar代替 #define uint unsigned int // 以后unsigned int 就可以用uint 代替 sbit Buzzer_P = P1^0; // 蜂鸣器 sbit DHT11_P = P1^1; // 温湿度传感器DHT11数据接入 sbit LcdRs_P = P2^
[单片机]
<font color='red'>单片机</font>+VB上位机温湿度检测制作
8051单片机教程第二十二课:串行口应用编程实例
1.串口方式0应用编程8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就可以扩展一个并行口。 例:用8051串行口外接CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,可以靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存
[单片机]
8051<font color='red'>单片机</font>教程第二十二课:串行口应用编程实例
51单片机总结—上拉电阻
上拉电阻的作用: (1) 用于为OC和OD门电路,提供驱动能力。 以OC(集电极开路)电路为例: 例如,达林顿管(其实就是复合三级管)集成块ULN2003. 内部一路的电路如图,就是一个集电极开路电路。 如果不加上拉电阻是无法高电平驱动其他器件的。因为当三极管截至市没有电流流通的路径,更谈不上驱动了。这个跟单片机P0口加上拉电阻的原理一样。 (2)提高高电平电位: 单片机P1口外接4×4矩阵键盘。另外复用P1.0~P1.3外接ULN2003控制驱动步进电机。 实验中遇到的问题:当接入ULN2003时键盘无法工作,去掉ULN2003后键盘工作正常。ULN2003工作正常。(注,两个部分不同时工作) 问
[单片机]
51<font color='red'>单片机</font>总结—上拉电阻
51单片机开发系列五_矩阵按键扫描
在嵌入式系统中,用的最多的输入设备就是按键,用户的应用需求可通过相应按键传递到系统软件中,软件转而完成用户请求,实现简单的人机交互。笔者此处就矩阵按键的实现作一个简单的介绍。 1. 按键输入概述 按键是一种常开型按钮开关,平时键的二个触点处于断开状态,按下键时它们才闭合。按键控制电路就是用来实时监视按键,当有键接下时,电路监控中的输入引脚电平发生变化,检测到这种变化后,控制电路进行按键扫描,定位按键的位置,并把相关的按键信息反馈回上一层应用中。常见的按键输入设计有独立式按键,矩阵式按键。独立式按键每个键占用一个IO口,电路配置灵活,软件简单,但按键较多时,IO口浪费大。矩阵式按键适用于按键数量较多的场合,由行线和列线组成,按键位
[单片机]
51<font color='red'>单片机</font>开发系列五_矩阵按键扫描
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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