c8051f020信号发生器设计报告_第1页
c8051f020信号发生器设计报告_第2页
c8051f020信号发生器设计报告_第3页
c8051f020信号发生器设计报告_第4页
c8051f020信号发生器设计报告_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

简易数字合成信号发生器设计PAGE50-目录TOC\o"1-3"\h\u32296实验目的 -2-17267软件设计 -4-22439第一节软件总体设计 -4-26113第二节软件功能设计 -4-13446一、系统初始化程序设计 -4-3307二、键盘扫描及处理程序设计 -5-26067三、中断服务程序设计 -12-27395四、数据显示部分 -14-18730五、DAC0部分 -15-19779六、附加模块 -16-28224电路设计 -20-10401第一节电路总体设计 -20-29154第二节电路功能设计 -21-31652一、总体电路模块 -21-449二、电源模块 -22-18799三、开关电容滤波器模块 -22-22466四、四象限乘法器模块 -23-25186五、负载驱动模块 -25-12459六、负载模块 -25-3711实验调试 -26-8553第一节程序调试 -26-4144一、初始化程序 -26-1850二、键盘扫描及处理程序设计 -26-27183三、显示程序 -27-29318四、定时器2、3服务程序及正弦波发生程序 -28-27024第二节电路调试 -28-10544一、电源模块调试 -28-15684二、开关电容滤波器模块调试 -29-1179三、四象限乘法器模块调试 -30-28302四、负载驱动及负载模块调试 -30-20671实验结果 -31-27197实验数据及分析 -34-15617第一节数/模转换MCUDAC输出 -34-2222第二节低通滤波器输出 -34-13481第三节低通滤波器时钟信号 -35-13025第四节系统最终输出信号 -35-25645实践总结、心得 -36-29987附录一源程序 -37-6566附录二电路原理图 -52-实验目的系统框图实验平台板实验平台板LED数码管矩阵键盘PIO(8it)PIODAC开关电容滤波器四象限乘法器缓冲放大平台实验板实验室提供“电子系统设计实验平台板”,板上集成C8051F020处理器,该处理器内置DAC等资源,合成信号即由该DAC输出(电压信号)。学生应充分利用板上集成的LED数码管显示器、4×4矩阵扫描键盘等资源,自行开发驱动程序。实现较完善的功能。开关电容滤波器为了进行DAC的信号滤波,推荐学生使用MAX7400(或MAX293)系列开关电容滤波器,该类滤波器的截止频率可由输入其中的时钟信号控制,我们要求该滤波器的截止频率应跟随合成信号的频率变化,该跟随特性由处理器进行控制。四象限乘法器四象限乘法器(是一种结构的DAC芯片)用来控制信号幅度,有处理器通过并行数据端口进行控制。芯片推荐使用TLC7528。缓冲放大器缓存放大器可由运算放大器结合必要的分立元件(晶体管、电阻、电容等)组成,用以驱动低阻负载获得足够功率,运算放大器推荐使用LM358。负载纯阻负载,初拟为50欧姆/1W。功能要求频率和幅度可由键盘控制,频率和幅度的设定值可由LED数码管显示器显示。指标要求频率范围由设计者自行确定,频率输出较高的组可获得额外加分;信号最大幅度为10V峰峰值或20V峰峰值,幅度可控,控制阶至少100级。负载电路:50欧姆;如可做到8欧姆,可额外加分。发挥部分:信号可实现幅度控制或相位控制,酌情加分。软件设计第一节软件总体设计应用系统中的应用软件是根据系统功能要求而设计的,能可靠地实现系统的各种功能。一个优秀的应用系统的应具有下列特点:(1)根据软件功能要求,将系统软件分成若干个独立的部分。设计出软件的总体结构,使其结构清晰、流程合理。(2)要树立结构化程序设计风格,各功能程序模块化、子程序化。既便于调试、链接,又便于移植、修改。(3)建立正确的数学模型。即根据功能要求,描述各个输入和输出变量之间的数学关系,它是关系到系统好坏的重要因素。(4)为提高软件设计的总体效率,以简明、直观法对任务进行描述,在编写应用软件之前,应绘制出程序流程图。(5)要合理分配系统资源,包括ROM、RAM、定时数器、中断资源等。(6)注意在程序的有关位置处写上功能注释,提高程序的可读性。(7)加强软件抗干扰设计,它是提高系统应用可靠性的有利措施。本系统的软件包括以下几个程序模块:(1)初始化程序;(2)显示程序;(3)键盘扫描程序与处理程序;(4)定时器2、3服务程序;(5)正弦波发生程序及其服务程序。第二节软件功能设计一、系统初始化程序设计复位程序完成如下工作:(1)显示的P.HELLO初始界面直到有键按下;(2)初始频率设置为100HZ,初始化幅度为5V,初始化DAC0为8位工作精度,并且输出更新发生在写DAC0H后;(3)将频率值转换成定时器的初值,并将幅度值转化为P7口送入7528控制器件;(4)置定时器3工作于方式1,即16位自动重载定时器方式,送入定时器3定时初值,启动定时器3工作;(5)根据按键显示初始频率或幅度,并产生波形;(6)转键盘扫描程序、频率或幅度显示程序。(7)同时程序还试着来模拟一个简单的调幅波和调相波输出。系统的初始化流程如图1所示。图1初始化流程图二、键盘扫描及处理程序设计这部分程序包括如下几部分:(1)键盘扫描程序unsignedcharGetkey();(2)先对P1置数,对第一行扫描;(3)判断是否有键按下;(4)延时,软件去干扰;(5)确认按键按下,并返回键值;(6)以此方法对2、3、4行进行扫描,对应行上有键按下就返回对应值;(7)执行相应键值程序。下面分别介绍其功能及设计思想。单片机系统中,键盘扫描是CPU工作的一个主要内容之一。CPU忙于各项工作任务时,如何兼顾键盘扫描。既保证不失时机的响应键盘操作,又不过多占用CPU时间。因此,要根据应用系统中的CPU的忙、闲情况,选择好键盘的工作方式。在单片机应用系统设计中,采用非编码键盘,在这种键盘结构中,程序设计中单片机对它的控制为:程序控制扫描方式。以下为几种键盘控制方式:程序控制扫描方式这种方式就是只有当单片机空闲时,才调用键盘扫描子程序,响应键盘的输入请求。定时扫描方式这种方式就是每隔一定的时间对键盘扫描一次。通常是利用单片机内部定时器产生10ms的定时中断,CPU响应定时器溢出中断请求,对键盘进行扫描,以响应键盘输入请求。中断工作方式为进一步提高CPU效率,可以采用中断扫描工作方式。即在键盘有健按下时,才执行键盘扫描,执行该键功能程序。本系统采用程序控制扫描工作方式。在该设计中的键盘的行列线连接于C8051F020的P3口上。键盘扫描程序自复位后就开始工作,时刻监视键盘,有无键按下。在监视键盘过程中,允许定时器T2、T3中断,即同时动态显示数据和输出波形。一旦有键按下,先延时,去除键的抖动,再读出键值,其框图如图2所示:图2键盘扫描对应键盘如图3所示图3键盘实现键盘采用矩阵式键盘(如图4-3所示),由软件返回相应编码,再根据相应返回值调用相应的子程序。表4-1键盘处理程序返回值对应处理程序1Key1万位频率调整(ww)2key2千位频率调整(qw)3Key3百位频率调整(sw)4Key4十位频率调整(gew)5Key5个位频率调整(xsw)6Key6十位幅度调整(Asw)7Key7个位幅度调整(Agw)8Key8十分位幅度调整(Axsw)9Key9为模拟产生调幅波10Key10为相位调制(Phase_1)11Key11为相位调制(Phase_2)12Key12为相位调制(Phase_3)13Key13为相位调制(Phase_4)14Key14为相位调制(Phase_5)需要说明的是:调用Key1-Key8时,对应位加1,加到10时回0;对于有些数值,通过程序可控制在一定的范围。键盘扫描源程序如下:unsignedcharGetkey()//键盘扫描程序,用于识别哪一个键按下,并返回键值{P3=0xff;P3_7=0;if(P3_3==0){Delay_nms(50); if(P3_3==0) return1;}if(P3_2==0){Delay_nms(50); if(P3_2==0) return2;}if(P3_1==0){Delay_nms(50); if(P3_1==0) return3;}if(P3_0==0){Delay_nms(50); if(P3_0==0) return4;}P3_7=1;P3_6=0;if(P3_3==0){Delay_nms(50); if(P3_3==0) return5;}if(P3_2==0){Delay_nms(50); if(P3_2==0) return6;}if(P3_1==0){Delay_nms(50); if(P3_1==0) return7;}if(P3_0==0){Delay_nms(50); if(P3_0==0) return8;}P3_6=1;P3_5=0;if(P3_3==0){Delay_nms(50); if(P3_3==0) return9;}if(P3_2==0){Delay_nms(50); if(P3_2==0) return10;}if(P3_1==0){Delay_nms(50); if(P3_1==0) return11;}if(P3_0==0){Delay_nms(50); if(P3_0==0) return12;}P3_5=1;P3_4=0;if(P3_3==0){Delay_nms(50); if(P3_3==0) return13;}if(P3_2==0){Delay_nms(50); if(P3_2==0) return14;}if(P3_1==0){Delay_nms(50); if(P3_1==0) return15;}if(P3_0==0){Delay_nms(50); if(P3_0==0) return16;}P3_4=1;return17;}下面是对应的子程序:/******************键盘控制程序部分F部分***************************/voidkey1()//控制万位{if(ww<9&&ww>=0) ww++;else ww=0;}voidkey2()//控制千位{if(qw<9&&qw>=0) qw++;else qw=0;}voidkey3()//控制百位{if(bw<9&&bw>=0) bw++;else bw=0;}voidkey4()//控制十位{if(sw<9&&sw>=0) sw++;else sw=0;}voidkey5()//控制个位{if(gw<9&&gw>=0) gw++;else gw=0;}/*******************键盘控制A部分******************************/voidkey6()//控制十位{if(Asw<2&&Asw>=0) Asw++;else Asw=0;}voidkey7()//控制个位{if(Asw!=2) {if(Agw<9&&Agw>=0) Agw++;else Agw=0;} else { if(Agw<5&&Agw>=0) Agw++;else Agw=0;}}voidkey8()//控制0.1位{if(Asw==2&&Agw==5) { Axsw=0; } else {if(Axsw<9&&Axsw>=0) Axsw++;else Axsw=0;}}/**************************************************/voidkey9()//调幅输出,载频1000HZ,信号为方波。{qw=1; bw=0; sw=0; gw=0; Asw=0; Agw=5; Axsw=0;}三、中断服务程序设计采用定时器T3定时中断产生正弦波并同时产生一个频率是正弦信号100倍的CLOCK信号。定时器的初值可以这样计算:f=100000*ww+1000*qw+100*bw+10*sw+gw;tt=2^16-24M/f/8/100;除以100,是为了产生那个周期为正弦周期百分之一的clock信号。定时器2只有在按下键9后到按下其它键之前,启用。其它时间段内都是禁用的。采用定时器2是为了控制P7口使输出幅度周期变化。从而产生调幅波。voidTimer3_ISR(void)interrupt14//定时器3服务程序{TMR3CN&=~(0x80); P0_6=~P0_6; if(kk<=23)kk++; elseif(kk==24) { DAC0L=0x00;DAC0H=to_sin[ii];// ii=ii+16; ii=ii+32;// if(ii>=128) if(ii>=256) { ii=0;} kk=0; }}voidTimer2_ISR(void)interrupt5//定时器2服务程序{T2CON&=~(0x80);if(AM==0) { P7=100; AM=1; } else { P7=0xff; AM=0;}}voidTimer3_ISR(void)interrupt14//定时器3服务程序{TMR3CN&=~(0x80); P0_6=~P0_6; if(kk<=23) kk++; elseif(kk==24) { DAC0L=0x00;DAC0H=to_sin[ii];// ii=ii+16; ii=ii+32;// if(ii>=128) if(ii>=256) { ii=0;} kk=0; }}voidTimer2_ISR(void)interrupt5//定时器2服务程序{T2CON&=~(0x80);if(AM==0) { P7=100; AM=1; } else { P7=0xff; AM=0;}}四、数据显示部分关于数据显示,分为两个部分,两个显示如何分配。本程序通过设置一个标识位FA来进行区分,当FA为1时,进行频率显示。而当FA为0时,显示幅度。FA的值在程序中,当按下频率控制键时,置为1,按下幅度控制键时置为0;复位时自动变为1。也就是当你调节频率时自动显示频率,当调节幅度时自动显示幅度。两者都是能过P2口进行位选,再通过P1口进行段选。6个数码管,通过循环移位进行显示。频率显示/*********************LED显示程序F部分********************/voiddisplayF(){P2=0x20; P1=0x8e; Loop_Delay(1);P2=0x10; P1=number_tab[ww];Loop_Delay(1); P2=0x08; P1=number_tab[qw]; Loop_Delay(1); P2=0x04; P1=number_tab[bw]; Loop_Delay(1); P2=0x02; P1=number_tab[sw]; Loop_Delay(1); P2=0x01; P1=number_tab[gw]; Loop_Delay(1);}幅度显示/****************LED显示程序A部分*******************/voiddisplayA(){P2=0x20; P1=0x88; Loop_Delay(1);P2=0x10; P1=0xff;Loop_Delay(1); P2=0x08; P1=0xff; Loop_Delay(1); P2=0x04; P1=number_tab[Asw]; Loop_Delay(1); P2=0x02; P1=number_tab[Agw]&0x7f; Loop_Delay(1); P2=0x01; P1=number_tab[Axsw]; Loop_Delay(1);}五、DAC0部分对于正弦信号的产生,经对比,以数组形式产生波形为最好的方式。DAC0工作方式为:内部偏压发生器和电压基准缓冲器工作,基准从VREF引脚输出DAC0使能,DAC输出更新发生在写DAC0时。对于它的初化为:voidDAC_Init(void)//初始化I/O口//内部偏压发生器和电压基准缓冲{//器工作,基准从VREF引脚输出REF0CN|=0x03;//DAC0便能,DAC输出更新发生在 DAC0CN=0x84;//写DAC0时。 DAC0L=0x00; DAC0H=0x00;}六、附加模块模拟调幅对于调幅,由于时间关系。没有时间再做电路,只有用单片机做一个简单的模拟,主要目的是为了提出一种只用单片机的一个DAC做AM波输出的方法。其中主要的思想是,用定时器2控制P7口,也就是控制输出波的幅度大小。所以只要能够通过设计P7口的数据输出,就能输出调幅波。本程序模拟的是一个载波为1000HZ,5V的正弦波。调制波为100HZ,调制度为50%。程序如下:voidkey9()//调幅输出,载频1000HZ,信号为方波。{qw=1; bw=0; sw=0; gw=0; Asw=0; Agw=5; Axsw=0;}voidTimer2_Init(){ET2=1;T2CON=0x00; RCAP2L=0x00; RCAP2H=0xff; TL2=0x00; TH2=0xff; T2CON=0x04;}voidTimer2_ISR(void)interrupt5{T2CON&=~(0x80);if(AM==0) { P7=100;AM=1; } else { P7=0xff;AM=0;}}模拟调相对于相位调制,用单片机模拟起来,用AM调制的思想设计比较复杂。首先,反相时不一定在DAC0为零;其次,P7口数据设计比较繁杂,而且容易出错。本组的杨建敏同学从另一个方向设计出了一个解决方法。就在是正弦数组方面着手,两个正弦数组各自存一个周期的正弦数据,但两个数组数据反相,在反相点直接输出另一个数组。但是鉴于时间问题,还有就是学校不给片子,自己在课下不能做实验调试,故在此提出这种方法。希望其它人能在此基础上调试出结果。下面也给出自己关系到的盲写的程序。下面是相位初始化:intinitial_phase(){intini_phase=0;switch(pha) { case1:if(Phase_1==1) { ini_phase=1; }else { ini_phase=0; }break;case2:if(Phase_2==1) { ini_phase=1; } else { ini_phase=0; }break;case3:if(Phase_3==1) { ini_phase=1; } else { ini_phase=0; }break;case4:if(Phase_4==1) { ini_phase=1; } else { ini_phase=0; }break;case5:if(Phase_5==1) { ini_phase=1; } else { ini_phase=0; }break; }returnini_phase;}相应的中断3服务程序也应改为:voidTimer3_ISR(void)interrupt14{TMR3CN&=~(0x80); P0_6=~P0_6; if(kk<=23) kk++; elseif(kk==24) { DAC0L=0x00;if(initial_phase()==0) {DAC0H=to_sin0[ii]; } elseif(initial_phase()==1) {DAC0H=to_sin1[ii]; }// ii=ii+1; ii=ii+32; if(ii>=256)// if(ii>=8) { ii=0; pha++; if(pha>6) { pha=1; }} kk=0; }}电路设计第一节电路总体设计本系统电路部分是比较关键的一部分。在实验过程中,我们发现电路虽说不是本次课程设计的最主要部分,但却直接决定着本次课程设计是否能够顺利完成。在设计电路的过程中,结合已有通用电路并加以改善,使电路实现更多的功能,以下是本次课程设计各部分电路的总结。本系统的电路包括以下几个模块。(1)电源模块。(2)开关电容滤波器模块。(3)四象限乘法器模块。(4)负载驱动模块。(5)负载模块。核心器件引脚图。MAX7400引脚图L7805引脚图MAX7400引脚图L7805引脚图LM358引脚图TLC7528引脚图LM358引脚图TLC7528引脚图第二节电路功能设计一、总体电路模块以上是本次课程设计各部分电路的概览。本次课程设计我们进行模块化电路设计,将各部分电路进行相应模块焊接。模块之间没有直接用导线焊接上,而是用排针与导线相结合实现模块间连接,从而增加了模块的可重用性和测试的方便性,从而避免因为不必要的焊接失误,而导致重复拆焊、焊接的麻烦。二、电源模块该电源模块核心芯片为L7805,使用12V供电电压,5V稳压输出,为板上其他模块提供5V供电。由于面包板资源有限,通过分析板上资源,将面包板右侧一列通路均接为5V,方便其他模块的使用。三、开关电容滤波器模块该电路模块通过开关电容滤波器MAX7400实现滤波功能,使用P0.6产生时钟信号,DAC0产生阶梯信号,通过DAC0输入八阶阶梯波,CLK输入100:1(时钟信号频率:正弦信号频率)的时钟信号,从而实现开关电容滤波器的功能。在后续拓展中实现了相位的数字调制。信号频率可调。通过程序控制改变DAC0产生阶梯信号的频率和改变CLK产生式中信号的频率从而实现对信号频率的控制。可以实现的最高频率输出为2000Hz,并有稳定的频率输出。信号相位调制。通过对DAC0的相位进行选择输出,从而实现了数字相位的调制。当数字为0时使用0相位,数字为1时使用π相位。四、四象限乘法器模块以上是四象限乘法器模块,使用12V电源给四象限乘法器供电。并使用双电源给LM358供电。通过学习四象限乘法器的功能,结合data—sheet上的电路图,加以改善,从而实现了二、四象限乘法器的转换,单、双极性的乘法器选择以及AM调制。二、四象限乘法器转换。通过打开S1和S2,使第二级运放不接入电路中,并直接使用2_quadrant_out直接加负载驱动电路,从而只实现二象限乘法器的功能。单、双极性乘法器选择。闭合S2,打开或闭合S1从而实现四象限乘法器的单、双极性转换。当S1闭合时,实现双极性四象限乘法器的功能,当D0-D7输出为0x80时,输出为0;当D0-D7输出为0xff时输出为0相位的最大正弦波,最大幅度可达5.5V;当D0-D7输出为0x00时输出为π相位的最大正弦波,最大幅度可达5.5V。为双极性正弦信号。当S1打开时,实现单极性四象限乘法器的功能,当D0-D7输出为0x00时,输出为0;当D0-D7输出为0xff时输出为0相位的最大正弦波,最大幅度峰峰值可达11V。为单极性正弦信号。AM调制。通过判断AM调制位按下,从而选择AM调制模式。在AM调制模式中,通过定时改变D0-D7的输出从而实现信号幅度的定期改变,从而实现信号的AM调制。五、负载驱动模块以上是负载驱动模块,本模块使用12V电源供电,并使用跟随器的方法从而增加输出阻抗,实现驱动较小负载的功能。六、负载模块本模块使用10K电位器,从而实现负载可调,可实现对较大范围的负载的选择。实验调试本次实验调试共分为两大部分:程序调试、电路调试。以下为各部分调试步骤及解决方案。第一节程序调试由于之前没有接触过这咱类型的单片机,而且该单片机的设置比较的复杂,各种资源的分配等等。还好,学校图书馆里有大量的书籍可以数据集,在此也向同学们推荐一本书《C8051F系列单片机开发与C语言编程》北航出版。程序调试过程中我们也遇到了一些问题,以下是各模块程序调试步骤和解决方案。本系统的软件包括以下几个程序模块:(1)初始化程序;(2)键盘扫描程序与处理程序;(3)显示程序;(4)定时器2、3服务程序及正弦波发生程序;一、初始化程序这一部分相对简单,主要看看输出“P.HELLO”是否正常,从而判断出对于I/O口的设置是否正常。相对简单,调试也容易。调试步骤测试电源确保电源供电正常。连接电源和在线调试器件。观察数码管输出。分析程序问题,修改程序重复步骤(3)。解决方案由于此部分程序比较简单、工作正常,本模块并未出现任何故障。二、键盘扫描及处理程序设计对于4X4键盘,由于已前对它的了解不够,还有就是程序过程中,与做电路的人交流很少,对它没有足够的了解,所以造成了前期调试过程中的很多错误。总结起来就是,写程序时一定要看懂电路,对其原理有一个本质的认识。调试步骤(1)测试电源确保电源供电正常。(2)连接电源和在线调试器件。(3)按下每个键,观察对应的输出是否变化和怎样变化。(4)分析问题,找出对应的错误后,修改程序重复步骤(3)确保最后键盘正确输入。解决方案由于4X4键盘电路相对复杂,所以调试中出现很多问题。程序最开始测试过程,发现没有输入。经过几次检查后,发现自己对4X4键盘的理解出现的很大的偏差。自己的程序只是读每个口的输入,并没有进行高4位和低4位的分别读取。还有没有进行相应位的拉低,所以读取的数据不对。解决方案是,进行逐行读取。具体程序内容参见程序的键盘扫描及处理程序设计模块。对于这个部分,我们提出几点意见方便后人再做。写程序之前一定要对你要做的模块充分理解。4X4键盘方面,我们的程序不是很完整,存在的一个最大的问题就是设计不完整,首先是读取次数太多,按行取了四次,效率不高。完全可以做成读两次,读高四位再读低四位。程序不难,希望看了此篇文章的同学做的时候注意。还有就是由于自己查资料时看的不是很细,对于单片机I/O口的几种输出设置没有完全理解,所以在程序时对于键盘输入口的没有正确设置,后面出现了一些错误。所以,对于技术手册来说,大家还是应该抱着一种敬畏之心一点一点的看。三、显示程序显示部分,电路简单,主要是程序的设计上问题。对于它的调试,相对简单。主要是对于参数的修改。调试步骤(1)测试电源确保电源供电正常。(2)连接电源和在线调试器件。(3)按下每个键,观察对应的输出是否变化和怎样变化。(4)分析问题,找出对应的错误后,修改程序重复步骤(3)确保最后数码管正确输出。解决方案由于我们在调试时,设置合理,没有出现什么问题,所以就对同学们可以出现的问题作些分析,避免再做时会出现的问题。频率高时,会闪的很严重。当F>2000HZ时,由于还要一个CLOCK信号,它的频率要是F的100倍,所以CLOCK在F=2000HZ时在跳中断的频率为2000X200=400000HZ对于晶振只有24M的单片机来说,中断跳的太频繁,显示无法正常工作。数码管少,只有6个,所以做显示分配时不足。所以推荐幅度和频率分开显示。四、定时器2、3服务程序及正弦波发生程序定时器和DAC0的设置的服务程序应该说是重点内容,这个部分很程度上决定了此次实验是否成功。对于它的调试没少费工夫,调试步骤(1)测试电源确保电源供电正常。(2)连接电源和在线调试器件。(3)按下每个键,观察对应的输出是否变化和怎样变化。(4)分析问题,找出对应的错误后,修改程序重复步骤(3)确保最后正弦波正确输出。解决方案这一部分由于需要设置的关键参数太多,写程序时也遇到了很多困难。对于这部分也没有什么好的意见,就是自己分块进行测试,查找问题心要细,不要想着一蹴而就。最好先找一个这方面的例子,运行正确后在这个基础上进行修改。遇到的第一个困难就是,程序写进去了,但是没有输出。经推断,初步认为是中断只跳了一次,或者就没有跳。最后,经过查看技术手册和一些例子自己没有设置自动重载模式。改后中断正常。第二个就是输出波形不正确,很明显,是正弦数组不正确。于是自己又从网上找一个正确的,输出正常。第二节电路调试在进行电路调试过程中,我们利用手上已有资源,先在面包板上搭好电路,进行测试完成之后,再进行焊接。这样不仅为焊接电路节省时间,也有效的保证电路的准确性和有效性。同时,在焊接电路的过程中,在保证电路功能的正常实现的前提下,注重电路的美观性和电气特性,使器件引脚尽量短、布线尽量整齐、匀称,并使用排针和导线作为模块间的连接,从而方便各部分模块的测试及修改,有效的保证了电路设计的效率和效果。以下为各部分电路的调试步骤及解决方案。一、电源模块调试由于在前面的学习中,我们进行过7805稳压电源的设计,本次课程设计电源模块是最为顺利的环节。调试步骤(1)在面包板上将电路按照电路设计部分中原理图进行搭接。(2)检查电路连接是否正确。(3)上电检测。12V电源是否输入7805,检测7805输出是否为5V左右。(4)分析电路问题,修改电路重复步骤(3)。解决方案由于电源部分电路比较简单、器件工作正常、电路连接未出现问题,本模块并未出现任何故障。二、开关电容滤波器模块调试在老师的提示下,针对MAX7400特殊的工作方式,我们采用了如电路原理图所示的电路。本模块测试中我们遇到了一些问题。调试步骤(1)在面包板上将电路按照电路设计部分中原理图进行搭接。(2)检查电路连接是否正确。(3)上电检测。检测5V电源是否输入MAX7400;检测八阶阶梯信号是否输入IN;检测输入IN信号直流分量是否为2.5V左右;检测时钟信号是否输入CLK;检测MAX7400输出隔直前与隔直后是否正常。(4)分析电路问题,修改电路重复步骤(3)。解决方案(1)电路测试过程中,我们在第一次电路设计中对于OS端并未输入2.5V,而是直接通过10u电容接地,信号并未正常输出。由于MAX7400datasheet中OS端直接接地,我们并未找到电路出现问题。通过从网上咨询以及和同学相互讨论,我们尝试着将OS端输入2.5V,电路可以正常工作。(2)我们找到以下几点MAX7400在使用过程中的注意事项,也方便将来同学们在使用该器件时能够正确使用。截止频率范围为1Hz–10kHz,时钟与截止频率比为100:1。输出有+-5mV的失调电压,所以不适用于要求高直流精度的场合。第6脚OS是失调电压调整引脚,用途是电平搬移,不是失调调零。只能单电源供电,输入只能为正电压,不能为负,当输入为负时,输出为零(实际为失调电压5mV)。建议OS引脚始终接电阻网络,我们在实际应用中发现这样输出噪声比较小。5V供电的MAX7400不接受3.3V电平标准以下的时钟输入。三、四象限乘法器模块调试本次实验四象限乘法器模块部分是本次课程设计电路部分的亮点,我们有效的利用开关对四象限乘法器模块进行了拓展,实现了二、四象限乘法器转换,单、双极性四象限乘法器转换。调试步骤(1)在面包板上将电路按照电路设计部分中原理图进行搭接。(2)检查电路连接是否正确。(3)上电检测。检测12V电压是否接入;检测运算放大器正负电源是否都已接入;检测MAX7400输出正弦信号是否接入电路;检测电路是否输出正常;检测二象限乘法器输出是否正常;检测单极性四象限乘法器是否输出正常;检测双极性四象限乘法器是否输出正常。(4)分析电路问题,修改电路重复步骤(3)。解决方案(1)模块测试过程中,我们对电路进行正常搭接、测试后发现输出信号出现平顶失真和正弦信号正电压正常,负电压部分失真的问题。通过向老师咨询及反复检查电路,我们成功解决了这些问题。(2)针对平顶失真,我们发现是因为电位器调节的问题,使电位器接入电路部分电阻与电路不匹配。我们通过调节电位器接入电路部分电阻,成功将平顶失真的问题解决。(3)正弦信号正电压正常,负电压部分失真。这个问题我们开始也很困扰,通过向老师咨询和自己研究,我们尝试对电路进行改进,将FEBA相接的电阻短路,电容去掉。这样的确解决了问题。后来我们对该部分电路又进行仔细的修改,发现电阻和电容都可以维持原来的选择,但是一定要保证电阻要在200欧姆左右,电容不能太大,我们选择的电容是33p,datasheet中建议电容为10p-15p。这一点是一定要注意的,否则电路将不能正常实现我们要求的工作。四、负载驱动及负载模块调试负载驱动模块,我们使用了跟随器的方法,提高输出阻抗,使电路可以驱动较小的负载。调试步骤(1)在面包板上将电路按照电路设计部分中原理图进行搭接。(2)检查电路连接是否正确。(3)上电检测。检测运算放大器正负电源是否都已接入;检测TLC7528输出正弦信号是否接入电路;检测电路是否输出正常;(4)分析电路问题,修改电路重复步骤(3)。解决方案由于本部分电路比较简单,并未出现比较严重的问题。实验结果单片机数模转换DAC0口输出波形,如图可知输出波形为8级阶梯波,峰峰值为2.34V。经过滤波电路后输出的波形,输出波形呈标准的正弦形,频率为1.005kHz,峰峰值为2.38V。P0.6口输出的时钟信号,频率为100.5kHz,为信号频率的100倍,符合设计要求。经过4象限放大器输出的波形,经过放大,幅度放大为11.4V。附加功能:方波调制、正弦波调制。\总结以上,我们的信号发生器能实现频率可调,幅度可控,并能通过4象限放大器实现信号的放大,符合技术要求。在附加实验部分我们实现了方波和正弦波的调制。实验数据及分析第一节数/模转换MCUDAC输出实验数据每周期样点数电平范围直流电平80-2.4V2.4V实验数据分析(1)由于要满足信号发生器可以产生较高频率的信号,故采用每周期样点数比较少的方法,这样能够保证定时器的赋初值可以保证足够大。我们采用8点采样,由于更少点采样可能不会产生比较好的阶梯波,故选择该采样方式。(2)由于DAC0的参考电平为2.4V,故输出电平范围为0-2.4V,中间电平为1.2V,有直流电平2.4V。由于MAX7400的特殊工作要求,必须要求有直流电平2.5V,所以将DAC0输出信号进行隔直后,并加一个2.5V的直流电平输入到MAX7400中。低通滤波器输出实验数据波形形状电平范围直流电平频率可调范围标准正弦波0-2.4V2.5V0.5Hz-2kHz实验数据分析经过低通滤波器滤波之后,能够实现标准正弦波输出,电平范围为0-2.4V。经过低通滤波器之后,会有2.5V的直流电平与正弦波叠加,为了避免后续放大过程中,直流电平被放大,从而烧毁器件,我们对低通滤波器输出进行了隔直处理,并对后续运算放大器采用双电源12V供电。从而保证最终的输出不存在直流电平。低通滤波器部分同时通过程序控制可以实现频率可控,我们经过不断实验,最终频率可调范围可以达到0.5Hz-2kHz。但是在控制过程中,能够保证在0-1.4kHz很好的控制,在1.5kHz-2kHz不是能够特别好的控制,经过分析,我们认为是因为频率越高,定时器跳中断就越频繁,故可以根据各频率对定时器计数初值进行适当补偿,从而式该频率范围也能很好的得到控制。第三节低通滤波器时钟信号实验数据电平波形形状3.3V标准方波实验数据分析通过查找资料我们发现5V供电的MAX7400不接受3.3V电平标准以下的时钟输入,也就是说时钟信号幅度不达到3.3V可能就不会产生正常的滤波效果。通过测试时钟信号,我们得到时钟信号的幅度约为3.3V,这样就可以保证MAX7400可以正常工作。第四节系统最终输出信号实验数据波形形状中间电平幅度控制范围频率范围驱动最小负载标准正弦波00-10V0.5Hz-2kHz200Ω(10V)实验数据分析通过不断的实验我们使系统最终输出信号可以实现0-10V的控制,并且,对于范围内的信号幅度都可以实现标准控制。(2)中间电平为0,保证系统最终输出信号没有直流分量。(3)负载驱动模块使用跟随器的方法,在峰峰值10V条件下可以驱动200Ω的电阻,跟老师要求的50Ω还有差距,我们认为这是正常情况,因为在峰峰值10V条件下,电流为25mA,已经很大了。由于LM358,在15V的情况下其输出电流的典型值为40mA,最小值为20mA而我们在使用LM358时使用12V供电,典型值约为32mA,最小值约16mA为由于器件间差距,在10V条件下驱动200Ω属于正常情况。实践总结、心得在大三下学期这个重要的时期,我们基本掌握了学科要求的一些技能,学校开设这么一门课是十分关键的。让我们在实践中巩固知识,应用知识真正做到“学以致用”。同时也在实践中加深了对课本所学知识的认识,对将来走上工作岗位或者继续学习都是十分重要的财富。这次的电子系统设计,可谓“软硬兼施”,既要求我们掌握C语言编程,单片机的使用,也要求我们能够自行设计电路。这对我们是十分重要的,让我们更加熟悉C语言的编程,也进一步熟悉了单片机的使用,同时也巩固了电子线路的基本知识,熟悉了低通滤波器、四象限乘法器的使用方法,对我们掌握新知识,巩固学过的知识,都是至关重要的。此外,我们的收获是我要更好的去学习专业知识。在实践中很多时候都需要用到学过的知识,但是学习是永无止境的,只有在困难中找出解决的方法,长进的才快。所以,我们所学的还远远不够,更需要在实践中发现新知识,学习新知识。在实验中,我们也遇到了很多困难,如何把显示在数码管上的频率跟输出波形的频率对应,我们在一次一次的实验中调节参数,最后终于能够比较好的将两个频率对应起来。同样在电路的设计及验证中,一个人接线难免会有疏漏,当小组协作的时候,便能很快发现错误,更快的解决问题。另一方面,这次的设计采用了小组合作的方式,在小组合作中更重要的是锻炼自己的团队意识,与别人合作的意识,以及倾听他人建议的意识,和自己的沟通能力。这也是我们走出校园走上社会的必修课。总之,这次的系统设计是十分必要的也是十分有意义的。它让我们在实践中应用和巩固了学过的知识,也让我们在实践中锻炼了团队意识,沟通能力。最后感谢各位组员的努力和在实验过程中老师和其他同学对于我们的帮助,有了大家的努力和帮助我们才能够更好的完成本次课程设计。附录一源程序#include<c8051f020.h>#include<intrins.h>sfr16TMR3RL=0x92;sfr16TMR3=0x94;sfr16DAC0=0xD2;sbitP3_0=P3^0;sbitP3_1=P3^1;sbitP3_2=P3^2;sbitP3_3=P3^3;sbitP3_4=P3^4;sbitP3_5=P3^5;sbitP3_6=P3^6;sbitP3_7=P3^7;sbitP0_6=P0^6;unsignedcharcodenumber_tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//09数学共阳极unsignedcharcodeto_sin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7, 0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9, 0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8, 0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5, 0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7, 0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2, 0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c, 0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55, 0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30, 0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15, 0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04, 0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e, 0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d, 0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};//正弦波数据unsignedintww=0,qw=0,bw=1,sw=0,gw=0,xsw=0;//ww为万位数字,qw为千位数字,bw为百//位数字,sw为十位数字,gw为个位数字unsignedintt,tt,ttt,f,m;//t为时间变量,f为频率变量,tt为定时器初始值unsignedintfudu=0;unsignedintAsw=0,Agw=0,Axsw=0,A=0;unsignedintth,tl;//定时器高位和低位unsignedcharii=0,kk=0;bitFA=1;bitAMflag=0;bitAM=0;//显示为频率时为1,显示为幅度时为0/********子程序声明***********************************/unsignedcharGetkey();voidkey1();voidkey2();voidkey3();voidkey4();voidkey5();voidkey6();voidkey7();voidkey8();voidkey9();voidkey10();voidkey11();voidkey12();voidkey13();voidkey14();voidkey15();voidkey16();voidcalculateF();voidcalculateA();voiddisplayF();voiddisplayA();voidDAC_Init(void);voidOSCILLATOR_Init(void);voidTimer2_Init();voidTimer2_ISR(void);voidTimer3_Init(unsignedintcounts);voidTimer3_ISR(void);voidLoop_Delay(unsignedintloop);voidDelay_nms(unsignedintn);voidio_config();voidio_init();intmain(){ EA=0; WDTCN=0xDE; WDTCN=0xAD;// XBR0=XBR0|0x04; //UART0:P0.0和P0.1 XBR2=XBR2|0x40; //enablecrossbar OSCILLATOR_Init(); io_config(); io_init();DAC_Init(); P0_6=0; EA=1;// ii=0; while(1) { if(Getkey()<=16) {switch(Getkey()) { case1:key1();FA=1;AMflag=0;break;//按下万位键 case2:key2();FA=1;AMflag=0;break;//按下千位键 case3:key3();FA=1;AMflag=0;break;//按下百位键 case4:key4();FA=1;AMflag=0;break;//按下十位键 case5:key5();FA=1;AMflag=0;break;//按下个位键 case6:key6();FA=0;AMflag=0;break;// case7:key7();FA=0;AMflag=0;break;// case8:key8();FA=0;AMflag=0;break;// case9:key9();AMflag=1;break;//// case10:key10();break;//// case11:key11();break;//// case12:key12();break;//// case13:key13();break;//// case14:key14();break;//// case15:key15();break;//// case16:key16();break;//按下确定键} if((FA==1)&&(AMflag==0)) { calculateF(); ET2=0; } elseif((FA==0)&&(AMflag==0)) { calculateA(); ET2=0;} else { calculateF(); calculateA(); Timer2_Init();} } if(FA==1) { displayF(); } else { displayA();}}}/********************键盘扫描程序部分***********************************/unsignedcharGetkey()//键盘扫描程序,用于识别哪一个键按下,并返回键值{P3=0xff;P3_7=0;if(P3_3==0){Delay_nms(50); if(P3_3==0) return1;}if(P3_2==0){Delay_nms(50); if(P3_2==0) return2;}if(P3_1==0){Delay_nms(50); if(P3_1==0) return3;}if(P3_0==0){Delay_nms(50); if(P3_0==0) return4;}P3_7=1;P3_6=0;if(P3_3==0){Delay_nms(50); if(P3_3==0) return5;}if(P3_2==0){Delay_nms(50); if(P3_2==0) return6;}if(P3_1==0){Delay_nms(50); if(P3_1==0) return7;}if(P3_0==0){Delay_nms(50); if(P3_0==0) return8;}P3_6=1;P3_5=0;if(P3_3==0){Delay_nms(50); if(P3_3==0) return9;}if(P3_2==0){Delay_nms(50); if(P3_2==0) return10;}if(P3_1==0){Delay_nms(50); if(P3_1==0) return11;}if(P3_0==0){Delay_nms(50); if(P3_0==0) return12;}P3_5=1;P3_4=0;if(P3_3==0){Delay_nms(50); if(P3_3==0) return13;}if(P3_2==0){Delay_nms(50); if(P3_2==0) return14;}if(P3_1==0){Delay_nms(50); if(P3_1==0) return15;}if(P3_0==0){Delay_nms(50); if(P3_0==0) return16;}P3_4=1;return17;}/*********************键盘控制程序部分F部分*********************************/voidkey1()//控制万位{if(ww<9&&ww>=0) ww++;else ww=0;}voidkey2()//控制千位{if(qw<9&&qw>=0) qw++;else qw=0;}voidkey3()//控制百位{if(bw<9&&bw>=0) bw++;else bw=0;}voidkey4()//控制十位{if(sw<9&&sw>=0) sw++;else sw=0;}voidkey5()//控制个位{if(gw<9&&gw>=0) gw++;else gw=0;}/*****************************键盘控制A部分**************************/voidkey6()//控制十位{if(Asw<2&&Asw>=0) Asw++;else Asw=0;}voidkey7()//控制个位{if(Asw!=2) {if(Agw<9&&Agw>=0) Agw++;else Agw=0;} else { if(Agw<5&&Agw>=0) Agw++;else Agw=0;}}voidkey8()//控制0.1位{if(Asw==2&&Agw==5) { Axsw=0; } else {if(Axsw<9&&Axsw>=0) Axsw++;else Axsw=0;}}/*******************************************************************************/voidkey9()//调幅输出,载频1000HZ,信号为方波。{qw=1; bw=0; sw=0; gw=0; Asw=0; Agw=5; Axsw=0;}/*********************LED显示程序F部分**********************************/voiddisplayF(){P2=0x20; P1=0x8e; Loop_Delay(1);P2=0x10; P1=number_tab[ww];Loop_Delay(1); P2=0x08;P1=number_tab[qw]; Loop_Delay(1); P2=0x04; P1=number_tab[bw]; Loop_Delay(1); P2=0x02; P1=number_tab[sw]; Loop_Delay(1); P2=0x01; P1=number_tab[gw]; Loop_Delay(1);}/*****************************LED显示程序A部分******************************/voiddisplayA(){P2=0x20; P1=0x88; Loop_Delay(1);P2=0x10; P1=0xff;Loop_Delay(1); P2=0x08; P1=0xff; Loop_Delay(1); P2=0x04; P1=number_tab[Asw]; Loop_Delay(1); P2=0x02; P1=number_tab[Agw]&0x7f; Loop_Delay(1); P2=0x01; P1=number_tab[Axsw]; Loop_Delay(1);}/***************计算定时器初值程序部分*****************************/voidcalculateF(){f=1000*qw+100*bw+sw*10+gw;// tt=65536-(28800/f); tt=65536-(300000/(f*30));// if(Getkey()==16)//如果确定键按下,通过改变计数器初值,从而改变输出信号频率 Timer3_Init(tt);//else //Timer3_Init(65507);// Timer3_Init(65190);}/***************计算幅度A程序部分*****************************/voidcalculateA(){A=10*Asw+Agw+0.1*Axsw; A=A*10; P7=A*2;}/******************延时子程序部分**********************************/void

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论