搜档网
当前位置:搜档网 › 基于dac0832的波形发生器设计与实现

基于dac0832的波形发生器设计与实现

本科生毕业论文(设计)

题目:基于DAC0832波形发生器设计与

实现

系 部 计算机科学与技术

学科门类 工 科

专 业 计算机科学与技术

学 号 1010211006

姓 名 吕 治 襄

指导教师 黄 大 君

2012年 5 月 15 日

线

基于dac0832的波形发生器设计与实现

摘要

波形发生器是能够产生大量的标准信号和用户定义信号,并保证高精度、高稳定性、可重复性和易操作性的电子仪器。函数波形发生器具有连续的相位变换、和频率稳定性等优点,不仅可以模拟各种复杂信号,还可对频率、幅值、相移、波形进行动态、及时的控制,并能够与其它仪器进行通讯,组成自动测试系统,因此被广泛用于自动控制系统、震动激励、通讯和仪器仪表领域。

本论文是研究基于DAC0832波形发生器设计与实现。论文采用文献研究法、模拟法、观察法等方法进行课题的研究。系统是用AT89S51作为系统的控制核心,外围电路采用数字/模拟转换电路(DAC0832),运放电路(TL082),按键,定位器,LCD显示器等。系统通过按键来和定位器进行整个系统的控制,按键控制切换产生正弦波,锯齿波,三角波,阶梯波,四中波形,而幅值和占空比是通过定位器来进行调节。系统经过调试和最后的检测,可以得出本系统一下特点:性能较好,稳定性强,价格便宜,容易操作,具有一定的实用性,最后的成品可以用在常用的有波形发生器功能要求的应用电子仪器设备上。

关键词:单片机波形发生器 DAC0832

ABSTRACT

The profile generator is can produce the massive standard signals and the user definition signal, and guarantees the high accuracy, high stable, the repeatability and the easy operational electronic instrumentation. The function profile generator has the continual phase transformation, and merits and so on frequency stability, not only may simulate each kind of complex signal, but also may to the frequency, the peak-to-peak value, the phase-shift, the profile carry on the tendency, the prompt control, and can carry on the communication with other instruments, the composition automated test system, therefore widely uses in the automatic control system, the vibration drive, the communication and the instrument measuring appliance domain.

This paper is studing on waveform generator design and implementation based on the DAC0832. The system is used AT89S51as the core of the control system, a peripheral circuit using digital / analog conversion circuit ( DAC0832), operational amplifier circuit (TL082), keys, locator, LCD display etc.. The system through the keys and locator for the entire system control, The key control switch generates a sine wave, sawtooth, triangle wave, ladder wave, fourth waveform, while the amplitude and duty ratio is adjusted by the locator. The system debugging and the final test, the system can reach a characteristic: good performance, high stability, low price, easy to operate, has a certain practicality, the final product can be used in common with waveform generator function requirements of the application of electronic equipment.

Keywords:MCU the waveform generator DAC0832

目录

第1章绪论 (1)

1.1波形发生器现状 (1)

1.2单片机在波形发生器中的应用 (1)

1.3课题研究目的,内容,和方案设计 (1)

第2章硬件电路的设计 (3)

2.1波形发生器系统框图 (3)

2.2 各模块之间的相连 (3)

2.3各模块电路的设计 (6)

2.3.1 D/A转换电路设计 (6)

2.3.2复位电路设计 (7)

2.4.3 按键电路设计 (7)

2.4.4 I/V转换电路设计 (9)

第3章软件设计 (10)

3.1程序 (10)

3.2按键程序模块 (10)

3.3 锯齿波程序模块 (12)

3.4三角波程序模块 (13)

3.5正玄波程序模块 (13)

3.6方波程序模块 (14)

3.7延迟程序模块 (16)

第4章总结 (17)

致谢 (18)

参考文献 (19)

第1章绪论

1.1波形发生器现状

