功能:
将波形样值的编码转换成模拟值,完成波形输出。
由一片0832和TL082运放组成。
DAC0832是具有20条引线的CMOS器件,它内部具有两级数据寄存器,完成8为电流D/A转换,固不需要外加电路,输出波形为正负电压,0832是电流输出型,示波器上显示的波形,通常需要电压信号,电流信号到电压信号的额转换可以由运算放大器TL082实现。
在D/A转换电路中,很重要的一个参数就是基准电压<参考电压),设计中要求的最大幅值电压为12V,系统可以选用正负15V作为运算放大器供电的电源,同时用正15V作为DAC0832的基准电压。
单片机向0832发送数字编码,产生不同的输出。
利用采样定理,8位D/A转换器对应-15V~15V的电压输出,其输入数字量应为00H~FFH。
在-15V~15V的电压范围内产生波形,方波一个周期分成两个点,一个时钟中断向89C51送一个点,经过D/A转换后输出就可以得到方波。
数字编码0x7f,0x90,0xa1,0xb2,0xc3,0xd4,0xe5分别对应D/A输出的0V,2V,4V,6V,8V,10V,12V。
单片机的晶振控制输出周期的速度,也就是控制输出的波形频率。
这样输出的方波幅值和频率都得到控制。
三、课设所需设备及芯片功能介绍
1.所需设备
单片机最小开发系统,1602液晶屏一块,DAC0832一片,Tl082集成运放一片,PC机一台,其他器件任选。
2.芯片功能介绍
8位D/A转换器DAC0832简介:
DAC0832当今世界在以电子信是8位分辨率的D/A转换集成芯片,与微处理器完全兼容,这个系列的芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到了广泛的应用。
这类D/A转换器由8位输入锁存器,8位DAC寄存器,8位DA转换电路及转换控制电路构成。
1、DAC0832的引脚及功能:
DAC0832芯片是一种具有两个输入数据寄存器的8位DAC,它能直接与MCS51单片机接口,其主要特性参数如下:
·分辨率为8位;
·电流稳定时间1us。
·可单缓冲、双缓冲或直接数字输入;
·只需在满量程和下调整其线性度;
·单一电源供电<+5V~+15V);
·低功耗,200mW。
为便于DAC0832的使用,特将其应用特性总结如下:
·DAC0832是微处理器兼容型D/A转换器,可以充分利用微处理器的控制能力实现对D/A转换的控制。
这种芯片有许多控制引脚,可以和微处理器控制线相连,接受微处理器的控制,如ILE、/CS、/WR1、/WR2、/XFER端。
·有两级锁存控制功能,能够实现多通道D/A的同步转换输出。
·DAC0832内部无参考电压源;须外接参考电压源。
·DAC0832为电流输入型D/A转换器,要获得模拟电压输出时,需要外加转换电路。
DAC0832的引脚图及逻辑结构如下图:
图1DAC0832结构框图及引脚排列
DAC0832各引脚的功能如下:
DI0~DI7:
数据输入线。
ILE:
数据允许锁存信号,高电平有效;
/CS:
输入寄存器选择信号,低电平有效。
/WR1为输入寄存器的写选通信号。
输入寄存器的锁存信号/LE1由ILE、/CS、/WR1的逻辑组合产生。
当ILE为高电平、/CS为低电平、/WR1输入负脉冲时,在/LE1产生正脉冲;/LE1为高电平,输入锁存器的状态随数据输入线的状态变化,/LE1的负跳变将数据线上的信息锁入输入寄存器。
/XFER:
数据传送信号,低电平有效。
/WR2为DAC寄存器的写选通信号。
DAC寄存器的锁存信号/LE2,由/XEFR、/WR2的逻辑组合产生。
当/XFER为低电平,/WR2输入负脉冲,则在/LE2产生正脉冲;/LE2为高电平是时,DAC寄存器的输出和输入寄存器的状态一致,/LE2负跳变,输入寄存器的内容打入DAC寄存器。
VREF:
基准电源输入引脚。
Rfb:
反馈信号输入引脚,反馈电阻在芯片内部。
IOUT1、IOUT2:
电流输出引脚。
电流IOUT1、IOUT2的和为常数,IOUT1、IOUT2随DAC寄存器的内容线性变化。
VCC:
电源输入引脚。
AGND:
模拟信号地
DGND:
数字地。
2、DAC0832三种数据输入方式:
<1)双缓冲方式:
即数据经过双重缓冲后再送入D/A转换电路,执行两次写操作才能完成一次D/A转换。
这种方式可在D/A转换的同时,进行下一个数据的输入,可提高转换速率。
更为重要的是,这种方式特别适用于要求同时输出
多个模拟量的场合。
此时,要用多片DAC0832组成模拟输出系统,每片对应一个模拟量。
<2)单缓冲方式:
不需要多个模拟量同时输出时,可采用此种方式。
此时两个寄存器之一处于直通状态,输入数据只经过一级缓冲送入D/A转换电路。
这种方式只需执行一次写操作,即可完成D/A转换。
<3)直通方式:
此时两个寄存器均处于直通状态,因此要将
、
、
和
端都接数字地,ILE接高电平,使LE1、LE2均为高电平,致使两个锁存寄存器同时处于放行直通状态,数据直接送入D/A转换电路进行D/A转换。
这种方式可用于一些不采用微机的控制系统中或其他不须0832缓冲数据的情况。
四. 程序编写
#include
#include
#include"LCD_1602_H.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineDAdataP1
ucharcodea[6][7]={"1000.00",//频率显示
"0100.00",
"0010.00",
"0001.00",
"0000.10",
"0000.05"}。
ucharcodeSquaretab[7][2]={//输出的幅度数组
{0x7f,0x7f},//0V
{0x90,0x6e},//正负2V
{0xa1,0x5d},//正负4V
{0xb2,0x4c},//正负6V
{0xc3,0x3b},//正负8V
{0xd4,0x2a},//正负10V
{0xe5,0x19}}。
//正负12V
ucharcodedisp1[]={"Voltage:
000V"}。
ucharcodedisp2[]={"Frq:
0000000.00Hz"}。
uinti,num,k,freq=0。
ucharcount,s。
ucharkeytemp=0,keytemp2=0。
sbitDA=P2^3。
sbitWR1=P2^4。
sbitkey1=P2^5。
sbitkey2=P2^6。
sbitkey3=P2^7。
voiddelay(uintz>
{
uinti,j。
for(i=z。
i>0。
i-->
for(j=110。
j>0。
j-->。
}
voidT0_time(>interrupt1
{
TH0=(65536-1000>/256。
//定时器装初值精确到1mS
TL0=(65536-1000>%256。
num++。
}
voidkey1_ctr_frq(>//调频控制按键
{
if(key1==0>
{
TR0=0。
_nop_(>。
if(key1==0>
{
keytemp++。
while(!
key1>
{
TR0=1。
if(keytemp==1>//通过按键按下的次数控制频率
{
freq=1。
//选择频率1KHz
}//while
if(keytemp==2>//选择频率100Hz
{
freq=10。
}
if(keytemp==3>//选择频率10Hz
{
freq=100。
}
if(keytemp==4>//选择频率1HZ
{
freq=1000。
}
if(keytemp==5>//选择频率0.1Hz
{
freq=10000。
}
if(keytemp==6>//选择频率0.05HZ
{
freq=20000。
}
if(keytemp>=6>keytemp=1。
write_1602_com(0xc0+7>。
for(k=0。
k<7。
k++>
{
write_1602_data(a[keytemp][k]>。
delay(2>。
}//FOR
}
}
}
}
voidkey2_ctr_vol(>//调幅控制按键
{//控制幅值分别为0V、2V、4V、6V、8V、10V、12V
ucharshi,ge,vol。
if(key2==0>//功能按键
{TR0=0。
_nop_(>。
//精确延时1uS
if(key2==0>
{
keytemp2++。
while(!
key2>
{
TR0=1。
vol=keytemp2*2。
shi=vol/10。
ge=vol%10。
write_1602_com(0x80+12>。
write_1602_data(0x30+shi>。
write_1602_data(0x30+ge>。
if(keytemp2>=7>
{
keytemp2=0。
}
}
}
}
}
voidkey3_ctr(>//总控制按键
{
if(key3==0>//功能按键
{
TR0=0。
_nop_(>。
//精确延时1uS
if(key3==0>
{
delay(2>。
while(!
key3>
{
s++。
//if(s==2>DA=1。
if(s>=2>s=1。
}
}
}
}
voidinit(>
{
TMOD=0X01。
//设定定时器0为工作方式1
TH0=(65536-1000>/256。
//进行1ms的精确定时
TL0=(65536-1000>%256。
//定时器装初值
EA=1。
//开总中断
ET0=1。
//开定时器0中断
TR0=1。
init_1602(>。
}
voidmain(>
{
DAdata=0x00。
DA=0。
WR1=0。
init(>。
display_1602(0x80,disp1>。
_nop_(>。
display_1602(0x80+0x40,disp2>。
_nop_(>。
while(1>
{
key3_ctr(>。
//if(count==2>count=0。
if(s==1>//总控制按键
{
key1_ctr_frq(>。
key2_ctr_vol(>。
_nop_(>。
if(num==freq>//选频
{
num=0。
count++。
if(count==2>count=0。
switch(keytemp2>
{
case0:
DAdata=Squaretab[0][count]。
break。
case1:
DAdata=Squaretab[1][count]。
break。
case2:
DAdata=Squaretab[2][count]。
break。
case3:
DAdata=Squaretab[3][count]。
break。
case4:
DAdata=Squaretab[4][count]。
break。
case5:
DAdata=Squaretab[5][count]。
break。
case6:
DAdata=Squaretab[6][count]。
break。
}//endSWITCH
}//endif
}//endif
}//endwhile
}//endmain
/////////////////////
液晶1602的初始化程序
#ifndefLCD_1602_H
#defineLCD_1602_H
#defineucharunsignedchar
#defineuintunsignedint
ucharcom_1602,date_1602。
sbitlcd_1602_rs=P2^0。
sbitlcd_1602_rw=P2^1。
sbitlcd_1602_en=P2^2。
sbitlcd_busy=P0^7。
voiddelay_1602(uintx>//延时子函数
{
uinti,j。
for(i=x。
i>0。
i-->
for(j=110。
j>0。
j-->。
}
voidwrite_1602_com(ucharcom_1602>
{lcd_busy=0。
lcd_1602_rs=0。
//选择写命令模式
P0=com_1602。
delay_1602(5>。
//稍做延时以待数据稳定
lcd_1602_en=1。
//使能端给一高脉冲,因为初始化函数中已经将lcden置为0
delay_1602(5>。
//稍做延时
lcd_1602_en=0。
//将使能端置0,以完成高脉冲
}
voidwrite_1602_data(uchardate_1602>
{lcd_busy=0。
lcd_1602_rs=1。
P0=date_1602。
delay_1602(5>。
lcd_1602_en=1。
delay_1602(5>。
lcd_1602_en=0。
}
voiddisplay_1602(ucharaddr,uchar*temp>
{
uchari。
write_1602_com(addr>。
delay_1602(5>。
for(i=0。
i<16。
i++>
{
write_1602_data(temp[i]>。
delay_1602(5>。
}
}
voidinit_1602(void>
{
lcd_1602_rs=0。
//清除读操作
lcd_1602_rw=0。
//初始化写操作
lcd_1602_en=1。
delay_1602(10>。
write_1602_com(0x01>。
delay_1602(10>。
write_1602_com(0x02>。
//光标归位,此处不设置可能出现错误
write_1602_com(0x38>。
//设置16X2显示,5X7点阵,8位数据接口
write_1602_com(0x0c>。
//设置开显示,且显示光标并闪烁
write_1602_com(0x06>。
//写一字符后光标自动加一
}
五、系统调试与测试结果
1.硬件调试
整个硬件调试过程基本顺利,由于采用了分单元模块制作,各单元电路工作稳定,给调试工作带来很大的方便。
1.1放大模块部分在实物模拟时,出现发送信号不稳定、跳变的问题。
经过仔细检查电路线路路径和连线问题,最终发现PCB板子上某些连线存在断路的问题,于是用焊锡焊好,从而得以解决。
1.2调试过程中,由于某些元器件参数的问题,在频率要求上没有达到预期效果,频率最低未能达到0.01H,最高也不能达到100KHZ。
各单元调试通过以后,进行整机调试,调试结果显示,整个系统能够正常工作。
2.软件调试
由于对51系列单片机编程不是很熟悉,在软件的仿真调试过程中请同学帮了忙,在同学的帮助和指导下,调试也顺利完成。
3.调试结果
3.1液晶显示结果图
3.2方波波形图
3.3三角波波形
3.4正弦波波形
3.5实验结果与实际要求对比
3.5.1经液晶显示可得频率范围为0.05Hz~1KHz,频率调节分度为0.01HZ,最大频率和最小频率都没有达到老师的要求,经分析原因是元器件参数的选择原因,焊接电路板时由于找不到7.5K的电阻,就用了8K的电阻代替了。
所以最大频率和最小频率都没有达到老师的要求。
3.5.2具有输出频率设定与显示功能,显示位数为9位;输出波形的占空比应在47%~53%之间;输出幅度为0~12V,分级可调,且能显示幅度,幅度与频率显示交替进行;这三点要求均基本达到。
3.3.3由示波器观察到的方波图形可得的方波稳定准确度高,失真少,只是有一些杂波干扰。
3.5.4频率温度度:
10-6/天;输出信号上升时间<100ns,下降时间<50ns;输出阻抗<75Ω。
这三个要求由于验证不方便,所以没有检测。
3.6设计和调试遇到的主要问题
3.6.1设计时的主要问题是软件方案上,涉及到51单片机编程,由于没有学单片机,对单片机不熟悉,所以编程时很迷茫,这一大模块是在同学的帮助下得以顺利完成的。
3.6.2第一次观察波形时,达到的波形很不稳定,而且不像方波,仔细检查线路才发现PCB板上某些地方由于洗板子时不小心断路了,用焊锡焊接好后,得到了精确度比较高的方波。
六、实验心得
两周的专业综合设计结束了,本次课程设计题目是数字式波形发生器的设计,虽然设计的时间不是很长,但在这短短的两周时间里确实使我学到了很多东西,在李老师的细心教导和同学的帮助下,我初步学会了使用单片机进行编程,也知道了一个单片机的工作过程,与此同时,还在对一些硬件的使用上,电路板的设计上有了很大的进步,对今后的学习有很大的帮助。
设计刚开始时,我通过老师和同学给的教案讲义,学习了本次使用单片机系统的基本工作原理,了解它的强大功能,用了两天的时间学习初步了解了用C语言对单片机进行编程以及进一步复习了数模转换的工作原理,在老师的指导和同学的指点下,很顺利的完成了这个步骤。
其次,我们要进行的就是编写其它部分的程序,主要是按照设计的任务