DAC的输出控制
班 级: 1221201
专 业: 测控技术与仪器
姓 名: xxxxx
学 号: xxxxx
指导老师: 周伟
东华理工大学
2015年1月12日
目 录
第1章系统设计方案………………………………………………………………………2
1.1 设计思路…………………………………………………………………………………2
1.2 方案比较与选择………………………………………………………………………....2
第2章系统硬件设计……………………………………………………………………….2.
2.1 主控制器电路……………………………………………………………………………2
2.2 数模转换电路……………………………………………………………………………3
第3章系统软件设计…………………………………………………………………….. .6
3.1 系统整体流程………………………………………………………………………….. .6
3.2 数模转换程序………………………………………………………………………….. .6
第4章系统调试…………………………………………………………………………… 8
4.1 proteus的调试……………………………………………………………………….......8
第5章结论与总结…………………………………………………………………………11
5.1 结论………………………………………………………………………………….......11
(系统总体设计与完成做一个总结,是客观的,主要包括:设计思路,设计过程,测试结果及完善改进的方向。)
5.2 总结……………………………………………………………………………………...11
(这是一个主观的总结,谈谈自己收获和不足等方面的内容。)
第1章系统设计方案
1.1 设计思路
(一)、课设需要各个波形的基本输出。如输出矩形波、锯齿波,正弦波。这些波形的实现的具体步骤:正弦波的实现是非常麻烦的。它的实现过程是通过定义一些数据,然后执行时直接输出定义的数据就可以了。然而为了实现100HZ的频率,终于发现,将总时间除了总步数,根据每步执行时间,算出延时时间,最终达到要求,然后建一个表通过查表来进行输出,这样主要工作任务就落到了建表的过程中。这样做的好处在于,查表所耗费的时钟周期相同,这样输出的点与点之间的距离就相等了,输出的波形行将更趋于完美,当然更让我们感到的高兴的是它输出波形的频率将近达到了100赫兹,能够满足我们设计的扩展要求了。而三角波,则每次累加1,当达到初值时,每次累减1,算出延时时间,也就达到要求了,矩形波和锯齿波类似。
(二)、这次做的三种波形可以相互转换,这个实现起来找了很多人最终发现,在每次循环之初进行扫描,而在每个中断入口处,对中断优先级进行设定,最终达到设计目的。
1.2 方案比较与选择
方案一:采用模拟电路搭建函数信号发生器,它可以同时产生方波、三角波、正弦波。但是这种模块产生的不能产生任意的波形(例如梯形波),并且频率调节很不方便。
方案二:采用锁相式频率合成器,利用锁相环,将压控振荡器(VCO)的输出频率锁定在所需频率上,该方案性能良好,但难以达到输出频率覆盖系数的要求,且电路复杂。
方案三:使用集成信号发生器发生芯片,例如AD9854,它可以生成最高几十MHZ的波形。但是该方案也不能产生任意波形(例如梯形波),并且价格昂贵。
方案四:采用AT89C51单片机和DAC0832数模转换器生成波形,加上一个低通滤波器,生成的波形比较纯净。它的特点是可产生任意波形,频率容易调节,频率能达到设计的500HZ以上。性能高,在低频范围内稳定性好、操作方便、体积小、耗电少。
经比较,方案四既可满足课程设计的基本要求又能充分发挥其优势,电路简单,易控制,性价比高,所以采用该方案.
第2章系统硬件设计
2.1 主控制器电路
89C52可编程并行接口芯片有三个输入输出端口,即A口、B口和C口,对应于引脚PA7~PA0、PB7~PB0和PC7~PC0。其内部还有一个控制寄存器,即控制口。通常A口、B口作为输入输出的数据端口。C口作为控制或状态信息的端口,它在方式字的控制下,可以分成4位的端口,每个端口包含一个4位锁存器。它们分别与端口A/B配合使用,可以用作控制信号输出或作为状态信号输入。
89C52可编程并行接口芯片工作方式说明:
方式0:基本输入/输出方式。适用于三个端口中的任何一个。每一个端口都可以用作输入或输出。输出可被锁存,输入不能锁存。 方式1:选通输入/输出方式。这时A口或B口的8位外设线用作输入或输出,C口的4条线中三条用作数据传输的联络信号和中断请求信号。方式2:双向总线方式。只有A口具备双向总线方式,8位外设线用作输入或输出,此时C口的5条线用作通讯联络信号和中断请求信号。
u 原理框图:
硬件设计
2.2 数模转换电路
由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有8位分辨率的数模转换器DAC0832。DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。
1、DAC0832的引脚及功能:
DAC0832是8分辨率的D/A转换集成芯片。与微处理器兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
u 各引脚功能说明:
D0~D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);
ILE:数据锁存允许控制信号输入线,高电平有效;
CS:片选信号输入线(选通数据锁存器),低电平有效;
WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化;
IOUT2:电流输出端2,其值与IOUT1值之和为一常数;
Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
Vcc:电源输入端,Vcc的范围为+5V~+15V;
VREF:基准电压输入线,VREF的范围为-10V~+10V;
AGND:模拟信号地
DGND:数字信号地
u DAC0832三种数据输入方式:
(1)双缓冲方式:即数据经过双重缓冲后再送入D/A转换电路,执行两次写操作才能完成一次D/A转换。这种方式可在D/A转换的同时,进行下一个数据的输入,可提高转换速率。更为重要的是,这种方式特别适用于要求同时输出多个模拟量的场合。此时,要用多片DAC0832组成模拟输出系统,每片对应一个模拟量。
(2)单缓冲方式:不需要多个模拟量同时输出时,可采用此种方式。此时两个寄存器之一处于直通状态,输入数据只经过一级缓冲送入D/A转换电路。这种方式只需执行一次写操作,即可完成D/A转换。
(3)直通方式:此时两个寄存器均处于直通状态,因此要将、、和端都接数字地,ILE接高电平,使LE1、LE2均为高电平,致使两个锁存寄存器同时处于放行直通状态,数据直接送入D/A转换电路进行D/A转换。这种方式可用于一些不采用微机的控制系统中或其他不须0832缓冲数据的情况。
第3章系统软件设计
3.1 系统整体流程
3.2 数模转换程序
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define DAC0832 P2
#define ALL 65536
#define Fosc 12000000
uchar TH_0,TL_0,flag1,flag=0;
uint FREQ=100,num;
float temp;
uchar code sin_num[]={
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2,
2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,
10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21,
22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37,
38, 39, 40, 41, 42, 44, 45, 46, 47, 49, 50, 51, 52, 54, 55, 56,
57, 59, 60, 61, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78,
80, 81, 83, 84, 86, 87, 89, 90, 92, 93, 95, 96, 98, 99, 101,102,
104, 106,107, 109, 110, 112, 113, 115, 116, 118, 120, 121, 123, 124, 126, 128,
129, 131, 132, 134, 135, 137, 139, 140, 142, 143, 145, 146, 148, 149, 151, 153,
154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 169, 171, 172, 174, 175, 177,
178, 180, 181, 182, 184, 185, 187, 188, 189, 191, 192, 194, 195, 196, 198, 199,
200, 201, 203, 204, 205, 206, 208, 209, 210, 211, 213, 214, 215, 216, 217, 218,
219, 220, 221, 223, 224, 225, 226, 227, 228, 229, 230, 230, 231, 232, 233, 234,
235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 243, 243, 244, 245, 245, 246,
246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253,
253, 253, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255
};
sbit cs=P3^6;
sbit change1=P3^2;
sbit change2=P3^1;
sbit change3=P3^0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD=0X01;
temp=ALL-Fosc/12.0/256/FREQ;
TH_0=(uint)temp/256;
TL_0=(uint)temp%256;
EA=1;
EX0=1;
IT0=1;
ET0=1;
TR0=1;
}
void changefreq(void)
{
if(change==0)
{flag++; if(flag==4) {flag=0;num=0;}}
TH_0=(uint)temp/256;
TL_0=(uint)temp%256;
}
void sanjiaobo(void)
{
for(num=0;num<255;num++)
{cs=0;DAC0832=num;cs=1;}
for(num=255;num>0;--num)
{cs=0;DAC0832=num;cs=1;}
}
void fangbo(void)
{
cs=0;DAC0832=0XFF;cs=1;
for(num=0;num<255;num++);
cs=0;DAC0832=0X00;cs=1;
for(num=255;num>0;num--);
}
void juchibo(void)
{
cs=0;DAC0832=++num;cs=1;
}
void zhengxianbo(void)
{
for(num=0;num<255;num++)
{cs=0;DAC0832=sin_num[num];cs=1;}
for(num=255;num>0;num--)
{cs=0;DAC0832=sin_num[num];cs=1;}
}
void ext0() interrupt 0
{
changefreq();
}
void timer0() interrupt 1
{
TH0=TH_0;TL0=TL_0;
TR0=0;
switch(flag)
{
case 0: {sanjiaobo();TR0=1;break;}
case 1: {fangbo();TR0=1;break;}
case 2: {juchibo();TR0=1;break;}
case 3: {zhengxianbo();TR0=1;break;}
default: ;
}
}
void main()
{
init();
while(1);
}
第4章系统调试
4.1 proteus的调试
矩形波
锯齿波
正弦波
第5章结论与总结
5.1 结论
基于单片机的信号发生器设计,这个信号发生器的设计中涉及到一个典型的控制过程。通过单片机控制一个数模转换器DAC0832产生所需要的电流,然后使用运算放大器LM324可以将其电流输出线性地转换成电压输出,再将电压经过运算放大器的放大,可以得到足够幅度的信号。通过程序的控制,可以产生一系列有规律的波形。
有了大概思路后,我就开始连接硬件电路。首先,我先根据要求找好了需要的原件,单片机AT89C52用作主控制模块;然后再连好数模转换电路这一块;再者把这两段组合在一起,就完成了一个简单硬件电路。最后根据连好电路写出所需程序,运行成功后形成Hex文件。再用自己连好的仿真图运行,如果运行正常,就可以得到我们需要的波形。按键可以切换波形和改变频率幅度的大小。
虽然波形图基本可以实现,但电路图还存在一些问题。就放大电路这块来说,我个人只用了一个放大器,反馈电路用的正向放大,幅度调节不明显。我后来就增大了放大倍数,效果相比较好了很多
5.2 总结
课设开始的时候由于没有经验,不知从何下手,所以就上网搜了很多关于信号发生器的资料,并翻阅了一些相关书籍。经过将近两周的单片机课程设计,终于完成了我的DAC输出控制的设计,基本达到设计要求,从心底里来说,还是很高兴的,但高兴之余不得不深思呀!
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。因此在整个设计过程中大部分时间是用在程序上面的。很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对单片机的结构很熟悉。因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。
要设计一个成功的电路,必须要有耐心,要有坚持的毅力。在整个电路的设计过程中,花费时间最多的是各个单元电路的连接及电路的细节设计上,如在多种方案的选择中,我仔细比较分析其原理以及可行的原因。这就要求我们对硬件系统中各组件部分有充分透彻的理解和研究,并能对之灵活应用。完成这次设计后,我在书本理论知识的基础上又有了更深层次的理解。
同时在本次设计的过程中,我还学会了高效率的查阅资料、运用工具书、利用网络查找资料。我发现,在我们所使用的书籍上有一些知识在实际应用中其实并不是十分理想,各种参数都需要自己去调整。偶而还会遇到错误的资料现象,这就要求我们应更加注重实践环节。