波形发生器设计解析.docx
《波形发生器设计解析.docx》由会员分享,可在线阅读,更多相关《波形发生器设计解析.docx(13页珍藏版)》请在冰豆网上搜索。
波形发生器设计解析
五邑大学
单片机课程设计报告
题目:
波形发生器设计
院系信息学院
专业电子信息工程
学号3112001979
学生姓名陈梓聪
指导教师黄辉
波形发生器设计
摘要
本文以STC89C51片机为核心设计了一个低频函数信号发生器。
信号发生器采用数字波形合成技术,通过硬件电路和软件程相结合,可输出自定义波形,如正弦波、方波、三角波、梯形波及其他任意波形,波形的频率和幅度在一定范围内可任意改变。
波形和频率的改变通过软件控制,幅度的改变通过硬件实现。
介绍了波形的生成原理、硬件电路和软件部分的设计原理。
该信号发生器具有体积小、价格低、性能稳定、功能齐全的优点。
关键词:
低频信号发生器;单片机;D/A转换
一、设计要求
设计一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。
二、实验目的
1、进行硬件电路设计。
2、编写程序,并进行程序测试。
3、利用单片机采用软件设计方法产生五种波形。
4、焊接电路,将程序下载到单片机,并用示波器对输出程序进行测试。
三、实验内容
1、工作原理:
数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。
89C51单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:
中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将89C51再配置键盘及、数模转换及波形输出、放大电路等部分,即可构成所需的波形发生器,其信号发生器构成系统框图如下图所示。
图
(1)
89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从键盘接收数据,进行各种功能的转换。
当数字信号电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
波形ROM表是将信号一个周期等间距地分离成128个点,储存在单片机得ROM内。
产生指定波形可以通过DAC来实现,不同波形产生实质上是对输出的二进制数字量进行相应改变来实现的。
本题目中,方波信号是利用定时器中断产生的,每次中断时,将输出的信号按位反即可;三角波信号是将输出的二进制数字信号依次加1,达到0xff时依次减1,并实时将数字信号经D/A转换得到;锯齿波信号是将输出的二进制数字信号依次加1,达到0xff时置为0x00,并实时将数字信号经D/A转换得到的;
梯形波是将输出的二进制数字信号依次加1,达到0xff时保持一段时间,然后依次减1直至0x00,并实时将数字信号经D/A转换得到的;
正弦波是利用MATLAB将正弦曲线均匀取样后,得到等间隔时刻的y方向上的二进制数值,然后依次输出后经D/A转换得到。
2、设计功能
本方案有5个独立式按键。
其中“S1”号键代表正弦波输出,“S2”号键代表三角波输出,“S3”号键代表方波输出,“S4”号键代表锯齿波输出,“S5”号键代表梯形波输出。
3、主控电路
设计中主要采用AT89C51型单片机,它具有如下优点:
(1)拥有完善的外部扩展总线,通过这些总线可方便地扩展外围单元、外围接口等。
(2)该单片机内部拥有4K字节的FLASHROM程序存储器空间和256字节的RAM数据存储空间,完全可以满足程序的要求。
由于该芯片可电可擦写,故可重复使用。
如果更改程序内容,可将芯片拿下重新烧写。
(3)该单片机与工业标准的MCS-51型机的指令集和输出引脚兼容。
AT89C51单处机内部设置两个16位可编程的定时器/计数器T0和T1,它们具有计数器方式和定时器方式两种工作方式及4种工作模式。
在波形发生器中,将其作定时器使用,用它来精确地确定波形的两个采样点输出之间的延迟时间。
模式1采用的是16位计数器,当T0或T1被允许计数后,从初值开始加计数,最高位产生溢出时向CPU请求中断。
中断系统是使处理器具有对外界异步事件的处理能力而设置的。
当中央处理器CPU正在处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧急事件。
在波形发生器中,只用到片内定时器/计数器溢出时产生的中断请求,即是在AT89C51输出一个波形采样点信号后,接着启动定时器,在定时器未产生中断之前,AT89C51等待,直到定时器计时结束,产生中断请求,AT89C51响应中断,接着输出下一个采样点的信号,如此循环产生所需要的信号波形。
主控电路图如图
(2)所示,AT89C51从P1口接收来自键盘的信号。
89C51是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。
用89C51单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,89C51单片机最小系统所示。
由于集成度的限制,最小应用统只能用作一些小型的控制单元。
其应用特点:
1)有可供用户使用的大量I/O口线;2)内部存储器容量有限;3)应用系统开发具有特殊性。
图
(2)
4、数/模转换电路
由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有8位分辨率的数模转换器DAC0832。
DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。
但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。
DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。
根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:
直通方式、单缓冲方式和双缓冲方式。
本设计选用直通方式。
DAC0832的数据口和单片机的P2口相连。
CSDA:
片选信号输入线(选通数据锁存器),低电平有效;
WR:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存。
图(3)
5、运算放大电路和低通滤波电路
LM324的5管脚与DAC0832的(IOUT2)12管脚相连,LM324的6管脚与DAC0832的(IOUT1)11管脚相连,LM324的7管脚与DAC0832的REF(9)管脚相连。
LM324运算放大器的作用是将DAC0832输出的电流信号转化为电压信号V1,输出端连了一个低通滤波器。
如果不加低通滤波器,也能够生成波形,但是产生的信号会有毛刺,如果加一个低通滤波器不仅能起到滤波的作用,还能起到平滑的作用。
低通滤波器的截止频率F=1/(2*pi*R3*C6),这里我们选择R3为100欧姆的电阻,C6为104电容,截止频率F=16KHZ。
实验表明,此时的输出波形效果不错。
图(4)
四、安装调试
1.不通电,用万用表根据电路图仔细检查各线路连接是否正常。
2.首先是调试单片机部分,DA和运算放大器芯片不接。
用STC_ISP_V483软件通过串口下程序。
看是否可以正常下程序。
3.当可以正常下程序时,给51单片机下一个让所有I/0口一会儿输入0,延时,再输出1,以此类推。
用万用表测量各I/O口得电压是不是一会儿高,一会儿低。
4.安上DA和运算放大器芯片,给单片机下一个输出正弦波的测试程序,通过示波器看输出是否正常。
5.给单片机下一个完整的程序,分别按下S1、S2,看波形是否改变
五、系统仿真波形
正弦波:
三角波:
方波:
、
锯齿波:
梯形波:
六、实验结论
基于单片机的信号发生器设计,这个信号发生器的设计中涉及到一个典型的控制过程。
通过单片机控制一个模数转换器DAC0832产生所需要的电流,然后使用运算放大器LM324可以将其电流输出线性地转换成电压输出,再将电压经过运算放大器的放大,可以得到足够幅度的信号。
通过程序的控制,可以产生一系列有规律的波形。
这样一个信号发生装置在控制领域有相当广泛的应用范围。
最终做出来的信号发生器满足了题目中的所有要求:
产生五种波形。
正弦波、三角波、矩形波、锯齿波、梯形波。
参考文献:
1、刘焕成《工程背景下的单片机原理及系统设计第2版》
2、STC公司官方网页下载资料
3、郭天翔.新概念51单片机C语言教程入门、提高、开发、拓展全.北京.电子工业出版社2009.1
附录:
程序设计
#include
#defineucharunsignedchar
#defineuintunsignedint
voiddelay(uint);
voiddelay1(uint);
sbitcs=P3^2;
sbitwr=P3^6;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
ucharj=0;
uinta=0,b=0,c=0,d=0;
ucharcodetosin[128]={0x80,0x86,0x8c,0x92,0x98,0x9f,0xa5,0xab,
0xb0,0xb6,0xbc,0xc1,0xc7,0xcc,0xd1,0xd5,
0xda,0xde,0xe2,0xe6,0xea,0xed,0xf0,0xf3,
0xf6,0xf8,0xfa,0xfc,0xfd,0xfe,0xff,0xff,
0xff,0xff,0xff,0xfe,0xfd,0xfc,0xfa,0xf8,
0xf6,0xf3,0xf0,0xed,0xea,0xe6,0xe3,0xde,
0xda,0xd6,0xd1,0xcc,0xc7,0xc1,0xbc,0xb6,
0xb1,0xab,0xa5,0x9f,0x99,0x92,0x8c,0x86,
0x80,0x79,0x73,0x6d,0x67,0x61,0x5b,0x55,
0x4f,0x49,0x43,0x3e,0x39,0x33,0x2e,0x2a,
0x25,0x21,0x1d,0x19,0x15,0x12,0xf,0xc,0x9,
0x7,0x5,0x3,0x2,0x1,0x0,0x0,0x0,0x0,0x0,
0x1,0x2,0x3,0x5,0x7,0x9,0xc,0xe,0x12,0x15,
0x18,0x1c,0x20,0x25,0x29,0x2e,0x33,0x38,
0x3d,0x43,0x48,0x4e,0x54,0x5a,0x60,0x66,
0x6c,0x73,0x79};/*正弦波码*/
voiddelay(uintz)//延时子程序
{
uinti,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay1(uinty)
{
uinti;
for(i=y;i>0;i--);
}
voidmain()
{
cs=0;
wr=0;
TMOD=0x01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;
ET0=1;
while
(1)
{
if(key1==0)//正弦波
{
P2=tosin[j];
delay1(100);
if(j==127)j=0;
elsej++;
}
if(key2==0)//三角波
{
if(a<128)
{
P2=a;
delay
(2);
}
else
{
P2=255-a;
delay
(2);
}
a++;
if(a==255)
{
a=0;
}
}
if(key3==0)//方波
{
TR0=1;
if(b==10)
{
P2=0xff;
}
if(b==20)
{
b=0;
P2=0;
}
}
if(key3==1)
{TR0=0;}
if(key4==0)//锯齿波
{
if(c<255)
{P2=c;
delay
(2);}
c++;
if(c==255)
{c=0;
P2=0;
delay1
(1);}
}
if(key5==0)//梯形波
{
if(d<128)
{P2=~d;
delay
(2);}
elseif(128{
P2=~(255-d);
delay
(2);
}
elseif(d==128)
{
P2=~d;
delay(300);
}
d++;
if(d==255)
{
d=0;
}
}
}
}
voidtt()interrupt1
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
b++;
}