基于数字滤波的单片机仿真和C语言开发.docx

上传人:b****6 文档编号:6085739 上传时间:2023-01-03 格式:DOCX 页数:18 大小:503.69KB
下载 相关 举报
基于数字滤波的单片机仿真和C语言开发.docx_第1页
第1页 / 共18页
基于数字滤波的单片机仿真和C语言开发.docx_第2页
第2页 / 共18页
基于数字滤波的单片机仿真和C语言开发.docx_第3页
第3页 / 共18页
基于数字滤波的单片机仿真和C语言开发.docx_第4页
第4页 / 共18页
基于数字滤波的单片机仿真和C语言开发.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

基于数字滤波的单片机仿真和C语言开发.docx

《基于数字滤波的单片机仿真和C语言开发.docx》由会员分享,可在线阅读,更多相关《基于数字滤波的单片机仿真和C语言开发.docx(18页珍藏版)》请在冰豆网上搜索。

基于数字滤波的单片机仿真和C语言开发.docx

基于数字滤波的单片机仿真和C语言开发

课程设计任务书

学生姓名:

周国阳专业班级:

电信1001

指导教师:

阮军工作单位:

信息工程学院

题目:

基于数字滤波的单片机仿真和C语言开发

初始条件:

本课程设计,要求用使用Proteus仿真软件进行系统设计与仿真。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1、课程设计工作量:

1周内完成对系统的设计、仿真。

2、技术要求:

1)设计一种数字滤波器,比如:

中值滤波算法、算术平均滤波算法、加权平均滤波算法、滑动平均滤波算法等,自行设计输入信号的形式(了解各种GENERATORS的使用)。

要求进行电路仿真实验,并使用C语言进行程序的开发。

2)要求学生主动思考,自主发挥,实现系统的特色功能。

3、查阅至少5篇参考文献。

按《武汉理工大学课程设计工作规范》要求撰写设计报告书。

全文用A4纸打印,图纸应符合绘图规范。

提交报告的主要内容:

(使用Proteus7.5sp3)

1)题目

2)仿真所完成的主要功能和特色简介——摘要(特别是自己扩展的功能,根据特色功能评优)

3)Proteus仿真的基本流程

4)所使用芯片以及引脚功能简介(需要提供对应芯片DataSheet的下载链接)

5)设计方案与工作原理,给出仿真电路图

6)实验记录与结果分析

时间安排:

1)第1天,查阅相关资料,学习设计原理。

2)第2~3天,方案选择和电路设计仿真。

3)第4天,设计说明书撰写。

4)第5天,上交报告,同时进行答辩。

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

目录

摘要I

AbstractII

1.开发环境1

1.1仿真工具1

1.2编程工具1

2硬件模块2

2.1MCS-51单片机2

2.2AD转换器2

2.3DA转换器2

3.数字滤波器的算法3

3.1中值滤波器设计3

3.2加权平均滤波3

3.3限幅滤波4

3.4滑动平均滤波4

4.系统的设计5

4.1系统框图6

5.系统电路图7

6.仿真结果9

7.系统分析11

8.总结12

参考文献13

附录一程序代码14

摘要

本次项目是要我们利用51单片机设计出几种数字滤波器。

随着现在对滤波器的要求越来越高,模拟滤波器已经不能满足工业的要求。

在这种情况下,数字滤波器得到了很大的发展。

数字滤波器的实现过程的实现过程是把输入的模拟信号数字化,也就是由采样器对输入的模拟信号进行周期性的采样,并对每个样本进行量化和编码,即模数转换。

从ADC输出的数字信号送入到数字信号处理器进行处理变化,处理器输出的数字信号再通过数模转换为模拟信号,这个过程要用到DAC来转换实现模拟信号的输出。

关键字:

51单片机;数字滤波器;ADC;DAC

 

Abstract

Theprojectisforustotakeadvantageof51singledesignseveraldigitalfilters.Withthefilternowincreasinglydemanding,analogfilterscannotmeettheindustryrequirements.Inthiscase,thedigitalfilterhasbeengreatlydeveloped.Realizationoftheprocessofrealizationofadigitalfiltertotheanaloginputsignalisdigitized,thatissampledbytheanaloginputsignalisperiodicallysampledandeachsampleisquantizedandcoded,i.e.,analogtodigitalconversion.ADCoutputdigitalsignalisfedtothedigitalsignalprocessorforprocessingthechange,andthenoutputsthedigitalsignalprocessorisconvertedtoanalogbydigitaltoanalogsignals,tousethisprocesstoconverttheDACoutputanalogsignal.

Keywords:

51single;digitalfilter;ADC;DAC

 

1.开发环境

1.1仿真工具

我们这次在进行硬件仿真时运用的proteus工具,它具有以下功能:

(1)能实现单片机仿真和SPICE电路仿真的结合。

具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真等功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。

(2)支持主流单片机系统的仿真。

目前支持的单片机类型有68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。

(3)提供软件调试功能。

在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如KeilC51uVision2等软件。

(4)具有强大的原理图绘制功能。

1.2编程工具

Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。

掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

 

2硬件模块

2.1MCS-51单片机

