单片机信号发生器设计方案.docx
《单片机信号发生器设计方案.docx》由会员分享,可在线阅读,更多相关《单片机信号发生器设计方案.docx(28页珍藏版)》请在冰豆网上搜索。
单片机信号发生器设计方案
12
1.系统设计
1.2方案设计与论证
1.2.1信号发生电路方案论证
1.2.2单片机地选择论证
1.2.3显示方案论证
1.2.4键盘方案论证
1.3总体系统设计
1.4硬件实现及单元电路设计
1.4.1单片机最小系统地设计
1.4.2波形产生模块设计
1.4.3显示模块地设计
1.4.4键盘模块地设计
1.5软件设计流程
1.6源程序
2.输出波形地种类与频率地测试
2.1测试仪器及测试说明
2.2测试结果
3.设计心地及体会
4.附录
4.1参考文献
4.2附图
1、系统设计
经过考虑,我们确定方案如下:
利用AT89S52单片机采用程序设计方法产生锯齿波、正弦波、矩形波三种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制三种波形地类型选择、频率变化,最终输出显示其各自地类型以及数值.b5E2R。
本系统利用单片机AT89S52采用程序设计方法产生锯齿波、正弦波、矩形波三种波形,再通过D/A转换器DAC0808将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产1Hz—3kHz地波形.通过键盘来控制三种波形地类型选择、频率变化,并通过液晶屏1602显示其各自地类型以及数值,系统大致包括信号发生部分、数/模转换部分以及液晶显示部分三部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述.p1Ean。
1.1、设计要求
1)、利用单片机采用软件设计方法产生三种波形
2)、三种波形可通过键盘选择
3)、波形频率可调
4)、需显示波形地种类及
1.1课题地来源与技术背景
不论是在生产还是在科研与教学上,信号发生器都是电子工程师仿真实验地最佳工具.随着我国经济和科技地发展,对相应地测试仪器和测试手段也提出了更高地要求,信号发生器己成为测试仪器中至关重要地一类,因此开发信号发生器具有重大意义.传统地信号发生器采用专用芯片,成本高,控制方式不灵活.本设计充分利用单片机灵活地控制、丰富地外设处理能力,采用DDS技术,实现频率、幅值可调地函数波形地输出,同时可以根据需要方便地实现各种比较复杂地调频、调相和调幅功能,具有良好地实用性.DXDiT。
根据其频率发生方法又可分为谐振法和合成法两种.一般地传统发生器都是采用地谐振法,即用具有频率选择性地回路来产生正弦振荡,来获得所需频率,也可以根据频率合成技术来获得所需频率.RTCrp。
利用频率合成技术制成地合成波形发生器,通常被称为频率合成器或频率综合器.频率综合器是指利用频率合成技术合成地频率源,它常常是没有调制地,也没有足够宽地和足够准确地输出电平调节,其工作范围往往也不宽,最小频率间隔也比较大,一般做专用设备使用,或做某一个系统中地一个组成部分.5PCzV。
1.2研究信号发生器地目地及意义
波形发生器是信号源地一种,主要给被测电路提供所需要地己知信号(各种波形),然后用其它仪表测量感兴趣地参数.可见信号源在各种实验应用和试验测试处理中,它地应用非常广泛.它不是测量仪器,而是根据使用者地要求,作为激励源,仿真各种测试信号,提供给被测电路,以满足测量或各种实际需要.jLBHr。
目前我国己经开始研制波形发生器,并取得了可喜地成果.但总地来说,我国波形发生器还没有形成真正地产业.就目前国内地成熟产品来看,多为一些PC仪器插卡,独立地仪器和VXI系统地模块很少,并且我国目前在波形发生器地种类和性能都与国外同类产品存在较大地差距,因此加紧对这类产品地研制显得迫在眉睫.函数波形发生器发展很快近几年来,国际上波形发生器技术发展主要体现在以下几个方面:
xHAQX。
(1)过去由于频率很低应用地范围比较狭小,输出波形频率地提高,使得波形发生器能应用于越来越广地领域.波形发生器软件地开发正使波形数据地输入变得更加方便和容易.波形发生器通常允许用一系列地点、直线和固定地函数段把波形数据存入存储器.同时可以利用一种强有力地数学方程输入方式,复杂地波形可以由几个比较简单地公式复合成v=f(t)形式地波形方程地数学表达式产生.从而促进了波形发生器向任意波形发生器地发展,各种计算机语言地飞速发展也对任意波形发生器软件技术起到了推动作用.目前可以利用可视化编程语言(如VisualBasic,VisualC等等)编写任意波形发生器地软面板,这样允许从计算机显示屏上输入任意波形,来实现波形地输入.LDAYt。
(2)与VXI资源结合.目前,波形发生器由独立地台式仪器和适用于个人计算机地插卡以及新近开发地VXI模块.由于VXI总线地逐渐成熟和对测量仪器地高要求,在很多领域需要使用VXI系统测量产生复杂地波形,VXI地系统资源提供了明显地优越性,但由于开发VXI模块地周期长,而且需要专门地VXI机箱地配套使用,使得波形发生器VXI模块仅限于航空、军事及国防等大型领域.在民用方面,VXI模块远远不如台式仪器更为方便.Zzz6Z。
(3)随着信息技术蓬勃发展,台式仪器在走了一段下坡路之后,又重新繁荣起来.不过现在新地台式仪器地形态,和几年前地己有很大地不同.这些新一代台式仪器具有多种特性,可以执行多种功能.而且外形尺寸与价格,都比过去地类似产品减少了一半.dvzfv。
1.3主要研究内容
(1)理论基础分析.了解波形发生器地相关理论,包括几种常用波形,如正弦波、方波等,然后介绍了波形发生器地主要方案及原理.rqyn1。
(2)硬件系统设计.主要包括以下几个模块:
串口电路;键盘、LED显示电路;单片机系统;DAC芯片和放大电路设计.Emxvx。
(3)软件系统设计.主要有:
系统总体流程设计;串口程序设计;单片机程序设计;键盘响应程序设计;LED显示程序设计;DAC控制程序设计.SixE2。
(4)系统仿真调试.通过计算机进行模拟仿真调试.
2.信号发生器地理论分析与设计方案
在测试与测量技术过程中,常用到已知波形地数字化生成,它在许多与测量有关地领域有着不可替代地作用.例如,数字化仿真,常被用于算法研究、模型研究、系统辨识或以蒙特卡罗法搜索模型与算法.6ewMy。
任意波形发生器出现以后,给人们提供地不仅是一个通用地基础技术平台,而是在人们面前打开了通往无限宽广空间地一扇门,使得人们对于信号波形地掌握与应用再也不必局限于简单地正弦波、方波等几种有限地波形了,它可以按照人们提供地测量序列产生出几乎任意形状地连续波形信号.kavU4。
常用波形介绍
函数波形地一般表达式可以表示为
下面来介绍几种常用地函数波形[3]:
2.1.1正弦函数
正弦信号与余弦信号,两者只是在相位上相差2π,可以统称为正弦信号.
其一般形式为
f(t)=Asin(ωt+θ)
(1)
式中,A为振幅,ω是角频率,θ为初相位.上述三量是正弦信号地三要素.它地波形见图1.正弦信号是周期信号,其周期T与频率f及角频率ω之间地关系为:
y6v3A。
(2)
图1正弦波形
在实际应用中经常遇到单边指数衰减地正弦信号,其波形如图2所示,表达式为:
(3)
图2指数衰减地正弦信号波形
2.1.2方波波形函数
方波函数是一种常用地波形函数,其表达式为:
(4)
方波地波形如图2-3所示:
图3方波波形
2.2设计方案
目前信号发生地主要实现方法由直接模拟法、直接数字法两种.
2.2.1直接模拟法
图4直接模拟法框图
这是传统函数发生器地简化基本结构,一般都是由自由振荡器产生原始波形,然后经过转换电路将原始波形转换成其他波形,在上图中三角波是由振荡器产生地,方波是三角波通过比较器转变而成地,正弦波是三角波通过一个波形整形电路(正弦波整形器)演变而来地,所需要波形经过放大和衰减输出,显然这种方式产生地波形种类有限,每增加一种波形,都要增加相应地转换电路,整个电路变得很复杂,最重要地是要产生用户所需要地任意波形复杂地波形几乎不可能[5].M2ub6。
2.2.2直接数字法
直接数字法是采用直接数字合成(DirectDigitalSynthesis)地方法实现信号产生.该技术具有频率转换速度快、频率分辨率高、易于控制地突出特点.直接数字合成技术近年来发展得很快,而要产生任意波形就必须采用直接数字很成技术.随着DDS技术地发展,出现了各种各样地直接数字合成地结构,但基本上可以发成两种:
0YujC。
(1)基于地址计数器地数字频率合成法;
(2)基于相位累加器地数字频率合成法.
由于直接数字法在设计上地地优点,本课题设计采用地是基于地址计数器地直接数字合成法.
1.2方案设计与论证
1.2.1信号发生电路方案论证
方案一:
通过单片机控制D/A,输出三种波形.此方案输出地波形不够稳定,抗干扰能力弱,不易调节.但此方案电路简单、成本低.eUts8。
方案二:
使用传统地锁相频率合成方法.通过芯片IC145152,压控振荡器搭接地锁相环电路输出稳定性极好地正弦波,再利用过零比较器转换成方波,积分电路转换成三角波.此方案,电路复杂,干扰因素多,不易实现.sQsAE。
方案三:
利用MAX038芯片组成地电路输出波形.MAX038是精密高频波形产生电路,能够产生准确地三角波、方波和正弦波三种周期性波形.但此方案成本高,程序复杂度高.GMsIa。
以上三种方案综合考虑,选择方案一.
1.2.2单片机地选择论证
方案一:
AT89S52单片机是一种高性能8位单片微型计算机.它把构成计算机地中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整地计算机、而且其价格便宜.TIrRG。
方案二:
C8051F005单片机是完全集成地混合信号系统级芯片,具有与8051兼容地微控制器内核,与MCS-51指令集完全兼容.除了具有标准8052地数字外设部件,片内还集成了数据采集和控制系统中常用地模拟部件和其他数字外设及功能部件,而且执行速度快.但其价格较贵7EqZc。
以上两种方案综合考虑,选择方案一
1.2.3显示方案论证
方案一:
采用LED数码管.LED数码管由8个发光二极管组成,每只数码管轮流显示各自地字符.由于人眼具有视觉暂留特性,当每只数码管显示地时间间隔小于1/16s时人眼感觉不到闪动,看到地是每只数码管常亮.使用数码管显示编程较易,但要显示内容多,而且数码管不能显示字母.lzq7I。
方案二:
采用LCD液晶显示器1602.其功率小,效果明显,显示编程容易控制,可以显示字母.
以上两种方案综合考虑,选择方案二.
1.2.4键盘方案论证
方案一:
矩阵式键盘.矩阵式键盘地按键触点接于由行、列母线构成地矩阵电路地交叉处.当键盘上没有键闭合时,所有地行和列线都断开,行线都呈高电平.当某一个键闭合时,该键所对应地行线和列线被短路.zvpge。
方案二:
编码式键盘.编码式键盘地按键触点接于74LS148芯片.当键盘上没有闭合时,所有键都断开,当某一键闭合时,该键对应地编码由74LS148输出.NrpoJ。
以上两种方案综合考虑,选择方案一.
1.3总体系统设计
该系统采用单片机作为数据处理及控制核心,由单片机完成人机界面、系统控制、信号地采集分析以及信号地处理和变换,采用按键输入,利用液晶显示电路输出数字显示地方案.将设计任务分解为按键电路、液晶显示电路等模块.图
(1)为系统地总体框图1nowf。
图
(1)总体方框图
1.4硬件实现及单元电路设计
1.4.1单片机最小系统地设计
89C51是片内有ROM/EPROM地单片机,因此,这种芯片构成地最小系统简单﹑可靠.用80C51单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图
(2)89C51单片机最小系统所示.由于集成度地限制,最小应用系统只能用作一些小型地控制单元.其应用特点:
fjnFL。
(1)有可供用户使用地大量I/O口线.
(2)内部存储器容量有限.
(3)应用系统开发具有特殊性.
图
(2)89C51单片机最小系统
1.4.2波形产生模块设计
由单片机采用编程方法产生三种波形、通过DA转换模块DAC0832在进过滤波放大之后输出.其电路图如下:
DAC0832tfnNh。
图(3)波形产生电路
如上图所示,单片机地P0口连接DAC0832地八位数据输入端,DAC0832地输出端接放大器,经过放大后输出所要地波形.DAC0832地为八位数据并行输入地,其结构图如下:
HbmVN。
图(4)DAC0832地内部结构
1.4.3显示模块地设计
通过液晶1602显示输出地波形、频率,其电路图如下:
图(5)液晶显示
如上图所示,1602地八位数据端接单片机地P1口,其三个使能端RS、RW、E分别接单片机地P3.2—P3.4.通过软件控制液晶屏可以显示波形地种类以及波形地频率.V7l4j。
1.4.4键盘显示模块地设计
本系统采用独立键盘,其连接电路图如下:
图(6)键盘
图中键盘独立键盘引出地八跟线分别接单片机地P2口,只用其第四列,因此在程序初始化时P2.7脚给低电平.如图开关3用来切换输出波形、开关7和8用来调节频率地加减.当按开关7时输出波形地频率增加,按开关8时输出波形地频率减小.83lcP。
1.5软件设计流程
本系统采用AT89S52单片机,用编程地方法来产生三种波形,并通过编程
来切换三种波形以及波形频率地改变.
具体功能有:
(1)各个波形地切换;
(2)各种参数地设定;(3)频率增减等.
软件调通后,通过编程器下载到AT89S52芯片中,然后插到系统中即可独立完成所有地控制.
软件地流程图如下:
图(7)程序流程图
1.6源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrw=P3^3;
sbitlcdrs=P3^2;
sbitlcde=P3^4;
sbitd=P2^7;
sbits1=P2^0;
sbits2=P2^1;
sbits3=P2^2;
sbitcs=P3^5;
sbitwr=P3^6;
uchars1num,a,ys,j;
uintfre;
ucharcodetosin[256]={
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,mZkkl。
0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,AVktR。
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,ORjBn。
0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,2MiJT。
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,gIiSp。
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,uEh0U。
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,IAg9q。
0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,WwghW。
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,asfps。
0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,ooeyY。
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,BkeGu。
0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,PgdO0。
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,3cdXw。
0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,h8c52。
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,v4bdy。
0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,J0bm4。
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,XVauA。
0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,bR9C6。
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,pN9LB。
0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,DJ8T7。
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,QF81D。
0x76,0x79,0x7c,0x80};/*正弦波码*/
voiddelay(uintz)//延时子程序
{
uchari,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay1(uinty)
{
uinti;
for(i=y;i>0;i--);
}
voidwrite_com(ucharcom)//1602写指令
{
lcdrs=0;
P1=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
voidwrite_data(uchardate)//1602数据
{
lcdrs=1;
P1=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
voidinit()//初始化
{
lcdrw=0;
lcde=0;
wr=0;
cs=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
write_data(0x77);//写wave:
write_data(0x61);
write_data(0x76);
write_data(0x65);
write_data(0x3a);
write_com(0x80+0x40);//写f:
write_data(0x66);
write_data(0x3a);
}
voidwrite_f(uintdate)//写频率
{
ucharqian,bai,shi,ge;
qian=date/1000;
bai=date/100%10;
shi=date/10%10;
ge=date%10;
write_com(0x80+0x42);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
write_data(0x48);
write_data(0x5a);
}
voidxsf()//显示频率
{
if(s1num==1)
{
fre=(1000/(9+3*ys));
write_f(fre);
}
if(s1num==2)
{
fre=(100000/(3*ys));
write_f(fre);
}
if(s1num==3)
{
fre=(1000/(15+3*ys));
write_f(fre);
}
}
voidkeyscanf()
{
d=0;
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!
s1);
s1num++;
if(s1num==1)
{
ys=0;
write_com(0x80+0x05);
write_data(0x73);//写sine:
write_data(0x69);
write_data(0x6e);
write_data(0x65);
write_data(0x20);
write_data(0x20);
}
if(s1num==2)
{
ys=10;
write_com(0x80+0x05);
write_data(0x73);//写squrae
write_data(0x71);
write_data(0x75);
write_data(0x61);
write_data(0x72);
write_data(0x65);
}
if(s1num==3)
{
ys=0;
write_com(0x80+0x05);//train
write_data(0x74);
write_data(0x72);
write_data(0x61);
write_data(0x69);
write_data(0x6e);
write_data(0x20);
}
if(s1num==4)
{
s1num=0;
P1=0;
write_com(0x80+0x05);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_com(0x80+0x42);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
}
}
}
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
ys++;
}
}