波形发生器作为一种常用的应用电子仪器设备,传统的波形发生器可以完全用硬件电路搭建,如应用555振荡电路可以产生正弦波,三角波,方波等波形,传统的波形发生器多采用这种方式设计,这种方式不应用单片机,但是这种方式存在波形质量差,控制难,可调范围小,电路复杂和体积大等缺点,在科学研究和生产实践中,如工业过程控制,生物医学,地震模拟震动等领域往往需要低频信号源,而由硬件搭建的波形发生器效果往往达不到好的效果,而且低频信号源所需要的RC很大,大电阻,大电容在制作上有困难,参数的精度也难以保证,而且体积大,漏电,体积大是该类波形发生器的显著缺点。

1.2单片机在波形发生器中的应用

随着电子技术的飞快发展,单片机的应用不断的深入,基于单片机的智能仪器的设计技术不断成熟。单片机构成的仪器具有高可靠性,高性价比,单片机技术在智能仪表和自动化等诸多领域有了极为广泛的应用,并应用到各种家庭电器,单片机技术的广泛应用推动了社会的进步。

一块单片机芯片就是一台计算机,单片机的这种特殊的结构形式,使得其在某些应用领域,它承担了大中型计算机和通用微机无法完成的一些工作。单片机有很多优点和特点,归纳有以下几个方面:

1.具有优异的性价比

单片机尽可能的把应用所需要的存储器,各种功能的I/O接口集成在一块芯片内,因而其性能优越,而价格性对低廉。

2.集成度搞,体积小,可靠性高

单片机把各种功能部件集成在一块芯片上,因而集成度高,为大规模集成电路或超大规模集成电路,又内部采用总线结构,因而大大减少了芯片内部之间的连线,这大大提高了单片机的可靠性和抗干扰能力,同时,体积小,对于强磁场环境易于采用屏蔽措施,适合于在恶劣环境下工作。

3.低电压和低功耗

单片机大量应用于便携式产品和家庭消费类产品,低电压和低功耗极为重要。目前,单片机的功耗也越来越低,一枚纽扣电池就能使产品运行很长时间

5.控制功能强

单片机体积虽小,但五脏俱全,它非常适合专门的控制用途。其指令系统中含有丰富的转移指令,容易通过编程实现相关控制

1.3课题研究目的,内容,和方案设计

利用DAC0832波形发生器设计一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。

本题目中,方波信号是利用定时器中断产生的,每次中断时,将输出的信号按位取反即可。

设计一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器其他波形可以通过单片机控制DAC来实现。

1.三角波信号是将输出的二进制数字信号依次加1,达到0xff时依次减1,并实时将数字信号经D/A转换得到;

2.锯齿波信号是将输出的二进制数字信号依次加1,达到0xff时置为0x00,并实时将数字信号经D/A转换得到的;

3.方波信号是将输出二进制数字信号以1和0来显示在上面,还是在下面,并实时将数字信号经D/A转换得到的;

4.正弦波是利用MATLAB将正弦曲线均匀取样后,得到等间隔时刻正弦波取样值,然后依次输出后经D/A转换得到。

采用单片机(AT89S51)和数模转换芯片(DAC0832)实现波形的产生,波形的产生由程序控制,向D/A的输入端按一定的规律发送数据,经过D/A产生波形,通过按键或中断控制不同波形的产生。此方案通过编程简化了外部电路,原理简单,容易实现。通过编程实现不同波型的产生,并且可以通过按键实现波形的切换。该方案线路简单,结构紧凑,系统稳定,易控制,容易调试等优点。

第2章硬件电路的设计

2.1波形发生器系统框图

原理框图分析:该波形发生器主要由单片机(AT89S51),数模转换电路(DAC0832),电流/电压转换电路(TL082),按键和ISP接口等组成。其工作原理为当按下通过按下按键来进行切换波形,而且占空比,幅值可调,然后就会产生相对应的波形。

1.本系统的通过按键(按键和定位器)来进行整个系统的控制,按键1是波形选择及占空比和频率的选择,按键2和按键3是调节占空比和频率的,按键4是确定以上的设置然后进行最后的确认。

