论文正文.docx
《论文正文.docx》由会员分享,可在线阅读,更多相关《论文正文.docx(41页珍藏版)》请在冰豆网上搜索。
论文正文
1引言
在电子行业的基础设施和制造等领域,波形发生器都是有效的通用仪器。
它可以生成不同频率和幅度的大量信号,用来评估新电路的运行情况,代替时钟信号,对新产品进行制造测试,及用于许多其它用途。
在教学中同样起着不可忽视的作用,所以我做了此设计。
这个设计是基于信号发生芯片MAX038的多功能波形发生器。
由MAX038、D\A转换,MAX414运算放大器、LCD12864显示、单片机以及外围电路构成的多波形发生器。
2系统设计
2.1设计要求
(1)具有产生正弦波、方波、三角波等几种周期性波形的功能。
(2)输出波形的频率范围为1Hz~2.4MHz,重复频率可调,频率步进间隔≤100Hz。
(3)输出波形的幅度范围0~5V(峰-峰值),可按步进0.1V(峰-峰值)调整。
(4)输出显示波形的型类、周期和幅度的功能。
(5)增加稳幅输出功能,当负载变化时,输出电压幅度变化≤±3%。
2.2总体设计
2.2.1设计思路
题目要求设计一个波形发生器,波形发生器的输出为正弦波、方波、三角波和锯齿波。
设计中利用MAX038单片函数信号发生器的特性,产生各种波形。
输入部分采用运算放大器对微弱信号进行放大使波形易于观察。
控制部分用单片机和键盘组成的人机交互控制界面。
采样部分采用运算放大器和A/D转换芯片。
而显示部分则用带字库的液晶模块LCD12864,LCD12864可以直观显示波形的型类、频率、幅度和占空比等功能。
2.2.2设计选择
(1)波形发生电路的设计选择
利用单片集成芯片实现函数信号发生器。
这种信号发生器能产生多种波形信号且达到较高频率,且易于调试,成本低。
所以从性能和制作成本考虑,本设计采用单片机控制键盘输入通过D/A转换控制单片函数信号发生芯片MAX038产生可调频率、幅度和占空比的波形信号。
(2)开关电路的设计选择
采用电子模拟开关,模拟开关是一种三稳态电路,它可以根据选通端的电平,决定输人端与输出端的状态。
当选通端处在选通状态时,输出端的状态取决于输人端的状态;当选通端处于截止状态时,则不管输人端电平如何,输出端都呈高阻状态。
模拟开关在电子设备中主要起接通信号或断开信号的作用。
由于模拟开关具有功耗低、速度快、无机械触点、体积小和使用寿命长等特点。
其内部电路组成和工作原理如图1
图1模拟开关的电路组成和工作原理
本设计技术要求波型选择开关响应速度快,所以采用电子模拟开关,使用8选1模拟开关CD4051。
(3)D/A转换器的设计选择
按照输出类型的不同可以分为电压输出型和电流输出型器件。
电压输出型D/A转换器采用内置的输出放大器来实现低阻抗的输出,没有放大部分的延迟,可以做到很高的速度且一般用于高阻抗负载的情况下。
电流输出型D/A转换器则用得较少;按照接口类型的不同可以分为串行输出和并行输出器件。
并行D/A转换器的转换速度快,但占用I/O多。
串行D/A转换器输出建立时间相对于并行D/A转换器稍长,但芯片与CPU连接时使用引线少、电路简单,成本低;按照数字量的位数可以分为8位、10位、12位、16位等D/A转换器,位数越大分辨率越大但相应的成本也越高。
综上所述,选择性价比较好的D/A转换器,本设计采用Maxim公司的8位串行电压输出型D/A转换器MAX517。
(4)信号采样电路的设计选择
采用并行A/D转换芯片,并行方式一般在转换后可直接接收,转换时间快但使用芯片的引脚比较多;采用串行A/D转换芯片,串行方式所用芯片引脚少,封装小,在PCB板上占用的空间也小,但需要软件处理才能得到所需的数据。
综上所述,结合本设计对数据采样的各项要求和单片机引脚的具体情况,采用TI公司的8位串行A/D转换芯片TLC549.通过单片机AT89S52产生满足时序要求的输入/输出时钟,以及对A/D芯片的片选控制,完成对整个A/D转换过程的控制。
TLC549具有8位分辨率模数转换,最大转换时间为17us,每秒访问和转换最多可达40000次,功耗低,可以满足本设计要求。
(5)显示方式的设计选择
采用带字库的液晶模块LCD12864显示。
可以显示字符、图片,利用单片机直接驱动液晶显示模块,设计简单,且显示界面宽大美观舒适,耗电小。
本设计要显示的内容较多,所以选择采用LCD12864实时显示波形的型类、频率、占空比和幅度等功能。
(6)电源模块的设计选择
采用环形变压器,与普通变压器相比激磁能量和铁心损耗将减少25%,电效率高达95%以上,漏磁小,电磁辐射小,振动噪声小,无需另加屏蔽层来屏蔽电磁干扰,适合用在高灵敏度和易受高频影响的电子设备上。
加上三端固定稳压器获得±5V电源,+5V用LM7805输出,-5V用LM7905输出,先在变压器的输出段用一个用整流二极管组成的整流桥整流,再用电容滤掉高频成分,这样就可以获得一个纹波系数小、稳定的电压。
综上所述,采用环形变压器三端稳压器电路。
2.2.3系统组成
经过以上方案的比较和论证,最终确定的系统组成框图如图2所示。
图2系统组成框图
3单元电路设计
3.1MAX038波形发生电路模块
MAX038的外围电路如下图所示,引脚A0、A1接单片机I/O口,引脚COSC接电容选择电路的X引脚,引脚REF是输出正2.5V电压,用作控制占空比的D/A转换器的基准电压输入,IN引脚是频率控制引脚,通过一个25K电阻与D/A转换器输出端相连。
图3MAX038外围电路图
若负载是容性较大的负载,则MAX038的输出端与一个50Ω的电阻相连。
由于MAX038的输出信号为恒定的2V(P-P),且输出电流不高,所以必须依靠输出级的放大电路来提供足够的输出电压和电流,由放大电路和A/D转换芯片组成数据采样系统则可以实现数据采样。
所以设计应该满足以下要求:
(1)首先,要求放大电路具有很高的频宽。
因为输出信号最大基频为20MHz,三角波和矩形波的高次谐波成分很高,只有高频宽才能得到不失真的输出波形。
(2)其次,高频大信号放大要求放大电路有足够的输出电压转换速率。
(3)另外,要带动低阻负载,放大电路的电流输出能力也是个重要参数。
要在100
的负载上输出6V信号,则放大器至少要有60mA的连续电流输出能力。
3.2CD4051模拟开关电路
CD4051开关电路见图4。
CD4051相当于一个单刀八掷开关,开关接通哪一通道,由输入的3位地址码ABC来决定。
其真值表见表1。
“EN”是禁止端,当“EN”=1时,各通道均不接通。
此外,CD4051还设有另外一个电源端VEE,以作为电平位移时使用,从而使得通常在单组电源供电条件下工作的CMOS电路所提供的数字信号能直接控制这种多路开关,并使这种多路开关可传输峰-峰值达15V的交流信号。
图4CD4051模拟开关电路
表1真值表
输入状态
接通通道
EN
C
B
A
0
0
0
0
“0”
0
0
0
1
“1”
0
0
1
0
“2”
0
0
1
1
“3”
0
1
0
0
“4”
0
1
0
1
“5”
0
1
1
0
“6”
0
1
1
1
“7”
1
均不接通
3.3D/A转换电路模块
D/A转换电路由2片MAX517及外围电路组成,分别与MAX038的IN引脚和DADJ引脚相连,如图5,其中与DADJ相连的D/A转换器是双极性输出。
为了保证D/A转换器总线在空余方式为高电平,所以接上拉电阻。
另MAX517A为调节占空比输出,所以要用双极性接法,运算放大器采用的是MAX414是美信公司的4路输出精密运算放大器,。
D/A模块转换选用2路用于双极性输出正负电压的转换。
图5D/A转换电路模块图
3.4输出信号采样电路模块设计
输出信号采样电路模块设计由一片MAX414和TLC549构成,分别与单片机P3.5、P3.6和P3.7脚连接,如图6,其中MAX414将输出 模拟信号放大,模拟输入信号(ANALOGIN)经过TLC549内部采样/保持器至8-bit逐次比较式A/D转换器。
片选控制端(CS_,低有效)和输入/输出时钟端(I/OCLOCK)与独立的内部系统时钟通过内部逻辑控制电路,实现外部接口与内部的数据传输,通过单片机从而实现波形幅度的控制。
如图6输出信号采样电路模块设计
3.5LCD12864显示电路设计
采用带字库的点阵图形液晶模块LCD12864,可以显示汉字、字符和图形等。
且功耗很低,显示效果美观。
LCD12864的D0~D7接单片机P0口,RS、RW和LCDEN分别接P2.0、P2.1和P2.2口。
可调电阻RP21用来调节LCD显示屏的亮度。
PSB接高电平,表示这里采用的是并行数据控制方式。
图7LCD12864显示电路设计
3.64*4矩阵键盘输入电路模块
输入电路模块采用4*4矩阵键盘输入,如图8,行列分别与单片机的P1口连接。
按键设置在行、列线的交点上,行、列线分别连接到按键开关的两端。
对键盘的工作过程可分两步:
第一步是CPU首先检测键盘上是否有键按下;第二步是消抖;第三步是识别是哪一个键按下。
检测键盘上有无键按下可采用查询工作方式、定时扫描工作方式和中断工作方式。
图84*4矩阵键盘输入电路
3.7电源模块的设计
电源电路是用环形变压器三端固定稳压器获得±5V电源,+5V用7805输出,-5V用7905输出,环形变压器的电压经过三端固定稳压器,再经整流桥整流,用电容滤掉高频成分。
如图9:
图9±5V稳压电源电路
4系统软件设计及分析
4.1系统流程分析
4*4键盘输入全部用作功能键,键盘具体划分如下:
第一行主要功能是占空比调节,有微调加1、粗调减5、粗调加5、占空比50%;第二行主要功能是频率的调节,有频段选择,微调加1,粗调加10,微调减1;第三行实现其他功能,有波形选择,幅度刷新。
先输入功能键然后按照要求执行程序。
其中D2是选择MAX038产生的波形,D1是计算和输出频率,D0是控制波形占空比,单片机通过CD4051控制频段范围,在选择的频段范围内通过设定的按键步进调节就可以得到需要的信号。
频率数值设定在10~2.4MHz范围内直接送到LCD12864显示。
表2波形选择关系
波形选择逻辑关系表
数值
A0
A1
输出波形
0
0
0
方波,脉冲波
1
X
1
正弦波
2
1
1
三角波,锯齿波
表2键盘界面
键盘操作界面
微调+
粗调-
粗调+
占空比50%
频段
微调+
粗调+
微调-
波形
幅度刷新
首先由
=
/
,电流
由0.5V~5V通过电阻R12=25K,得到20~200μA的电流,抛开重叠的频段不计,
表3MAX038频率范围及电容关系图
在D/A转换部分和波形发生部分则根据以下公式计算:
控制频率D/A转换器公式:
控制占空比D/A转换器公式:
电路的振荡频率为:
=
(1-0.2915
)=
(1-0.2915
)/
波形占空比为:
由于电路原因以及程序问题,设计的波形发生器产生的波形的占空比、频率、振幅等不可能如理论那么准确。
4.2主体程序流程图
图10程序流程图
4.3部分程序
4.3.1D/A转换原理程序
/*************************************
控制频率的串行MAX517的函数
*************************************/
/*起始条件子函数*/
voidstart0(void)
{
SDA0=1;
SCL0=1;
_nop_();
SDA0=0;
_nop_();
}
/*停止条件子函数*/
voidstop0(void)
{
SDA0=0;
SCL0=1;
_nop_();
SDA0=1;
_nop_();
}
/*应答子函数*/
voidack0(void)
{
SDA0=0;
_nop_();
SCL0=1;
_nop_();
SCL0=0;
}
/*发送数据子程序,ch为要发送的数据*/
voidsendda0(ucharch)
{
ucharBitCounter=8;//位数控制
uchartmp;//中间变量控制
do
{
tmp=ch;
SCL0=0;
if((tmp&0x80)==0x80)//如果最高位是1
SDA0=1;
else
SDA0=0;
SCL0=1;
tmp=ch<<1;//左移
ch=tmp;
BitCounter--;
}
while(BitCounter);
SCL0=0;
}
/*串行DA转换子函数*/
voiddacout0(ucharch)
{
start0();//发送启动信号
sendda0(0x58);//发送地址字节
ack0();
sendda0(0x00);//发送命令字节
ack0();
sendda0(ch);//发送数据字节
ack0();
stop0();//结束一次转换
}
4.3.2占空比调节程序
/*************************************
控制占空比的串行MAX517的函数
*************************************/
/*起始条件子函数*/
voidstart1(void)
{
SDA1=1;
SCL1=1;
_nop_();
SDA1=0;
_nop_();
}
/*停止条件子函数*/
voidstop1(void)
{
SDA1=0;
SCL1=1;
_nop_();
SDA1=1;
_nop_();
}
/*应答子函数*/
voidack1(void)
{
SDA1=0;
_nop_();
SCL1=1;
_nop_();
SCL1=0;
}
/*发送数据子程序,ch为要发送的数据*/
voidsendda1(ucharch)
{
ucharBitCounter=8;//位数控制
uchartmp;//中间变量控制
do
{
tmp=ch;
SCL1=0;
if((tmp&0x80)==0x80)//如果最高位是1
SDA1=1;
else
SDA1=0;
SCL1=1;
tmp=ch<<1;//左移
ch=tmp;
BitCounter--;
}
while(BitCounter);
SCL1=0;
}
/*串行DA转换子函数*/
voiddacout1(ucharch)
{
start1();//发送启动信号
sendda1(0x58);//发送地址字节
ack1();
sendda1(0x00);//发送命令字节
ack1();
sendda1(ch);//发送数据字节
ack1();
stop1();//结束一次转换
}
4.3.3波形选择程序
/********************************************************************/
voidboxing(ucharboxing)/*波形选择*/
{
switch(boxing)
{
case0:
A0=0;A1=1;send_str(0x93,name04,6);break;//正弦波
case1:
A0=0;A1=0;send_str(0x93,name05,6);break;//方波
case2:
A0=1;A1=0;send_str(0x93,name06,6);break;//三角波
case3:
A0=1;A1=0;send_str(0x93,name07,6);break;//矩齿波
case4:
A0=0;A1=0;send_str(0x93,name08,6);break;//脉冲
default:
break;
}
}
4.3.4频段选择程序
/*********************************************************/
voidpinduan(ucharpinduan)/*单位控制频段选择函数*/
{
switch(pinduan)
{
case0:
Y2=0;Y1=0;Y0=0;send_num(0x85,0,1);break;/*选择100uf电容*/
case1:
Y2=0;Y1=0;Y0=1;send_num(0x85,1,1);break;/*选择10uf电容*/
case2:
Y2=0;Y1=1;Y0=0;send_num(0x85,2,1);break;/*选择1uf电容*/
case3:
Y2=0;Y1=1;Y0=1;send_num(0x85,3,1);break;/*选择0.1uf电容*/
case4:
Y2=1;Y1=0;Y0=0;send_num(0x85,4,1);break;/*选择0.01uf电容*/
case5:
Y2=1;Y1=0;Y0=1;send_num(0x85,5,1);break;/*选择1000pf电容*/
case6:
Y2=1;Y1=1;Y0=0;send_num(0x85,6,1);break;/*选择100pf电容*/
case7:
Y2=1;Y1=1;Y0=1;send_num(0x85,7,1);break;/*选择20pf电容*/
default:
break;
}
}
4.3.5键盘扫描程序
/***************************************/
//键盘扫描
ucharkeyscan(void)
{
uchartemp;
P1=0xfe;
temp=P1;//读P3
temp=temp&0xf0;
delay1ms(25);
if(temp!
=0xf0)
{
delay1ms(100);//去抖
if(temp!
=0)
{
switch(temp)
{
case0xe0:
num=table[0];flag=1;break;
case0xd0:
num=table[1];flag=1;break;
case0xb0:
num=table[2];flag=1;break;
case0x70:
num=table[3];flag=1;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;//读P3
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay1ms(50);//去抖
if(temp!
=0)
{
switch(temp)
{
case0xe0:
num=table[4];flag=1;break;
case0xd0:
num=table[5];flag=1;break;
case0xb0:
num=table[6];flag=1;break;
case0x70:
num=table[7];flag=1;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;//读P3
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay1ms(50);//去抖
if(temp!
=0)
{
switch(temp)
{
case0xe0:
num=table[8];flag=1;break;
case0xd0:
num=table[9];flag=1;break;
case0xb0:
num=table[10];flag=1;break;
case0x70:
num=table[11];flag=1;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;//读P3
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay1ms(50);//去抖
if(temp!
=0)
{
switch(temp)
{
case0xe0:
num=table[12];break;
case0xd0:
num=table[13];break;
case0xb0:
num=table[14];break;
case0x70:
num=table[15];break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
return(num);
}
4.3.6频率显示部分程序
/********频率显示********************/
voiddisplay_pinlv(void)
{
ulongf1,f2;
uintf3,f4;
if(f<1000)
{
f3=(uint)(f);
send_n(0x8b,f3,3);
wr_data('.');
f4=(uint)(f*1000);
f4=f4%1000;
send_n(0x8d,f4,3);
send_str(0x8f,pinlv0,2);
}
else