基于单片机的波形发生器Word下载.docx
《基于单片机的波形发生器Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的波形发生器Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
AD9850;
AT89C52
引言
随着电子测量以及很多部门对各种信号发生器的广泛需要以及电子技术的快速发展,促使信号发生器性能提高,种类增多。
尤其随着70年代微处理器的崭露头角,更促使信号发生器向着智能化、自动化方向发展。
现在,微处理器运用在许多信号发生器上,因而这些信号发生器具备了自校、自检、诊断自动故障和形成自动波形和修正等功能,能够和控制计算机以及其他的测量仪器方便的一起构成自动测试系统。
当前信号发生器总的发展是向着低功耗、高频率精度、宽频率覆盖、多功能、智能化和自动化方向发展。
在工程教育,科学研究及生产实践中,如教学实验、工业过程控制、材料试验、动态分析、生物医学、机械振动试验等领域,信号发生器常常会有用武之地。
而在我们一些科学研究中,以及日常生活中,方波和正弦波、矩形波信号是常用的基本测试信号。
比如在电视机、示波器等仪器中,为了利用荧光屏显示图像,让电子能够按照一定得规律运动,常用到方波产生器作为时基电路。
信号发生器作为一种通用的电子设备,在科研、测控、通讯生产等领域都得到了非常广泛的运用。
但市面上能看到的信号发生器在带宽、波形种类、频率精度及程控方面都已经不能够满足许多方面实际应用的各种要求。
加之各类功能的半导体集成芯片的迅速发展,使我们研制一种宽频带、功耗低,能产生多种波形并具有程控等低频的信号发生器成为迫切的需求。
本文主要介绍采用直接数字频率合成的正弦波信号源发生器的设计与功能实现,本单片机课设采用AT89C52为核心器件,采用AD9850转换器实现将数字信号转换为正弦波信号,并且在液晶显示板上面显示通过4*4的16位键盘写入的正弦波数字信号的频率,本次课设由于采用数字频率合成的方法,有着操作简单的特点。
可通过运用直接数字频率合成的技术实现调节频率与步进的功能,本课程通过将预先编写好的软件程序写入单片机,然后该单片机在程序的作用下就可以完成我们预先设入的功能。
1目的与要求
1.1设计目的
本次课程设计的目的是使学生进一步深入理解单片机的结构、工作原理和应用技术,提高单片机控制系统设计、研发的能力;
根据老师提供的课设题目,运用以前学到的单片机知识来设计一个正弦波信号源发生器,使其具备信号源的一些基本要求,完成正弦波的输出,本次课设不仅考察了学生对书本知识的理解,也进一步考察了学生的实际动手能力,培养学生一定的自学能力和独立分析问题、解决问题的能力,要求学生能通过独立思考、查阅工具书、参考文献,提出自己的设计方案,找出设计中遇到问题的解决途径。
1.2设计要求
要求一:
可通过4*4键盘完成1-20Mhz频率的正弦波输出。
要求二:
要通过显示屏显示通过键盘设定的频率。
要求三:
可以实现频率1000HZ步进。
2方案讨论与选择
根据题目的要求,有如下方案可供选择:
方案一:
直接模拟频率合成技术
相干合成方法是用一个晶体参考频率源,然后经过分频、混频和倍频来得到各种频率信号,输出频率的稳定度和精度与参考频率相同;
非相干合成方法是用多个晶体参考频率源,然后把这些参考频率信号经过加减乘除来得到各种频率信号。
直接模拟频率合成技术简单易行、频率转换时间短、相位噪音低,但因采用了大量的分频、混频、倍频和滤波等模拟元件,使合成器的体积大、易产生误差分量、元件的非线性难以得到抑制。
因此我们放弃这一方案。
方案二:
基于锁相环(PLL)的频率合成技术
锁相环主要由鉴相器、低通滤波器和压控振荡器组成;
鉴相器通过比较压控振荡器的输出信号和参考信号而产生相位控制信号,再经过低通滤波器后就直接去控制压控振荡器的输出,然后采用频率选择开关通过改变分频比来控制压控振荡器的输出信号频率。
若在锁相环中插入数字分频器和数字鉴相器,即成为数字锁相环;
数字锁相频率合成技术是目前的主流技术。
因为锁相环相当于窄带跟踪滤波器,所以PLL频率合成技术能够很好选择频率、抑制误差分量和大量使用滤波器,有利于集成化,而且频率的长期和短期稳定性都很好。
但是PLL有惰性,频率分辨率和频率转换时间相互矛盾;
频率转换时间较长;
压控振荡器引起的噪音也较大。
方案三:
DDS(直接数字合成)技术
采用数字化技术,通过控制相位的变化速度来直接产生各种频率的信号。
在带宽、频率分辨率、频率转换时间、相位连续性(相位变化连续)、调制输出(对输出信号易实现多种调制)和集成化等方面,都远远超过传统的频率合成技术。
但是DDS技术把幅度和相位信息也都用数字量表示,故将会产生量化精度和量化噪音,从而造成输出信号的幅度失真和相位失真,使得DDS的输出信号误差较大(误差频率多);
同时DDS的输出信号频带有限(为了有效分开输出频率和镜像频率,最高频率应该<
0.5fs,更高的fs要求器件的工作频率更高),这是限制DDS技术发展的主要问题之一。
然而,由于DDS是全数字化结构,易于集成、功耗低、体积小、重量轻、可靠性高、易于程控、使用灵活,性价比很高,故广为采用。
综合考虑,我们选择方案三。
3设计原理
本课设通过4*4按键的将正弦波的频率的大小输入进去,经单片机P3口对数据进行读取,然后在时钟控制(本课设采用12M晶振)和写入单片机的程序的前提下进行工作,利用单片机将扫描到的信号送到1602液晶显示屏和AD9850,并在显示屏上显示输入的信息也就是我们要输出的正弦信号的频率,同时在AD9850的工作下将输入的数字信号转化为正弦波信号并且输出。
3.1总设计框图
图3.1总流程图
3.2AD9850工作框图
如图为AD9850的流程图,这里有AD9850的工作方法以及芯片是如何将输入的控制信号转如何换成正弦波并进行输出的。
(注明:
由于本课设要求的是设计正弦波信号发生器,所以只用到了AD9850的正弦波输出功能。
)
图3.2AD9850工作流程图
3.3AT89C52工作框图
图3.3AT89C52工作流程图
3.4具体工作原理
当接入电源时AT89C52单片机就开始对4*4按键进行扫描,先逐行,再逐列,当有按键输入时,单片机将输入的信号通过P3口进行读取,然后通过P1口将数据送到LCD液晶显示屏上面显示,同时单片机将扫到的数据通过单片机的P0并行口送到AD9850,由于AD9850可以用8位并行口或串行口直接输入频率,故将AT89C52单片机的P0口与AD9850的D0~D7数据写入口相连,考虑到AT89C52可能无法驱动AD9850工作,所以在单片机与AD9850之间加入了阻值为10K的排阻,便于AD9850的驱动,AD9850可以产生频谱纯净、频率和相位都可编程控制的模拟正弦波输出,AT89C52何时将单片机扫描到的数据读取到P3.0~P3.7,这些都是在写入到单片机里面的程序里面设置好的。
本课设在编程时由于没有编写输出方波的程序,因此本课设单片机信号发生器只能产生1~20MHz的正弦波,而且只能调节频率的大小,但是本课设在编程时加入了可以调节步进的程序,在操作时可以观察到该步进为1000Hz,在AD9850的作用下将输入的信号转换为正弦波信号输出。
4系统的具体设计
4.1按键扫描部分
通过4*4共16个按键构成本单片机课设的输入部分。
本课设按键扫描部分采用先逐行后逐列的扫描方式对按键进行扫描,扫描周期在烧录进入单片机的程序中已经进行好了设置,也可以根据自己的需要对扫描周期进行更改,该扫描电路在单片机通电的时候就开始进行扫描,并且一直扫描,当有按键按下就会改变扫描电路中的电流,AT89C52单片机的CPU就会控制P3口对输入的数据也就是按下的键进行读取,并将读取的数据送到CPU。
这样就完成了单片机的扫描电路工作原理。
电路连接如下所示。
图4.1按键与单片机连接管脚图
4.2正弦信号生成电路部分
4.2.1AD9805芯片工作原理
AD9850可产生一个频谱纯净、频率和相位都可编程控制的模拟正弦波输出。
此正弦波可以直接作为信号源输出或者送入AD9850的高速比较器从而得到方波输出。
AD9850接口控制简单,可以用8位并行口或串行口直接输入频率、相位等控制数据。
32位频率控制字,在125MHz时钟下,输出频率分辨率为0.029Hz,频率围为0.1Hz~40MHz,幅值围为0.2~1V。
其引脚排列如下图所示,各引脚定义如下:
D0~D7(4-1,28-25):
控制字并行输入,给部寄存器装入40位控制数据,其中D7可做串行输入
DGND(5、24):
数字地
DVDD(6、23):
为部数字电路提供电源(3.3V或5V)
W-CLK(7):
控制字装入时钟,用于加载并行/串行的频率/相位控制字,上升沿有效
FQ-UD(8):
频率更新控制信号,时钟上升沿确认输入数据有效
FREFCLOCK(9):
外参考时钟(有源晶振)输入,最高125MHz
AGND(10、19):
模拟地
AVDD(11、18):
为部模拟电路提供电源(5V),可与数字电源共用
Rset(12):
外接电阻,决定器件输出电流大小,典型值为3.9K
QOUT(13):
部比较器正向输出端(方波)
QOUT(14):
部比较器反向输出端(方波)
VINN(15):
部比较器的负向输入端
VINP(16):
部比较器的正向输入端
DACBL(17):
部DAC外接参考电压端,可悬空
IOUTB(20):
“互补”DAC输出
IOUT(21):
部DAC输出,正向电流输出端,一般用电阻接地以转换为正弦电压
RESET(22):
复位端
可编程DDS系统的核心是相位累加器,它由一个加法器和一个N位相位寄存器组成,N一般位24~32。
每来一个外部参考时钟,相位寄存器便以步长M递加。
相位寄存器的输出与相位控制字相加后可输入到正弦查询表地址上。
正弦查询表包含一个正弦波周期的数字幅度信息,每一个地址对应正弦波中0°
~360°
围的一个相位点。
查询表把输入地址的相位信息映射成正弦波幅度信号,然后驱动数模转换器(DAC)以输出模拟量。
图4.2AD9850管脚图
AD9850有40位控制字,32位用于频率控制,5位用于相位控制,1位用于电源休眠,2位用于选择工作方式。
这40位控制字可通过
并行或串行方式输入到AD9850。
在并行装入方式中,通过8位总线D0-D7可将数据输入到寄存器。
在W-CLK的上升沿装入8位数据,并把指针指向下一个输入寄存器,在重复5次之后,再在FQ-UD上升沿把40位数据从输入寄存器装入到频率/相位数据寄存器(更新DDS输出频率和相位),同时把地址指针复位到第一个输入寄存器。
连续5个W-CLK上升沿后,W-CLK的边沿就不再起作用,直到复位信号或FQ-UD上升沿把地址指针复位到第一个寄存器。
AD9850默认复位为并行置入方式,所以要采用串行配置必须先进行切换。
即在并行方式下写入一个字节的控制字W0后,利用FQ_UD脉冲更新使其生效即可。
AD9850并串配置切换硬件连接方法是:
使D2=0,D1=D0=1,这样在AD9850每次上电或系统复位时的配置方式皆为串行方式。
注意:
串行连接时,先送频率字最低字节,再送频率最高字节,最后送相位控制字(每个字节中先低位后高位);
并行连接时,先送相位控制字,再送频率最高字节,最后送频率最低字节。
使用中注意:
RESET决定了器件输出端的电流大小,推荐连3.9K电阻到地;
VINP、VINN分别是片比较器的正向输入端和反相输入端,VINP接IOUT输出的正弦信号,可用于将输出的正弦波转换为方波;
IOUT通常接200欧电阻到地以转换为正弦电压输出,IOUTB为互补输出;
QOUT为方波输出,QOUTB为方波反相输出,悬空。
IOUTB引脚是IOUT引脚的互补输出端,它可输出与IOUT引脚相同的电流,在电路设计是,应在IOUT引脚外接电阻,一边输出正弦波电压。
该电压可作为AD9850部告诉比较器同相端的输入信号,并通过其外围电路的设计,将比较器的阈值电压取为信号幅度的一半,从而使得AD9850输出占空比为50%的方波信号。
4.2.2AD9850与单片机的具体连接
AT89C52的CPU将读取到的扫描电路部分信号通过单片机的P0口进行输出,将信号传输到AD9850芯片里面,通过AD9852芯片将直流信号转换成为具有正弦特性的信号,考虑到可能不足以驱动AD9850芯片进行工作,所以在他们两者之间连接一个10K的排阻,这样可以确保芯片AD9850可以正常的工作。
下图即为AD9850与AT89C52单片机的连线图。
图4.3单片机与AD9850管脚连接图
4.3液晶显示部分
显示器是人机交换的主要部分,它可以将测量电路测得的数据经过CPU处理后直观的显示出来。
数据显示有两种方案:
LED(全称:
LightEmittingDiode)数码显示和LCD(全称:
LiquidCrystalDisplay)液晶显示。
LCD液晶显示器是一种极低功耗显示器,从电子表到计算器,从袖珍仪表到便携式微型计算机以及一些文字处理机都用到了液晶显示器。
LCD液晶显示具有显示质量高,数字式接口,体积小,重量轻,功耗低等优点。
因此,本次设计选择了LCD液晶显示器。
这里我们采用LCD1602液晶显示器,主要用于显示数字、专用符。
由于液晶显示器一般都是已经制作好的成品,这里只是应用它来显示字符和专有单位符号,所以只需知道他的编程指令以及注意连接方式即可。
表4.11602液晶显示屏指令说明
AT89C52将从扫描电路扫描到的信号通过单片机的P1口将信号输出到LED1602液晶显示屏上面,液晶显示电路部分主要的是如何进行软件编程来达到实现显示的目的,在上面LED1602芯片部分我们讲解了编程时需要的指令。
关于编程部分显示字符的程序代码在附录三源代码里面介绍。
下图是液晶与单片机的电路管脚连接部分。
图4.4液晶连接管脚
5波形发生器仿真结果
按照总体电路图在仿真软件上一一选择芯片并进行连接,把程序代码下入单片机,然后启动开关观察。
我们对设计出的电路进行仿真。
将各部分电路在Proteus上连接好后,为各个电阻和电容选取适当值,为各个开关设置好适当的键盘打开数值,然后打开开关,即可根据显示器上显示的数字来判断电路设计以及程序编写是否成功。
下图即为仿真图。
图5.1仿真图
6结论
经过这半个多月的努力,在老师和同学的帮助下终于彻底的做完了本课程设计的所有工作。
通过这次课程设计,我能运用已学的知识解决我在设计中遇到的问题,使自己的动手能力和思考问题的能力得到了很大的提高。
在做设计的过程中我查阅了很多的资料,并认真的阅读这些与我的设计相关的资料,从而我的专业涵养得到了提高,知识的储备量也有所增加。
在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。
电路设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,这才是一个设计的灵魂所在。
因此在整个设计过程部分时间是用在单元电路的理解和程序的设计编写上面。
这次设计,让我受益匪浅。
我对电路设计中的逻辑关系等有了更深的认识,温习了以前学的知识,并学习了很多新知识,但在设计的过程中,也遇到了很多的问题,有一些知识都已经不太清楚了,不过通过查找一些资料所有的问题都解决了。
通过这次设计我也发现自己的很多不足之处。
在设计过程中我发现自己考虑问题很不全面,以至于经过多次修改才得到最终的结果,所掌握的电路应用软件还不够多,我希望自己的这些不足之处能在今后的学习和实践中得到改善。
而且,通过这次设计,我懂得了学习的重要性,学会了坚持和努力,这将为以后的学习做出最好的榜样!
辞
经过短暂的几周我最终完成了本次正弦波信号源发生器的设计,在本次课设里面我用到了数字电路还有单片机微型计算机与接口技术在课堂和实验课中讲到的很多容,通过自己动手实际设计电路连接电路,我认识到了自己所学的知识中还有很多问题,就是不能很好的应用自己的知识到实际电路连接与设计之中。
感老师,通过本次的课设设计让我了解了自己哪方面的不足,我将会以此为标准,在今后的学习生活中以此为鉴不断更正纠正自己,更好的和更全面的了解本专业所需要掌握和了解的知识与容。
同时也要感三年来不畏辛劳,勤勤恳恳为我讲授知识的各位老师,没有你们的辛勤指导,我是不可能掌握现在所学的知识,同时也要感你们对我学习中遇到的问题的解惑。
让我离知识更进一步。
最后还要感我的同学,感他们在日常生活和学习中对我提供的无私的帮助以及在学习上的解惑。
还有在这次课程设计上对我提供的建议与帮助,帮我更快更好地完成了本次实验的老师和同学。
参考文献
[1]马杰,覃匡宇,基漓.C语言程序设计基础[M].:
广西师大学,2012:
116~199.
[2]群芳,肖看.单片微型计算机与接口技术[M].:
电子工业,2012:
101~110.
[3]郭天祥.51单片机C语言教程[M].:
电子工业,2009:
124~148.
[4]谭浩强.C程序设计[M].:
清华大学,1991:
110~136.
[5]阎石.数字电子技术基础[M].:
高等教育,2007:
507~547.
[6]康华光.电子技术基础(数字部分)[M].:
高等教育,2000:
203~239.
[7]焱.数字电子技术[M].:
128~142.
[8]王卫东,旭琼.模拟电子技术基础[M].:
电子工业,2010:
290~296.
[9]松,黄继业,明.EDA技术实用教程[M].:
科学,2011:
215~218.
[10]介华.电子技术课程设计指导[M].:
高等教育,1997:
120~134.
附录
附录1原理图和PCB图
按照设计好的电路,在DXP软件中选择适当的元器件和正确的封装,找不到封装的可以自己动手制作并保存下来,以便以后使用。
连接好原理图后就可导入PCB图了,然后就可制作PCB图了,在PCB图的制作过程中一定要仔细,千万不能有错的连线和漏掉的连线,下图为PCB原理图和工程图。
图5.1PCB原理图
图5.2PCB工程图
附录2实物图
图6.1实物图
附录3主要程序代码
#include<
reg52.h>
math.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P0^0;
sbitrw=P0^1;
sbite=P0^2;
//1602控制
sbitad9850_w_clk=P0^3;
//P2.2口接ad9850的w_clk脚/PIN7
sbitad9850_fq_up=P0^4;
//P2.1口接ad9850的fq_up脚/PIN8
sbitad9850_rest=P0^6;
//P2.0口接ad9850的rest脚/PIN12
sbitad9850_bit_data=P0^5;
//P1.3口接ad9850的D7脚/PIN25
sbitxwave=P2^1;
//波形控制
ucharwave=0,s=1,danwei=0;
ucharfre[9]={'
1'
'
0'
.'
};
ucharcodedw[][4]={"
HZ"
"
KHZ"
MHZ"
voiddisplay(ucharx,uchary,ucharcmd,ucharflag)
{uchartemp=0x00,i=0,temp1=0x00,cmd1=0x80+x%16+(y%2)*0x40;
for(i=0;
i<
8;
i++)
{temp>
>
=1;
temp1>
temp=temp|(cmd&
0x80);
temp1=temp1|(cmd1&
cmd<
<
cmd1<
}
cmd=temp;
cmd1=temp1;
busy();
rw=0;
if(flag==1)
{rs=0;
e=1;
P1=cmd;
e=0;
}
else
P1=cmd1;
rs=1;
e=0;
}}
voidad9850_reset_serial()
{ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信号
ad9850_rest=0;
ad9850_rest=1;
//w_clk信号
ad9850_w_clk=0;
ad9850_w_clk=1;
//fq_up信号
ad9850_fq_up=1;
voidad9850_wr_serial(doublefrequence)
{
unsignedchari;
longy;
doublex;
//计算频率的HEX值
x=4294967295/125;
//适合125M晶振
//如果时钟频率不为125MHZ,修改该处的频率值,单位MHz!
!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w4数据
for(i=0;
40;
ad9850_bit_data=((y>
i)&
0x00000001);
ad98