2.LCD是用来显示当前的波形的名字,及波形的占空比和频率,在进行选择波形和波形参数的设置的时候需要用到的重要工具。

3.电源为整个系统供电,是整个系统的保障。由跟USB线连接电脑和单片机。

4.A/D转换是整个系统的重点部分,它将单片机控制送来的数据转换成电压,为整个过程的重点,主要由DAC0832来完成。

5.数据通过DAC0832芯片转换后为电流信号,然后需要个外部功率放大器来实现电流和电压之间的转换。

6.把转换后得到的电压信号输出到示波器进行显示,得到波形。

2.2 各模块之间的相连

按键与AT89S51之间的相连

总共有四个控制按键,是整个系统的主要控制区,四个按键分别是KEY1,KEY2,KEY3,KEY4,分别于单片机的P24,P25,P26,P27(即单片机的25,26,27,28号四个引脚相连,) 然后再分别通过一个4K的电阻和电源相连。最后进行统一接地[1]。

图2-2 按键与单片机的相连图

LCD显示器与AT89S51的相连

本系统采用是LCD1602液晶显示器,次液晶显示器总共有16各引脚,各引脚有各自的不同功能,LCD1602的4~6引脚与单片机的P10~P12(即单片机的1,2,3号引脚)这三个引脚是传输AT89S51与LCD1602液晶显示器的控制信号的。

LCD1602的7~14号八个引脚是与AT89S51的P01~P07(即单片机的39,38,37,36,35,34,33,32号引脚)相连,与之相应的连线为单片机与液晶显示器的数据传输线,在焊接电路板的时候,用的是排线来连接的。

图2-3 LCD1602与单片机的相连图

DAC0832与AT89S51之间的相连

DAC0832是整个波形发生器的中专部分,实现的是数字信号转换成模拟电流信号,该芯片是由20各引脚组成,其中的DI0~DI7号引脚与单片机AT89S51的P30~P37(即AT89S51的11~17号)引脚相连,与之相应的联想便是是DAC0832与AT89S51的数据传输线,是DAC0832与AT89S51数据交换的渠道,AT89S51中的数据通过这条线把原始的数字量数据传到DAC0832进行转化,转化成电流模拟信号[2]。

其他的引脚中的1,2,3,10,12,17,18号引脚是接地的,REF (DAC0832芯片的9号)引脚是反馈电阻引出端,DAC0832内部已经有反馈电阻,所以 REF端可以直接接到外部运算放大器的输出端,这样相当于将一个反馈电阻接在运算放大器的输出端和输入端之间。IOUT1(DAC0832芯片的11号)引脚是模拟电流输出端1,当DAC寄存器中数据全为1时,输出电流最大,当 DAC寄存器中数据全为0时,输出电流为0。与功率放大器负极相连。

图2-4 DAC0832与AT89S51之间的相连图

D/A转换电路与电流/电压转换电路的相连

D/A转换电路这里是指DAC0832芯片,前面我们也提到过REF (DAC0832芯片的9号)引脚是反馈电阻引出端,REF端直接接到外部运算放大器的输出端, IOUT1(DAC0832芯片的11号)引脚是模拟电流输出端1与功率放大器负极相连[3]。

图2-5 D/A转换电路与电流/电压转换电路的相连图

电流/电压转换电路与波形输出端之间的相连

波形输出端有两个引脚,1号引脚是接功率放大器的输出端,2号引脚是接地。

图2-6 电流/电压转换电路与波形输出端之间的相连图

2.3各模块电路的设计

2.3.1 D/A转换电路设计

图2-7中DAC0832的数字量B由单片机送来,AMPA和BAMP均为运算放大器,输出电压V OUT通过2个10K电阻反馈到运算放大器AMPA输入端,其他如图2-7,可由基尔霍夫定律列出方程组,并解得

V OUT=(B-128)? V REF/128

由上式在选用+V REF时,如果输入数字量最高位b7为“1”时,则输出模拟电压V OUT为正;若输入数字量最高位b7为“0”时,则输出模拟电压V OUT为负。在选用-V REF时,输出值正好与+V REF选用时极性相反[4]。

