课程设计波形发生器.docx
- 文档编号:14860554
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:25
- 大小:409.82KB
课程设计波形发生器.docx
《课程设计波形发生器.docx》由会员分享,可在线阅读,更多相关《课程设计波形发生器.docx(25页珍藏版)》请在冰点文库上搜索。
课程设计波形发生器
波形发生器设计
一.摘要
本文以AT89C51单片机为核心,采用C语言的编程方法,外加DAC0832数模转换模块与集成运放模块,构成了函数波形发生器。
可产生方波、三角波、正弦波、锯齿波等多种波形,波形的频率可用程序改变,并可根据需要选择输出波形。
其中运用软硬件结合的方法实现设计功能,具有线路简单、结构紧凑、性能优越等特点。
关键词:
51单片机;DAC;函数波形发生器
二.设计要求
1.产生正弦波、方波、三角波;
2.幅度可以设定;
3.出频率能达到1MHZ。
4.发挥部分(自选)
三.设计目的
1、巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决实际课题设计的能力。
2、培养针对课题需要,选择和查阅有关手册、图表及文献资料的能力,提高组成系统、编程、调试的动脑动手能力。
3、通过对课题设计方案的分析、选择、比较,熟悉运用单片机系统开发、软硬件设计的方法内容及步骤。
4,掌握各个接口芯片(如0832等)的功能特性及接口方法,并能运用其实现一个简单的单片机应用系统功能器件。
四.设计方案
波形发生器的实现方法通常有以下几种:
方案一:
采用模拟电路搭建函数信号发生器,它可以同时产生方波、三角波、正弦波。
但是这种模块产生的不能产生任意的波形(例如梯形波),并且频率调节很不方便。
方案二:
采用锁相式频率合成器,利用锁相环,将压控振荡器(VCO)的输出频率锁定在所需频率上,该方案性能良好,但难以达到输出频率覆盖系数的要求,且电路复杂。
。
方案三:
采用AT89S52单片机和DAC0832芯片,直接连接键盘和显示。
该种方案主要对AT89S52单片机的各个I/O口充分利用。
P1口是连接键盘,P2口接显示电路,P0口连接DAC0832输出波形。
这样总体来说,能对单片机各个接口都利用上,而不在多用其它芯片,从而减小了系统的成本。
也对按照系统便携式低频信号发生器的要求所完成。
占用空间小,使用芯片少,低功耗。
综合考虑,方案三各项性能和指标都优于其他几种方案,能使输出频率有较好的稳定性,充分体现了模块化设计的要求,而且这些芯片及器件均为通用器件,在市场上较常见,价格也低廉,样品制作成功的可能性比较大,所以本设计采用方案三。
五.设计思路
1.基本功能
1.1.波形的产生
(1)正弦波:
通过手动的方法计算出输出各点的电压值,然后在编写程序时以数组的方式给出。
当需要时,只要按照顺序进行输出即可。
这种方法比在软件中计算速度快且曲线的形状修改灵活。
在本设计中将一个周期(360度)分为256个点,则每两个点之间的间隔为1.4度,然后计算出每个点电压对应的数字量,形成数组。
只要反复输出这组数据到DAC0832,就可以在系统输出端得到想要的正弦波。
(2)方波:
按照设定的周期值将输出的电压改变即可。
(3)三角波:
使用查表法。
将三角波的一个周期(360度)分为256个点,相邻点等差。
反复输出前256个数据到DAC0832,就可以在系统输出端得到想要的锯齿波。
1.2.波形的变换
通过P1口和轻触开关S1-S4相连接来切换波形输出(如按S1键输出正弦波,按S2键产生方波,按S3键产生锯齿波,按S4键产生三角波)。
用P0口控制数码管静态显示波形代号。
用P2口向DAC0832发送数据,经DAC0832转换后,再把信号放大,最后接到示波器上显示。
2.幅值的改变
波形的幅值调节,使用硬件方法实现,在DAC0832的VREF口接一滑动变阻器,通过改变DA转换的参考电压来实现波形幅值的改变。
3.频率的改变
频率的改变用软件实现,这里通过增加一个变量V来达到目的。
以正弦波为例,给定正弦波的数组表,把对应的数值送给DAC0832,加以处理,就能输出正弦波。
增加变量以后,其形式变为”DAC0832=sintab[i+v]”,改变v的值,输出一次正弦波数组表的时间就会改变,根据周期与频率的关系,相应的频率也会改变。
例如v=0时,需送256次才能把数组表中数据全部送给DAC0832;v=4时,送64次就可达到目的。
由于每送一次数据的时间是一定的,次数不同,时间也会不同,频率也会改变。
、
4.附加功能
4.1对应输出波形状态的显示
采用软硬件结合的方法,在P2口接一个7段数码管,当P1口对应得按键按下,在P2口输出一个数值,从而显示相应的数字。
根据数字我们知道正在显示波形的状态,如数码管显示1时,输出的是正弦波;显示2时,输出的是方波。
4.2.锯齿波的产生
借助于一个变量i,让i从0开始自加1,达到0xff时置为0x00,。
并实时把对应的i值送到DAC0832经D/A转换,就可以在系统输出端得到想要的锯齿波。
4.3方波占空比的调节
对于方波这里增加了一个占空比可调的功能,具体做法与频率的调节十分相似。
这里在v的基础上,又增加了两个变量up,down,通过改变up,down的值,从而达到改变方波占空比的目的。
六.硬件电路
1.硬件框图
简单滤波并输出
2.主要模块
2.1.按键模块
图二按键模块
如图一,按键模块由八个按钮与AT89C51的P1口连接而成。
按钮的公共端接低电平,当某一按钮按下时,对应的接口就会收到一个低电平信号,然后发生相应的动作。
各个按钮的作用是S1产生正弦波信号,S2产生方波信号,S3产生锯齿波信号,S4产生三角波信号,S5调节使频率正大,S6调节使频率减小,S7使方波占空比增大,S8使方波占空比减小。
2.2数模转换模块
图三数模转换模块
如图二,数模转换模块的核心是DAC0832,DAC0832是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
根据对DAC0832的输入寄存器和DAC寄存器不同的控制方法,DAC0832有如下3种工作方式:
缓冲方式。
单缓冲方式是控制输入寄存器和DAC寄存器同时接收资料,或者只用输入寄存器而把DAC寄存器接成直通方式。
此方式适用只有一路模拟量输出或几路模拟量异步输出的情形。
双缓冲方式。
双缓冲方式是先使输入寄存器接收资料,再控制输入寄存器的输出资料到DAC寄存器,即分两次锁存输入资料。
此方式适用于多个D/A转换同步输出的情节。
直通方式。
直通方式是资料不经两级锁存器锁存,即CS*,XFER*,WR1*,WR2*均接地,ILE接高电平。
此方式适用于连续反馈控制线路和不带微机的控制系统,不过在使用时,必须通过另加I/O接口与CPU连接,以匹配CPU与D/A转换。
本设计控制输入寄存器和DAC寄存器同时接收资料,属于单缓冲方式。
注意到图中VREF(基准电压输入线),与一个滑动变阻器RV1相连,通过改变RV1的阻值即可达到输出波形幅度调节的目的。
2.3.放大器模块
图四放大器模块
DAC0832输出的是一个电流信号,加入放大模块的主要作用是将电流信号转换成电压信号。
大家都知道集成运放中有“零点漂移”的现象,所以在这里加入一个10K电阻用于改善“零点漂移”对系统性能所造成的影响。
2.4.显示模块
图五显示模块
如图,显示模块由一个七段共阳的数码管与P2口相连而成,当输出波形为正弦波时,数码管显示“1”;输出方波时,数码管显示“2”;
输出锯齿波时,数码管显示“3”;输出三角波时,数码管显示“4”。
根据数码管所显示的数字,就能知道输出的为何种波形。
2.5.滤波模块
图六滤波模块
为了尽可能的得到相对频率较高的成分与较为纯净的波形,这里用了一个高通滤波器。
通过改变滑动变阻器的值可以改善高通滤波器的性能。
2.5其它模块
除了上面所述模块外,还用到了晶振电路、复位电路和滤波电路,它们的原理图分别如图六,图七所示。
这里不再赘述。
图七晶振电路
图八复位电路
5.总原理图
图九总原理图
七.软件设计
1.程序流程图
2.按键部分
3.程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDAC0832XBYTE[0xFFFE]
sbits1=P1^0;//正弦波选择按钮
sbits2=P1^1;//方波选择按钮
sbits3=P1^2;//锯齿波选择按钮
sbits4=P1^3;//三角波选择按钮
sbits5=P1^4;//增大频率按钮
sbits6=P1^5;//减小频率按钮
sbits7=P1^6;//增大占空比按钮
sbits8=P1^7;//减小占空比按钮
uintup,down;//调节占空比的两个变量
intstatu,v;//statu为波形状态按钮,v为调节频率所用的变量
inti;//用于正弦波与三角波的数组表的引用
ucharcodesintab[256]=
{
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,
0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,
0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,
0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,
0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,
0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,
0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,
0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,
0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,
0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,
0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,
0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,
0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,
0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80
};
ucharcodeangletab[256]=
{
0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,
0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,
0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,
0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,
0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,
0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,
0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,
0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe,
0xfe,0xfc,0xfa,0xf8,0xf6,0xf4,0xf2,0xf0,
0xee,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,
0xde,0xdc,0xda,0xd8,0xd6,0xd4,0xd2,0xd0,
0xce,0xcc,0xca,0xc8,0xc6,0xc4,0xc2,0xc0,
0xbe,0xbc,0xba,0xb8,0xb6,0xb4,0xb2,0xb0,
0xae,0xac,0xaa,0xa8,0xa6,0xa4,0xa2,0xa0,
0x9e,0x9c,0x9a,0x98,0x96,0x94,0x92,0x90,
0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82,0x80,
0x7e,0x7c,0x7a,0x78,0x76,0x74,0x72,0x70,
0x6e,0x6c,0x6a,0x68,0x66,0x64,0x62,0x60,
0x5e,0x5c,0x5a,0x58,0x56,0x54,0x52,0x50,
0x4e,0x4c,0x4a,0x48,0x46,0x44,0x42,0x40,
0x3e,0x3c,0x3a,0x38,0x36,0x34,0x32,0x30,
0x2e,0x2c,0x2a,0x28,0x26,0x24,0x22,0x20,
0x1e,0x1c,0x1a,0x18,0x16,0x14,0x12,0x10,
0x0e,0x0c,0x0a,0x08,0x06,0x04,0x02,0x00
};
voiddelay(uintms)
{
uchart;
while(ms--)
for(t=0;t<120;t++);
}
voidsin()//正弦波
{for(i=0;i<=256;i=i+v)
{DAC0832=sintab[i];
}}
voidsquar()
{
DAC0832=0xff;//方波
delay(up-v);
DAC0832=0x00;
delay(down-v);
}
voidsaw()//锯齿波
{for(i=0;i<=256;i=i+1+v)
{DAC0832=i;}
}
voidangle()//三角波
{for(i=0;i<=256;i=i+v)
{DAC0832=angletab[i];}
}
voidwave()
{
if(s1==0)//正弦波状态
{
P2=0xF9;
delay(10);
statu=1;
}
elseif(s2==0)//方波状态
{
P2=0xA4;
delay(10);
statu=2;
}
elseif(s3==0)//锯齿波状态
{
P2=0xB0;
delay(10);
statu=3;
}
elseif(s4==0)//三角波状态
{
P2=0x99;
delay(10);
statu=4;
}
elseif(s5==0)//增大频率
{
delay(10);
if(s5==0)
{
v=v+1;
}
while(!
s5);
delay(10);
while(!
s5);
}
elseif(s6==0)//减小频率
{
delay(10);
if(s6==0)
{
v=v-1;
if(v<=0)v=0;
}
while(!
s6);
delay(10);
while(!
s6);
}
elseif(s7==0)//占空比增加
{
delay(10);
if(s7==0)
{
up--;
down++;
}
while(!
s7);
delay(10);
while(!
s7);
}
elseif(s8==0)//占空比减小
{
delay(10);
if(s8==0)
{
up++;
down--;
}
while(!
s8);
delay(10);
while(!
s8);
}
}
voidmain()
{
up=6;
down=6;
v=3;
P2=0xff;
P1=0xff;
while
(1)
{
wave();
switch(statu)
{
case1:
sin();break;
case2:
squar();break;
case3:
saw();break;
case4:
angle();break;
}
}
}
八.仿真
1.以下四幅图说明可产生四种波形
3.以下四幅图说明幅值可变
4,以下四幅图说明频率可变
5.以下两幅图说明方波占空比可变
6,下图说明周期为300us波形无失真
7,以下四幅图说明可由数码管显示对应状态
九.总结
本设计采取软硬件结合的方式,是基于单片机和DAC0832波形发生器的设计与实现,单片机采用的是AT89C51,DAC0832是波形发生器中常用的芯片。
经验证,该设计能很好的实现多种波形的显示,波形清晰,幅值与频率调节起来也方便。
可是在仿真的过程中,我们发现,用这种方法设计的波形发生器,频率较低,很难达到高频。
对于这一点,我们尝试用一个倍频器以期能够输出较高频率的波形,可是仿真结果并不理想。
这一点也是本此设计的不足之处。
........忽略此处.......
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 波形 发生器