51单片机内包含下列几个部件:

一个8位CPU;

一个片内振荡器及时钟电路;

4KBROM程序存储器;

128BRAM数据存储器;

可寻址64KB外部数据存储器和64KB外部程序存储器空间的控制电路;

32条可编程的I/O线(4个8位并行I/O端口);

两个16位的定时/计数器;

5个中断源、两个优先级嵌套中断结构。

2.2AD转换器

本次课程设计仿真使用的是ADC0808,ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。

其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

ADC0808是ADC0809的简化版本,功能基本相同。

一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。

ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。

2.3DA转换器

DAC0832引脚功能电路应用原理图DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。

D/A转换结果采用电流形式输出。

若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现。

运放的反馈电阻可通过RFB端引用片内固有电阻,也可外接。

DAC0832逻辑输入满足TTL电平,可直接与TTL电路或微机电路连接。

3.数字滤波器的算法

3.1中值滤波器设计

中值滤波是先对某一参数连续采样N次(一般N取奇数),然后把N次采样值按从小到大排列,取中间值为本次采样值。

该滤波方法实际上是一种排序方法,我在此采用的是冒泡法排序。

由于在冒泡法排序中,每出现一次前者数据大于后者数据,就要进行二者数据的交换。

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。

方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。

二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)},其中,f(x,y),g(x,y)分别为原始图像和处理后图像。

W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。

中值滤波能有效地克服偶然因素引起的波动或采样器不稳定引起的误码等脉冲干扰。

对温度、液位等缓慢变化的被测参数采用此算法能收到良好的滤波效果,但对于流量、压力等快速变化的数据,不宜采用中位值滤波。

3.2加权平均滤波

在算术平均滤波和移动平均滤波中,N次采样值在输出结果中的权重是均等的,取1/N。

用这样的滤波算法,对于时变信号会引入滞后,N值越大,滞后越严重。

为了增加新采样数据在移动平均中的权重,以提高系统对当前采样值中所受干扰的灵敏度,可采用加权平均滤波,它是移动平均滤波算法的改进。

加权平均滤波是对连续N次采样值分别乘上不同的加权系统之后再求累加和,加权系统一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的辨识。

各个加权系统均为小于1的小数,且满足总和等于1的约束条件。

这样,加权运算之后的累加和即为有效采样值。

为方便计算,可取各加权系数均为整数,且总和为256,加权运算后的累加和除以256,即舍去低字节后便是有效采样值。

3.3限幅滤波

限幅滤波的基本原理是把两次相邻时刻(n和n-1)的采样值Yn和Yn-1相减,求出其差值,以绝对值表示,然后将这个差值与两次采样允许的最大偏差值ΔY比较,如果两次采样值的差值超过了允许的最大偏差值ΔY,则认为发生了随机干扰,并认为最后一次采样值Yn非法,应予剔除。

剔除Yn后,可用Yn-1代替Yn;若未超过允许的最大偏差值范围,则认为本次采样值有效。

可用如下公式表示:

|Yn-Yn-1|≤ΔY;则Yn有效|Yn-Yn-1|>ΔY;则Yn-1有效。

3.4滑动平均滤波

把连续取N个采样值看成一个队列,队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:

流量,N=12;压力:

N=4;液面,N=4~12;温度,N=1~4。

对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统。

 

4.系统的设计

在我们这个项目中要求我们选取其中的一种数字滤波器来设计,但在做的过程中我们发现这些数字滤波器在我们学习MATLAB时很多都是接触过的,它们的算法都可以找到。

所以我在做项目时把四种方式都加上去了,我们可以根据实际的波形灵活选择滤波器的方式。

在一开始输入的波形是模拟波形,我们要把它转换成数字波形,这样我们才能用数字滤波的方法对它进行滤波,所以我们用到了AD转换器。

当使用算法进行滤波后,现在的波是数字方式存在,我们要输出它,要以模拟波形的方式输出,所以我们用到了DA转换器。

在选择波形的时候,在这里我们选择了在键盘。

键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。

式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

 

4.1系统框图

AD采样量化

图1程序框图

 

5.系统电路图

图2系统电路图

我们在做个项目时在控制部分我们用的是51系列单片机——AT89C51,利用这个单片机进行编程,实现对输入信号的滤波。

我使用了P0口作为接受AD转换的结果的端口,而P1口则输出数据到DA转换器。

另外还利用了P2作为控制端口,P2.0-P2.2用来控制AD转换器,而P2.3-P2.6外接四个开关,用来实现滤波方式的选择。

在采集波形电路部分,ADC0809是带地址锁存的模数转换器件,ADDA、ADDB、ADDC为模拟通道选择,编码为000~111分别选中IN0~IN7。

ALE为地址锁存信号,其上升沿锁存ADDA、ADDB、ADDC的信号,译码后控制模拟开关,接通八路模拟输入中相应的一路。

CLK为输入时钟,为AD转换器提供转换的时钟信号,典型工作频率为640KHz。

START为AD转换启动信号,正脉冲启动ADDA~ADDC选中的一路模拟信号开始转换。

OE为输出允许信号,高电平时候打开三态输出缓存器,是转换后的数字量从D0~D7输出。