图2-7 D/A转换电路图

2.3.2复位电路设计

1.使CPU开始工作的方法就是给CPU一个复位信号,复位信号结束后,CPU从程序存储器“0000H”开始执行程序。AT89S51高电平复位,复位的方式一般有三种[5]:第一:上电复位。接通电源时,单片机复位。

第二:手动复位。设置一个复位按钮,当操作者按下按钮时产生一个复位信号。

第三:自动复位。设计一个复位电路,当系统满足某一条件时自动产生一个复位信号。

而本系统采用的是手动复位,在系统需要出新设置,或者死机的时候,可以按下reset 键得意还原系统的状态。

2.复位电路与单片机的相连

毫无疑问复位键是与单片机的9好引脚相连,与接地之间连了10k电阻,与电源之间相连10uf的微波电容。

图2-8 复位电路图

2.4.3 按键电路设计

1.原理图如下

图2-9 采用查询方式对各类波的切换

2.说明:

KEY1:波形之间的切换,及占空比,频率的切换。

KEY2:在设置占空比和频率时,按下,数值会减少。

KEY3:在设置占空比和频率时,按下,数值会增加。

KEY4:确认键。

3.工作介绍

对于外部中断实现对波形的切换,当KEY1按下时,LCD 显示波形的名字的下面开始闪烁光标,再次按下进行波形之间的切换,按下KEY4键进行,开始切换占空比和频率,当切换到占空比时或者频率时,按下KEY3或者KEY4进行空比时或者频率的增加减少设置,最后再按下KEY4进行最后的确认,这时示波器里的波形应该已经发生了变化[6]。

4.按键与单片机的相连

按键KEY1,KEY2,KEY3,KEY4分别和单片机的P24,P25,P26,P27引脚相连,然后再分别通过一个4K 的电阻和电源相连。最后进行统一接地。

2.4.4 I/V转换电路设计

图2.10 I/V转换电路

1.说明:

实现I/V转换最简单的方法就是直接在1out1和Iout2之间跨界一电阻,这样就很容易的实现了I/V转换,但是这种方法忽略了一个阻抗问题。对于DAC0832来说,R的取值应尽可能大,能够保证获得更多的电压,对于与输出电压相连的后续电路来说,R的取值应尽可能的小,以降低输出阻抗,这两方面是矛盾的,所以这种方式欠合理。而合理的方式是应用运算放大器实现I/V转换,也解决了阻抗的问题[7]。

2.I/V转换电路与DAC0832的相连

一级功率放大器TL082的负引脚与DAC0832的11号引脚相连,正极接地,而二级功率放大器TL082的负极通过10K的电阻与DAC0832的8号引脚相连,正极也接地[8]。

第3章 软件设计

根据功能,系统软件设计分成几个模块编程:主程序模块,按键程序模块,锯齿波程

序模块,三角波程序模块,正弦波程序模块,方波程序模块,延时程序模块[9]。

3.1程序

1.程序流程图

图3-1 程序流程图

2.说明:程序中主要实现利用按键来控制不同波形的输出。

3.2按键程序模块

按键程序主要是讲四个按键如何工作的,工作的过程基本相同,这里我们重点对按键1进行详细介绍,其他按键工作原理基本不变[10]。

首先是进行键盘扫描扫描前,接键盘的引脚口拉高,这样发生什么变换,信号不至于紊乱,然后判断按键1是否按下,如果按下,进行判断FunctionCount (就是功能次序)如果按键触发的是FunctionCount1(功能1)那么就是送到LCD

上显示初始的频率,如果

是FunctionCount2那是显示的是占空比,程序如下:

void KeyScan(void) //独立键盘扫描子函数

