《毕业设计(论文)波形发生器设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)波形发生器设计.doc(37页珍藏版)》请在三一办公上搜索。
1、1 引言在电子行业的基础设施和制造等领域,波形发生器都是有效的通用仪器。它可以生成不同频率和幅度的大量信号,用来评估新电路的运行情况,代替时钟信号,对新产品进行制造测试,及用于许多其它用途。在教学中同样起着不可忽视的作用,所以我做了此设计。这个设计是基于信号发生芯片MAX038的多功能波形发生器。由MAX038、DA转换,MAX414运算放大器、LCD12864显示、单片机以及外围电路构成的多波形发生器。2 系统设计2.1 设计要求(1)具有产生正弦波、方波、三角波等几种周期性波形的功能。(2)输出波形的频率范围为1Hz2.4MHz,重复频率可调,频率步进间隔100Hz。 (3) 输出波形的幅
2、度范围05V(峰-峰值),可按步进0.1V(峰-峰值)调整。(4)输出显示波形的型类、周期和幅度的功能。(5)增加稳幅输出功能,当负载变化时,输出电压幅度变化3%。2.2 总体设计2.2.1 设计思路题目要求设计一个波形发生器,波形发生器的输出为正弦波、方波、三角波和锯齿波。设计中利用MAX038单片函数信号发生器的特性,产生各种波形。输入部分采用运算放大器对微弱信号进行放大使波形易于观察。控制部分用单片机和键盘组成的人机交互控制界面。采样部分采用运算放大器和A/D转换芯片。而显示部分则用带字库的液晶模块LCD12864,LCD12864可以直观显示波形的型类、频率、幅度和占空比等功能。2.2
3、.2 设计选择(1)波形发生电路的设计选择 利用单片集成芯片实现函数信号发生器。这种信号发生器能产生多种波形信号且达到较高频率,且易于调试,成本低。所以从性能和制作成本考虑,本设计采用单片机控制键盘输入通过D/A转换控制单片函数信号发生芯片MAX038产生可调频率、幅度和占空比的波形信号。(2)开关电路的设计选择采用电子模拟开关,模拟开关是一种三稳态电路,它可以根据选通端的电平,决定输人端与输出端的状态。当选通端处在选通状态时,输出端的状态取决于输人端的状态;当选通端处于截止状态时,则不管输人端电平如何,输出端都呈高阻状态。模拟开关在电子设备中主要起接通信号或断开信号的作用。由于模拟开关具有功
4、耗低、速度快、无机械触点、体积小和使用寿命长等特点。其内部电路组成和工作原理如图1图1 模拟开关的电路组成和工作原理本设计技术要求波型选择开关响应速度快,所以采用电子模拟开关,使用8选1模拟开关CD4051。(3)D/A转换器的设计选择 按照输出类型的不同可以分为电压输出型和电流输出型器件。 电压输出型D/A转换器采用内置的输出放大器来实现低阻抗的输出,没有放大部分的延迟,可以做到很高的速度且一般用于高阻抗负载的情况下。电流输出型D/A转换器则用得较少;按照接口类型的不同可以分为串行输出和并行输出器件。并行D/A转换器的转换速度快,但占用I/O多。串行D/A转换器输出建立时间相对于并行D/A转
5、换器稍长,但芯片与CPU连接时使用引线少、电路简单,成本低;按照数字量的位数可以分为8位、10位、12位、16位等D/A转换器,位数越大分辨率越大但相应的成本也越高。综上所述,选择性价比较好的D/A转换器,本设计采用Maxim公司的8位串行电压输出型D/A转换器MAX517。(4)信号采样电路的设计选择采用并行A/D转换芯片,并行方式一般在转换后可直接接收,转换时间快但使用芯片的引脚比较多;采用串行A/D转换芯片,串行方式所用芯片引脚少,封装小,在PCB板上占用的空间也小,但需要软件处理才能得到所需的数据。综上所述,结合本设计对数据采样的各项要求和单片机引脚的具体情况,采用TI公司的8位串行A
6、/D转换芯片TLC549.通过单片机AT89S52产生满足时序要求的输入/输出时钟,以及对A/D芯片的片选控制,完成对整个A/D转换过程的控制。TLC549具有8位分辨率模数转换,最大转换时间为17us,每秒访问和转换最多可达40000次,功耗低,可以满足本设计要求。(5)显示方式的设计选择采用带字库的液晶模块LCD12864显示。可以显示字符、图片,利用单片机直接驱动液晶显示模块,设计简单,且显示界面宽大美观舒适,耗电小。本设计要显示的内容较多,所以选择采用LCD12864实时显示波形的型类、频率、占空比和幅度等功能。(6) 电源模块的设计选择采用环形变压器,与普通变压器相比激磁能量和铁心损
7、耗将减少25%,电效率高达95%以上,漏磁小,电磁辐射小,振动噪声小,无需另加屏蔽层来屏蔽电磁干扰,适合用在高灵敏度和易受高频影响的电子设备上。加上三端固定稳压器获得5V电源,+5V用LM7805输出,-5V用LM7905输出,先在变压器的输出段用一个用整流二极管组成的整流桥整流,再用电容滤掉高频成分,这样就可以获得一个纹波系数小、稳定的电压。综上所述,采用环形变压器三端稳压器电路。2.2.3 系统组成 经过以上方案的比较和论证,最终确定的系统组成框图如图2所示。单片机4*4键 盘电 路LCD12864显示电路频段 电容选择 电路波形发生电 路D/A转换电路输出信号放大电 路AD采样电路图2
8、系统组成框图3 单元电路设计3.1 MAX038波形发生电路模块MAX038的外围电路如下图所示,引脚A0、A1接单片机I/O口,引脚COSC接电容选择电路的X引脚,引脚REF是输出正2.5V电压,用作控制占空比的D/A转换器的基准电压输入,IN引脚是频率控制引脚,通过一个25K电阻与D/A转换器输出端相连。 图3 MAX038外围电路图若负载是容性较大的负载,则MAX038的输出端与一个50的电阻相连。由于MAX038的输出信号为恒定的2V(P-P),且输出电流不高,所以必须依靠输出级的放大电路来提供足够的输出电压和电流,由放大电路和A/D转换芯片组成数据采样系统则可以实现数据采样。所以设计
9、应该满足以下要求:(1) 首先,要求放大电路具有很高的频宽。因为输出信号最大基频为20MHz,三角波和矩形波的高次谐波成分很高,只有高频宽才能得到不失真的输出波形。(2) 其次,高频大信号放大要求放大电路有足够的输出电压转换速率。(3) 另外,要带动低阻负载,放大电路的电流输出能力也是个重要参数。要在100的负载上输出6V信号,则放大器至少要有60mA的连续电流输出能力。3.2 CD4051模拟开关电路CD4051 开关电路见图4。CD4051相当于一个单刀八掷开关,开关接通哪一通道,由输入的3位地址码ABC来决定。其真值表见表1。 “ EN”是禁止端,当 “EN”=1时,各通道均不接通。此外
10、,CD4051还设有另外一个电源端VEE,以作为电平位移时使用,从而使得通常在单组电源供电条件下工作的 CMOS电路所提供的数字信号能直接控制这种多路开关,并使这种多路开关可传输峰峰值达15V的交流信号。图4 CD4051模拟开关电路表1 真值表输入状态接通通道ENCBA0000“0”0001“1”0010“2”0011“3”0100“4”0101“5”0110“6”0111“7”1均不接通3.3 D/A转换电路模块D/A转换电路由2片MAX517及外围电路组成,分别与MAX038的IN引脚和DADJ引脚相连,如图5,其中与DADJ相连的D/A转换器是双极性输出。为了保证D/A转换器总线在空余
11、方式为高电平,所以接上拉电阻。另MAX517A为调节占空比输出,所以要用双极性接法,运算放大器采用的是MAX414是美信公司的4路输出精密运算放大器,。D/A模块转换选用2路用于双极性输出正负电压的转换。 图5 D/A转换电路模块图3.4 输出信号采样电路模块设计输出信号采样电路模块设计由一片MAX414和TLC549构成,分别与单片机P3.5、P3.6和 P3.7脚连接,如图6,其中MAX414将输出模拟信号放大,模拟输入信号(ANALOG IN)经过TLC549内部采样/保持器至8-bit逐次比较式A/D转换器。片选控制端(CS_,低有效)和输入/输出时钟端(I/O CLOCK)与独立的内
12、部系统时钟通过内部逻辑控制电路,实现外部接口与内部的数据传输,通过单片机从而实现波形幅度的控制。如图6 输出信号采样电路模块设计3.5 LCD12864显示电路设计采用带字库的点阵图形液晶模块LCD12864,可以显示汉字、字符和图形等。且功耗很低,显示效果美观。LCD12864的D0D7接单片机P0口,RS、RW和LCDEN分别接P2.0、P2.1和P2.2口。可调电阻RP21用来调节LCD显示屏的亮度。PSB接高电平,表示这里采用的是并行数据控制方式。图7 LCD12864显示电路设计3.6 4*4矩阵键盘输入电路模块 输入电路模块采用4*4矩阵键盘输入,如图8,行列分别与单片机的P1口连
13、接。按键设置在行、列线的交点上,行、列线分别连接到按键开关的两端。对键盘的工作过程可分两步:第一步是CPU首先检测键盘上是否有键按下;第二步是消抖;第三步是识别是哪一个键按下。检测键盘上有无键按下可采用查询工作方式、定时扫描工作方式和中断工作方式。 图8 4*4矩阵键盘输入电路 3.7 电源模块的设计电源电路是用环形变压器三端固定稳压器获得5V电源,+5V用7805输出,-5V用7905输出,环形变压器的电压经过三端固定稳压器,再经整流桥整流,用电容滤掉高频成分。如图9: 图9 5V稳压电源电路4 系统软件设计及分析4.1 系统流程分析4*4键盘输入全部用作功能键,键盘具体划分如下:第一行主要
14、功能是占空比调节,有微调加1、粗调减5、粗调加5、占空比50%;第二行主要功能是频率的调节,有频段选择,微调加1,粗调加10,微调减1;第三行实现其他功能,有波形选择,幅度刷新。先输入功能键然后按照要求执行程序。其中D2是选择MAX038产生的波形,D1是计算和输出频率,D0是控制波形占空比,单片机通过CD4051控制频段范围,在选择的频段范围内通过设定的按键步进调节就可以得到需要的信号。频率数值设定在102.4MHz范围内直接送到LCD12864显示。表2 波形选择关系波形选择逻辑关系表数值A0A1输出波形000方波,脉冲波1X1正弦波211三角波,锯齿波表2 键盘界面键盘操作界面微调+粗调
15、-粗调+占空比50%频段微调+粗调+微调-波形幅度刷新首先由=/,电流由0.5V5V通过电阻R12=25K,得到20200A的电流,抛开重叠的频段不计,表3 MAX038频率范围及电容关系图 在D/A转换部分和波形发生部分则根据以下公式计算:控制频率D/A转换器公式: 控制占空比D/A转换器公式: 电路的振荡频率为:=(1-0.2915)=(1-0.2915)/波形占空比为: 由于电路原因以及程序问题,设计的波形发生器产生的波形的占空比、频率、振幅等不可能如理论那么准确。 4.2 主体程序流程图开 始初 始 化功能 LCD显示 键盘 扫描频率调制波形选择占空比调制显示数值范围是否在10%90%
16、MAX038的A0、A1选择波形计算D/A所需要数据D0选择8个频段之一计算D/A所需要数据D1单片机输入D0串行数据单片机输入D1串行数据采集A/D所需要数据D2单片机输入D2串行数据图 10 程序流程图4.3 部分程序4.3.1 D/A转换原理程序/*控制频率的串行MAX517的函数*/* 起始条件子函数 */void start0(void)SDA0 = 1;SCL0 = 1;_nop_();SDA0 = 0;_nop_();/* 停止条件子函数 */void stop0(void)SDA0 = 0;SCL0 = 1;_nop_();SDA0 = 1;_nop_();/* 应答子函数 *
17、/void ack0(void)SDA0 = 0;_nop_();SCL0 = 1;_nop_();SCL0 = 0;/* 发送数据子程序,ch为要发送的数据 */void sendda0(uchar ch)uchar BitCounter = 8; /位数控制uchar tmp; /中间变量控制dotmp = ch;SCL0 = 0;if (tmp&0x80)=0x80)/如果最高位是SDA0 = 1;elseSDA0 = 0;SCL0 = 1;tmp = ch1;/左移ch = tmp;BitCounter-;while(BitCounter);SCL0 = 0;/* 串行DA转换子函数
18、*/void dacout0(uchar ch)start0();/ 发送启动信号sendda0(0x58);/ 发送地址字节ack0();sendda0(0x00);/ 发送命令字节ack0();sendda0(ch);/ 发送数据字节ack0();stop0();/ 结束一次转换4.3.2 占空比调节程序/*控制占空比的串行MAX517的函数*/* 起始条件子函数 */void start1(void)SDA1 = 1;SCL1 = 1;_nop_();SDA1 = 0;_nop_();/* 停止条件子函数 */void stop1(void)SDA1 = 0;SCL1 = 1;_nop_
19、();SDA1 = 1;_nop_();/* 应答子函数 */void ack1(void)SDA1 = 0;_nop_();SCL1 = 1;_nop_();SCL1 = 0;/* 发送数据子程序,ch为要发送的数据 */void sendda1(uchar ch)uchar BitCounter = 8; /位数控制uchar tmp; /中间变量控制dotmp = ch;SCL1 = 0;if (tmp&0x80)=0x80)/如果最高位是SDA1 = 1;elseSDA1 = 0;SCL1 = 1;tmp = ch1;/左移ch = tmp;BitCounter-;while(BitC
20、ounter);SCL1 = 0;/* 串行DA转换子函数 */void dacout1(uchar ch)start1();/ 发送启动信号sendda1(0x58);/ 发送地址字节ack1();sendda1(0x00);/ 发送命令字节ack1();sendda1(ch);/ 发送数据字节ack1();stop1();/ 结束一次转换4.3.3 波形选择程序/*/void boxing(uchar boxing) /*波形选择*/ switch(boxing) case 0:A0=0;A1=1;send_str(0x93,name04,6);break; /正弦波 case 1:A0=
21、0;A1=0;send_str(0x93,name05,6);break; /方波 case 2:A0=1;A1=0;send_str(0x93,name06,6);break; /三角波 case 3:A0=1;A1=0;send_str(0x93,name07,6);break; /矩齿波 case 4:A0=0;A1=0;send_str(0x93,name08,6);break; /脉冲 default:break; 4.3.4 频段选择程序/*/void pinduan(uchar pinduan) /*单位控制频段选择函数*/ switch(pinduan) case 0: Y2
22、= 0;Y1 = 0;Y0 = 0;send_num(0x85,0,1); break; /*选择100uf电容*/ case 1: Y2 = 0;Y1 = 0;Y0 = 1;send_num(0x85,1,1); break; /*选择10uf电容*/ case 2: Y2 = 0;Y1 = 1;Y0 = 0;send_num(0x85,2,1); break; /*选择1uf电容*/ case 3: Y2 = 0;Y1 = 1;Y0 = 1;send_num(0x85,3,1); break; /*选择0.1uf电容*/ case 4: Y2 = 1;Y1 = 0;Y0 = 0;send_
23、num(0x85,4,1); break; /*选择0.01uf电容*/case 5: Y2 = 1;Y1 = 0;Y0 = 1;send_num(0x85,5,1); break; /*选择1000pf电容*/case 6: Y2 = 1;Y1 = 1;Y0 = 0;send_num(0x85,6,1); break; /*选择100pf电容*/case 7: Y2 = 1;Y1 = 1;Y0 = 1;send_num(0x85,7,1); break; /*选择20pf电容*/default:break;4.3.5 键盘扫描程序/*/键盘扫描uchar keyscan(void)uchar
24、 temp;P1=0xfe;temp=P1;/读P3temp=temp&0xf0;delay1ms(25);if(temp!=0xf0)delay1ms(100); /去抖if(temp!=0)switch(temp)case 0xe0:num=table0;flag=1;break;case 0xd0:num=table1;flag=1;break;case 0xb0:num=table2;flag=1;break;case 0x70:num=table3;flag=1;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;P1=0xfd;temp=P1
25、;/读P3temp=temp&0xf0;if(temp!=0xf0)delay1ms(50); /去抖if(temp!=0)switch(temp)case 0xe0:num=table4;flag=1;break;case 0xd0:num=table5;flag=1;break;case 0xb0:num=table6;flag=1;break;case 0x70:num=table7;flag=1;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;P1=0xfb;temp=P1;/读P3temp=temp&0xf0;if(temp!=0xf0)d
26、elay1ms(50); /去抖if(temp!=0)switch(temp)case 0xe0:num=table8;flag=1;break;case 0xd0:num=table9;flag=1;break;case 0xb0:num=table10;flag=1;break;case 0x70:num=table11;flag=1;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;P1=0xf7;temp=P1;/读P3temp=temp&0xf0;if(temp!=0xf0)delay1ms(50); /去抖if(temp!=0)switch
27、(temp)case 0xe0:num=table12;break;case 0xd0:num=table13;break;case 0xb0:num=table14;break;case 0x70:num=table15;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;return (num);4.3.6 频率显示部分程序/*频率显示*/void display_pinlv(void)ulong f1,f2;uint f3,f4;if(f=1000)f1=(ulong)f/1000;f2=(ulong)f%1000;send_n1(0x8b,f1,
28、4);send_n1(0x8d,f2,3);send_str(0x8f,pinlv0,2);void dispaly(uchar key)switch(key)case 0x01:zhankb=zhankb+1;if(zhankb255) zhankb=128;dacout1(zhankb);send_n(0x9e,zhankb,3);flag=0;break;case 0x02:/占空比加5zhankb=zhankb+5;if(zhankb255) zhankb=128;dacout1(zhankb);send_n(0x9e,zhankb,3);flag=0;break;case 0x03:
29、/占空比减5zhankb=zhankb-5;if(zhankb=0&pinlv256) pinlv-; /频率微减if(pinlv=0&boxing1=20)&(f=50)&(f=600)&(f=4000)&(f=20000)&(f600000)f=f*1.0176;else f=f*0.980089;else if(cf=0.00002) f=f*0.278426;f=f*0.980608;display_pinlv();4.3.7 LCD12864显示程序/*/*12864程序*/*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
30、*/*/bit lcd_busy() bit result; rs = 0; wr = 1; lcden = 1; delay1ms(5); result = (bit)(P0&0x80); lcden = 0; return(result); /*/*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*/ /*/void wr_com(uchar cmd) while(lcd_busy(); rs = 0; wr = 0; lcden = 0; _nop_(); _nop_(); P0 = cmd; delay1ms(5); lcden = 1; delay1ms(5); lcden = 0; /*/*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/ /*/void wr_data(uchar dat) while(lcd_busy(); rs = 1; wr = 0; lcden = 0; P0 = dat; delay1ms(5); lcden = 1; delay1ms(5); lcden = 0; void clear()wr_com(0x01); /清屏wr_com(0x34);wr_com(0x30);/*