EOC为转换结束信号,启动转换后EOC变为低电平,转换完成后EOC编程高电平。

在数模转换电路中,我用了DA0832来进行数模转换。

DA0832有三种数模转换方法,直通方式、单缓冲方式、双缓冲方式,因为单片机输出后可以直接进行数模转换,所以这里我采用了不需要单片机控制的最为简单的直通方式,但是DA0832若用于直通方式。

若用于直通方式下,则GND均接地,而VCC和ILE则接正电源。

VREF是参考电源。

IOUT1、IOUT2是两个输出端。

DA0832输出的是电流,要利用运算放大器转换成电压信号。

在电路的供电部分,由于此次系统的芯片工作电压为+5v,所以用常用的三端稳压器LM317和LM337构成的电源系统供电,其中ADC0809要提供一个准确的参考电源才能正常的工作,而LM317正好能够达到要求。

 

6.仿真结果

限幅滤波波形图

 

中值滤波波形图

 

加权平均滤波波形图

滑动平均滤波波形图

 

7.系统分析

通过仿真我们发现,系统中所设计出的四种滤波器滤波方法基本上都能够得到了实现。

限幅滤波的效果是和A值有关的,一般情况下,A值越小,则代表允许的噪声要越小,限幅滤波很适用于使幅值突变的噪声。

中值滤波由于要求中值,所用到的排序算法会大大消耗时间,因此延时比较严重,但是总的来说选择排序比冒泡排序的延时情况要好。

加权递推平均算法和上面一样,因为会求平均值,因此也会有时候产生中间值,但是如果把当前值得权值设的很大,而越久远之前的权值设的越小,则可明显改善此问题,另外由于加权递推平均滤波中用到的乘法,因此会有一定的延时。

 

8.总结

 

参考文献

[1].李全利,《单片机原理及接口技术》,北京:

高等教育出版社,2004[2].张毅刚,《单片机原理及应用》,北京:

高等教育出版社,2007

[3].徐仁贵,《微型计算机接口技术及应用》,北京:

机械工业出版社,2007

[4].诸昌钤,《单片机原理》,成都:

电子科技大学出版社,2004

[5].梅开乡,《数字逻辑电路》,北京:

电子工业出版社,2003

 

附录一程序代码

#include

#defineucharunsignedchar

#defineA0.005

#defineN11

sbitOE=P2^0;

sbitSTART=P2^1;

sbitEOC=P2^2;

sbitkey1=P1^0;

sbitkey2=P1^1;

sbitkey3=P1^6;

sbitkey4=P1^7;

uchara,z1,z2,z3,z4;

ucharbuf[N]={0};

voidchange()

{

inti;

for(i=0;i

buf[i]=buf[i+1];

buf[N-1]=a;

}

ucharget_data(n)

{

change();

returnbuf[n];

}

ucharKeyscan(void)//判断按键

{

P1=0x3f;

if(key1==0)//行扫描

z1=1,z2=0;

if(key2==0)

z2=1,z1=0;

if(z1==1)//列扫描

{P1=0xfc;

if(key4==0)

z3=1;

if(key3==0)

z3=2;

}

if(z2==1)

{P1=0xfc;

if(key4==0)

z3=3;

if(key3==0)

z3=4;

}

returnz3;

}

ucharfilter1()//中值滤波

{

ucharvalue_buff[N],temp;

intcount,j,k;

for(count=0;count

value_buff[count]=get_data(count);

for(j=0;j

{k=j;

for(j=j+1;j

if(value_buff[j]

{temp=value_buff[k];

value_buff[k]=value_buff[j];

value_buff[j]=temp;

}}

returnvalue_buff[(N-1)/2];

}

ucharfilter2()//限幅滤波

{ucharnew_value,value;

value=get_data(N-2);

new_value=get_data(N-1);

if((new_value-value>A)||(value-new_value>A))

returnvalue;

returnnew_value;

}

ucharfilter3()//滑动平均滤波

{

ucharvalue_buff[N];

inti=0;

intcount;

intsum=0;

value_buff[i++]=get_data(count);

if(i==N)

i=0;

for(count=0;count

sum+=value_buff[count];

return(uchar)(sum/N);

}

ucharfilter4()//加权平均滤波

{

ucharcodecoe[N]={1,1,1,2,2,2,3,3,3,3,1100};

ucharcodesum_coe=1+1+1+2+2+2+3+3+3+3+1100;

ucharcount;

ucharvalue_buf[N];

intsum=0;

for(count=0;count

{

value_buf[count]=get_data(count);

}

for(count=0;count

sum+=value_buf[count]*coe[count];

return(uchar)(sum/sum_coe);}

ucharADC0808_READ(void)

{

ucharres;

START=0;

START=1;

START=0;

while(EOC==0);

OE=1;

a=P0;

z4=Keyscan();

if(z4==1)

res=filter1();

if(z4==2)

res=filter2();

if(z4==3)

res=filter3();

if(z4==4)

res=filter4();

returnres;

}

voidmain()

{

z3=1;

while

(1)

{

P3=ADC0808_READ();

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1