{

KEYPORT |= 0xf0; //每次扫描前,先将接键盘的引脚口拉高

if(Key1 == 0) //如果检测到有键按下

{

Scan10MsDelay(); //延时10ms

if(Key1 == 0) //再次判断是否确实按下按键,进行消抖操作。

{ //功能键

FunctionCount++; // 功能计数器增加

if(FunctionCount == 3)// 如果是FunctionCount == 3那么显示//的是正

弦波

{

LCDCursor(); // 调入光标函数,光标写入

LCDDispString(8,1,"Sin");//因为FunctionCount == 3

} //所以LCD显示的是"Sin"

else if(FunctionCount == 4)// 如果是FunctionCount == 4那么

{ //显示的是方波

LCDCursor(); // 调入光标函数,光标写入

LCDDispString(8,1,"Squre ");// LCD显示的是" Squre "

}

else if(FunctionCount == 5)// 如果是FunctionCount == 5那么

{ //显示的是三角波

LCDCursor(); // 调入光标函数,光标写入

LCDDispString(8,1,"Triangle");// LCD显示的是"Sin"

} //

else if(FunctionCount == 6)// 如果是FunctionCount == 6那么

{ // LCD显示的是锯齿波

LCDCursor();//调入光标函数,光标写入

LCDDispString(8,1,"Sawtooth");// LCD显示的是" Sawtooth "

}

else if(FunctionCount == 1)// 如果是FunctionCount == 1那么

{ //显示的是频率

LCDDispNum(5,2,(FREofALL/10%10));// LCD显示的是FRE=?

LCDCursor(); //调入光标函数,光标写入

}

else if(FunctionCount == 2)// 如果是FunctionCount == 2那么

{ //显示的是占空比

LCDDispNum(13,2,(DUTYofALL/10%10));// LCD显示的是//DUTY=?

LCDCursor();//调入光标函数,光标写入

}

while(!Key1); //未松手时,不跳出循环,避免误检测

}

}

}

FunctionCount3到6是分别进行lcd显示正弦波,方波,三角波和锯齿波。通过按键控制整个系统,按键2和按键3是分别是增加和减少键,在设置占空比和频率的时候需要用到他们,而按键4是确认键,对于所以参数已经设置完毕的情况下按下确认键。由于功能简单,不是本论文的重点而且原理基本相同在这里就不阐述。

3.3 锯齿波程序模块

锯齿波是经过锯齿波函数进行SawtoothOut(unsigned char fre)来进行转换成数据量,再输出道D/A转换电路输出到示波器进行显示的波形[11]。

锯齿波是和三角波比较相似,他是由两个三角波叠加而成,所以,我们可以把锯齿波,看成是两个三角波。在处理锯齿波的时候,也是当三角波来处理,锯齿波是由函数来产生,我们只需要知道,最高点,和最低点以及占空比和频率,那么波形就能够实现。锯齿波的详细程序如下。

1.锯齿波函数的定义

void SawtoothOut(unsigned char fre) //定义锯齿波函数

{

SawtoothIncrement = fre; // 锯齿波的参数增加值等于频率值

FlagSawtooth = 1; // 锯齿波默认初始值为1

Count = 255;// 锯齿波函数的初始值为255

}

2.锯齿波函数的实现

if(FlagSawtooth == 1)// 判断是否是锯齿波,如果是才能继续

{

CountNumber++;// 增加次数计数器

if(CountNumber == 2)//就可以输出波

{CountNumber = 0;// 再次置0

Count = Count-SawtoothIncrement;//找到下一个点

if(Count < 0)//判断是否为0如果为0 了那么自动

Count = 255;//变为255

DATAOUTPUT = Count;//输出波

}

}

}

图3-2 锯齿波图

3.4三角波程序模块

三角波是经过锯齿波函数进行TriangleOut(unsigned char fre)来进行转换成数据量,再输出道D/A转换电路输出到示波器进行显示的波形[12]。

三角波,上面我们提过,与锯齿波原理相同,三角波是由函数来产生,我们只需要知道,最高点,和最低点以及占空比和频率,那么波形就能够实现。三角波的详细程序如下。

1.三角波函数的定义

void TriangleOut(unsigned char fre)//1--10HZ 2--20Hz 5--50Hz 10--100Hz

{

TriangleIncrement = fre; //三角波的参数增加值等于频率值

FlagTriangle = 1; //三角波默认初始值为1

}

2.三角波函数的实现

if(FlagTriangle == 1) 判断是否是锯齿波,如果是才能继续

{

CountNumber++;增加次数计数器

if(CountNumber == 2)//输出三角波

{

CountNumber = 0; 再次置0

Count = Count+TriangleIncrement;//找到下一个点

if(Count >= 256)// 判断是否为256如果为256 了那么自动

Count = 0;//变为0(256为最高点。0为最低点)

DATAOUTPUT = TableTriangle[Count];//输出波

}

}

图3-3 三角波图

3.5正玄波程序模块

正玄波是经过锯齿波函数进行SinOut(unsigned char fre)来进行转换成数据量,再输出道D/A转换电路输出到示波器进行显示的波形[13]。

正玄波是常用的波形,他的实现,需要依赖一个控制节点的函数,知道一个节点,通过计时器和变量的不断变化,这样就能得到下个节点,比如当在最低点的时候,通过一个节点增加变量。

1. 正玄波函数的定义

void SinOut(unsigned char fre)//1--10HZ 2--20Hz 5--50Hz 10--100Hz

{

SinIncrement = fre; 正玄波的参数增加值等于频率值

FlagSin = 1; 正弦标记置1也是初始值

}

2.正玄波函数的实现

if(FlagSin == 1)// 判断是正玄波flag是否等于1,如果是才能继续

{

CountNumber++;//增加次数计数器

if(CountNumber == 2)//输出正弦波

{

CountNumber = 0;// 再次置0

Count = Count+SinIncrement;//找到下一个点

if(Count >= 256)// 判断是否为256如果为256 了那么自动

Count = 0;//变为0

DATAOUTPUT = TableSin[Count];//输出波形

}

}

图3-4 正弦波图

3.6方波程序模块

方波是经过锯齿波函数进行void SqureOut(unsigned int fre,unsigned int duty)来进行转换成数据量,再输出道D/A转换电路输出到示波器进行显示的波形[14]。

方波主要是通过指定节点来进行波形的显示,每个节点是已经确定的值,方波和正玄波工作原理相似,节点都是在初始化的过程中定义的,方波的初始化如下:

static unsigned char code TableTriangle[256]={

128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,

160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,

192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,

224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,

255,254,252,250,248,246,244,242,240,238,236,234,232,230,228,226,

224,222,220,218,216,214,212,210,208,206,204,202,200,198,196,194,

192,190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,

160,158,156,154,152,150,148,146,144,142,140,138,136,134,132,130,

128,126,124,122,120,118,116,114,112,110,108,106,104,102,100, 98,

96, 94, 92, 90, 88, 86, 84, 82, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98,100,102,104,106,108,110,112,114,116,118,120,122,124,126 };

节点初始化完毕。

1.方波函数的定义

void SqureOut(unsigned int fre,unsigned int duty)//方波有两个变量{ //频率和占空比

TimerCount = 12550;// 初始计数器值为12550

TH0=(65536-TimerCount)/256; //最高点的初始值

TL0=(65536-TimerCount)%256;// 最低点的初始值

Count = 0;//

SqureCount = 20000/fre;//方波节点的得到,通过一个数学表达式得到SqureHigh = SqureCount*duty/100;//占空比也影响方波的显示

FlagSqure = 1; 方波的标记重新置1

}

2.方波函数的实现

if(FlagSqure == 1)// 判断是三角波flag是否等于1,如果是才能继续{

Count++;// 节点计数器开始计数

if(Count > SqureCount)//如果节点计数器的值大于SqureCount

{ //那么需要置0这样才能产生最低点

Count = 0;// 置0

DATAOUTPUT = 0xff;//显示在方波最低段的时候的一段波形}

if(Count > SqureHigh)//判断节点是否大于SqureHigh如果大于

{ //可以输出在最高点的一段波形

DATAOUTPUT = 0x00;// 输出波形

}

}

图3-5 方波图

相关主题