MSP430控制的基于DDS的波形发生器设计_第1页
MSP430控制的基于DDS的波形发生器设计_第2页
MSP430控制的基于DDS的波形发生器设计_第3页
MSP430控制的基于DDS的波形发生器设计_第4页
MSP430控制的基于DDS的波形发生器设计_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

华中科技大学电子与信息工程系2011年TI杯电子设计大赛项目总结报告题目:MSP430控制的基于DDS的波形发生器设计组长:何永天(提高0801班U200814111)组员:李恋阳(提高0801班U200812892)袁园(提高0802班U200813900)杨春风(电信0804班U200812791)吴文彬(电信0806班U200812863)指导老师:陈林日期:2011.7.8

目录1 设计目标 41.1 基本功能 41.2 扩展功能 42 团队组成 53 系统设计方案 53.1 几种初步方案 53.1.1 方案一 53.1.2 方案二 63.1.3 方案的比较 63.2 器件选型 73.2.1 单片机 73.2.2 数模转换DAC 73.2.3 压控增益放大器 73.2.4 运算放大器 84 系统硬件设计与实现 84.1 系统框图 84.2 系统电路图 94.3 器件清单 94.4 模块分析 104.4.1 DDS 104.4.2 幅度控制 114.4.3 放大稳压 134.4.4 自选波形 144.4.5 键盘 144.4.6 LCD显示 155 系统软件设计与实现 165.1 总体设计框图 165.2 初始化 175.3 DDS 185.4 LCD显示 195.5 DAC 215.6 键盘 226 系统测试与结果 266.1 总体方案选择 266.1.1 原方案 266.1.2 遇到的障碍: 276.1.3 改进方案: 276.2 硬件电路测试 276.2.1 VCA810压控放大器 276.2.2 OPA1632 286.2.3 级联 286.2.4 关于换备选方案 286.3 系统联调结果 286.3.1 三角波、正弦波、方波测试结果 286.3.2 扩展波形的测试结果 326.3.3 扩展扫频功能的测试结果 337 结束语 337.1 目标完成情况 337.2 感想 338 参考文献 349 附录 349.1 电路图 349.2 源码清单 35设计目标设计并制作一个波形发生器,该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定波形,并根据用户输入选择产生指定类型与参数的波形,同时在必要的辅助输出显示设备上显示产生波形的类型与参数。基本功能具有产生正弦波、方波、三角波三种周期性波形的功能;输出波形的频率范围为100Hz-20KHz(非正弦波频率按10次谐波计算);重复频率可调,频率步进间隔≤100Hz。输出波形幅度范围0-5V(峰峰值),可按步进0.1V(峰峰值)调整。由外界按键输入选择产生波形的种类、频率与峰峰值;界面显示输出波形的类型、重复频率(周期)和幅度。扩展功能输出波形频率范围扩展至100Hz-200KHz。用键盘或其它输入装置产生任意波形。增加稳幅输出功能,当负载变化时,输出电压幅度变化不大于±3%(负载电阻变化范围:100Ω)。可产生单次或多次(1000次以下)特定波形(如产生1个半周期三角波输出)。具有掉电存储功能,可存储掉电前用户编辑的波形和设置。其它(如增加频谱分析、失真度分析、频率扩展大于200KHz、扫描输出等功能)。团队组成我们的工作分为以下模块(详细分工在个人报告中叙述)前期:收集资料、方案设计、器件选型硬件部分:电路参数设计、proteus制图及硬件仿真、各单级调试、PCB布线、通用版布线、电路焊接、排查焊接错误软件部分:LCD模块、键盘扫描模块、DDS模块、调频、扫频、模块间接口设计与实现、自选波形模块(DA部分)、软件联调后期:硬件级联调试、软件联调报告书写、文档排版、幻灯片演示、视频制作、答辩展示系统设计方案几种初步方案方案一由MSP43F149单片机产生三角波、正弦波和方波,并且控制波形之间的转换,以及波信号的频率和幅度。用LCD液晶显示模块显示波形的种类和相关参数。单片机输出数字信号,通过DAC进行数模转换。采用低通滤波器滤除DAC转换过程中形成的高频小锯齿波,运算放大器进行放大,电压跟随器稳幅,最后送入示波器显示信号。方案二用DDS(直接数字合成DirectDigitalSynthesis)芯片产生三角波、正弦波和方波,并用MSP430单片机送控制字给DDS以控制波形之间的转换,以及波信号的频率,通过TI公司的VCA810压控放大器芯片进行调幅。然后通过滤波器滤除高频噪声,通过放大电路对信号进行放大,之后通过缓冲对信号进行稳幅,最后送入示波器显示信号,用单片机产生任意波形和其他扩展功能。方案的比较方案一的基本思路是用单片机发出指令输出相应的数字量,然后通过DA产生要求的模拟量,但是存在一个致命的问题,那就是本次的频率基本要求为100Hz-20KHz,扩展要求是100-200KHz,但是通常的MSP430系列单片机的晶振一般为8M左右,指令周期是机器周期,可达1/8ms,所以对生成方波来说还可以,而要合成三角波或正弦波则存在很多问题,程序实现难度很大,所以我们最终放弃了这个方案。方案二的基本思路是走两条路,使用DDS芯片产生三种基本波形,用单片机实现任意波形以及控制和显示等功能,容易对功能进行扩充,且外围电路简单,系统可靠性较高,编程实现较为简单,整个系统成本较低,我们最终选择了这个方案。信号初步产生之后都要经过滤波、放大、缓冲输出等电路,各个方案下的设计大同小异,主要还是需要稳定可靠,带宽很宽。器件选型单片机选用MSP430F5438单片机,因为在种类和数量繁多的单片机中,TI的MSP430系列颇具特色,并具有良好的性能。数模转换DAC按照设计好的方案,扩展功能中的任选波形用DA来实现,有2种方法:外接DAC0832或者自带的DAC5571。自带的DAC5571优点:使用较简单(因为有完整的test代码和文档,而且已经集成在5438的开发板上);缺点:速度上不去(因为5438自带的操作DA用来产生任选波形的代码要放在main中,但main函数比较庞大,影响了任选波形的频率)外接DAC0832优点:可以自己去设计DA的驱动函数,产生的任选波形的频率较高;缺点:设计和搭电路较复杂(0832的输出端还要加运放来将电流输出转换成电压输出)我们选择第一种自带DA压控增益放大器比较两个选择:VCA810和VCA822。具体来说,我们比较它们的增益带宽积,输出(驱动)电流,及我们对芯片的熟悉程度。最后决定选择VCA810,利用DAC产生控制电压改变放大器的增益。控制电压和放大器增益成线性,方便实现精确的增益控制。VCA810的最小增益步进仅取决于DAC的位数,可以实现增益微调,为闭环改善放大器的性能提供方便。运算放大器主要考虑因素有增益带宽积,输出驱动电流(表明带负载的能力),噪声电压,电路复杂程度,对芯片的熟悉程度和价格,对于常用的几个比较结果如下:OPA1632:增益带宽积:180MHZ;输出驱动电流:150mAOPA551:带宽:3MHZ;,增益带宽积:3MHZ;输出驱动电流:200mAOPA552:带宽:12MHZ,增益带宽积:3MHZ;输出驱动电流:200mANE5532:小信号带宽:10MHZ,输出驱动电流:60mATHS4031:增益带宽积:100MHZ,输出驱动电流:90mATHS4521:带宽:145MHZ,输出驱动电流:100mAuA741:增益带宽积:1MHZ,输出驱动电流:25mA综合考虑,opa1632各项性能比其他芯片要好很多,因此决定选用opa1632系统硬件设计与实现系统框图由MSP430单片机通过3个SPI接口控制AD9833产生各种频率的正弦波、三角波、方波,经放大整形电路后输出,并通过独立的按键切换输出的波形,也可改变频率和幅度以及频率和幅度变化的步进(通过软硬件的配合)。通过TFT液晶模块和独立按键进行人机交互。系统上电后检查启动按键是否按下,当启动按下被按下时,启动各个模块,与此同时检查被按下的按键值。当检查到不同的按键被按下时,由MSP430通过SPI控制AD9833进行相应的改变。系统电路图其中DDS模块较为复杂,上图只是外部接口。其详细电路设计如下图所示:器件清单msp430f5438开发板(1个)VCA810压控增益放大器(1个)OPA1632放大器(3个)AD9833(1个)UA741放大器(1个)电阻,电容,导线若干模块分析DDSAD9833介绍AD9833是ADI公司的一款低功耗的DDS器件,能够输出正弦波、三角波、方波。AD9833无需外接元件,输出频率和相位可通过软件编程设置,易于调节。其频率寄存器为28位,主频时钟为25MHz时,其精度为0.1Hz;主频时钟为lMHz时.精度可达0.004Hz.AD9833内部有5个可编程寄存器:1个16位控制寄存器,用于设置器件_T作模式;2个28位频率寄存器和2个12位相位寄存器,分别用于设置器件输出正弦波的频率和相位。它的SIN-ROM查询表把输入的地址相位信息映射成正弦波幅值的数字量信号,驱动D/A转换器输出模拟量。输出正弦波频率为:f式中:FREQREG为频率控制字,由频率寄存器FREQOREG或FREQlREG的值给定,其范围为0≤MfMCLK从单片机输入控制字AD9833模块有3根串行接口线,分别是FSYNC、SCLK和SDATA,与SPI、QSPI、MI-CROWIRE和DSP接口标准兼容,在串口时钟SCLK的作用下,数据是以16位的方式加载到设备上,FSYNC引脚是使能引脚,电平触发方式,低电平有效。进行串行数据传输时,FSYNC引脚置低,在16个SCLK的下降沿数据通过SDATA引脚被送到AD9833的输入移位寄存器。因此,此处我们通过3个100Ω的电阻进行限流,并将这3个引脚接到单片机MSP430F5438的P9.4、P9.3和P9.2脚,通过单片机来控制AD9833。下图是SCI串行数据通信的时序图:从VoutOPBITENBitMODEBitDIV2BitVOUTPin00X正弦波01X三角波100DAC数据的MSB/2101DAC数据的MSB其中MSB/2和MSB对应为方波,且MSB/2为MSB频率的一半。即正弦波,三角波,方波对应的频率控制字分别为:0x2000,,0x2002,0x2028(MSB方波),0x2020(MSB/2方波)。完整工作流程简介虽然MSP430单片机具有硬件SPI总线功能,但是一次只能传输8位数据位,而AD9833在接收数据时是16位数据位,因此,需要用软件模拟SPI总线;AD9833在接收16位数据时是高位在前,低位在后;先发送控制寄存器字然后发送想要的频率字;发送数据前必须把FSYNC置成低电平,发送完以后把FSYNC置成高电平;当对AD9833初始化时,为了避免DAC产生虚假输出,RESET必须置为1,直到配置完毕,需要输出时才将RESET置为0。RESET为0后的8~9个MCLK时钟周期就可在DAC的输出端观察到波形。在+5V的电源电压下DDS的输出峰峰值为:0.6V,但测试后发现三角波和正弦波的输出峰峰值在0.68V左右,而方波的输出峰峰值超过6V,这也成为后面处理的一个考虑的比较多的问题幅度控制我们考虑了如下四种方案:由数控电位器组成的电阻分压网络控制幅度。采用峰值检波器获得输出端的电压幅值,经A/D采样后得到输出端当前的电压幅值,然后就得到了输出当前的电压幅值,然后通过与预设的输出幅值比较就可以知道输出下降的情况。并由单片机控制放大器增加放大倍数,直至输出幅值调整到预期值。采用一级D/A转换实现。直接将DDFS产生的信号作为参考电压输入到D/A中,这样D/A就成为一个数控可变增益放大器,通过改变D/A的转换数据就可以控制输出幅度。数模转换和幅度控制部分采用双D/A技术,由单片机控制,第一级D/A的输出波形作为第二级D/A的基准电压源,以此来控制信号发生器的输出电压幅度。最后经分析和试验,方案四电路简单、通过软件控制、可控性强,故采用这种方案。VCA810介绍本实验中,调幅部分我们选用TI公司的VCA810芯片,VCA810是一个宽带、连续变化、电压控制增益放大器。它提供了一个对差分输入单端输出转换与高阻抗输入用来改变增益控制的增益线性范围为-40dB到+40dB在dB/V。供给电压±5V、VCA810增益控制电压在0V时为-40dB,在-2V为+40dB。增加地面控制电压将衰减信号>80dB。信号带宽和压摆率保持在整个增益调节范围内保持恒定。这40db/V增益控制在±1.5db(最高误差范围±0.9db),让应用程序在一个AGC增益控制电压精确到作为接收信号强度指示器(RSSI)的使用精度为±1.5db。通过调节控制电压(Vc)来控制压控增益放大器VCA810的放大增益,从而控制正确的输出。VCA810作为压控增益的主要部分,其增益与控制电压的关系为:G=-40(其中,Vc表示控制电压,可见,VCA810的增益与其控制电压成线性关系,只要用单片机控制D/A输出一线性变化的控制电压给Vc,便可得到线性变化的电压增益输出理论上VCA810可调的放大倍数为1/100~100,实际上由于DDS输出的正弦波和三角波幅度为680mV,方波的幅度为6.8V左右,而且VCA的工作电压只有-5V~+5V,所以放大倍数不可能为100倍,差不多达到7、8倍,但是缩小则可以到1/100。为了确保调节的精确,我们采用VCA810的缩小功能,提供给它的参考电压为0~-1V。经过这一级缩小后,再送入后级放大。uA741反相模块由于我们采用的MSP430单片机自带DA模块,所以没有外接DA,利用单片机给DA写控制字,使DA输出幅值可变的电压作为VCA810的参考电压。从DA输出的电压幅度值范围为0~3.3V,而VCA810要求的参考电压为0~-1V,所以需要反相和缩小,利用简单的uA741实现,电路如下:放大稳压OPA1632介绍设计运算放大器时,我们考虑了许多不同型号的运放,功能各异,主要考虑增益带宽积,输出驱动电流(表明带负载的能力),噪声电压,(电路复杂程度,芯片熟悉程度,价格)等等。TI公司的OPA1632是音频运算放大器,性能比较好。增益带宽积为180MHZ,输出驱动电流为150mA。可以工作在较高频率下而不出现失真,且驱动能力较好。功能实现该实验中,我们主要用OPA1632设计放大电路和电压跟随器。放大电路主要分为同相比例放大器和反相比例放大器两种。反相比例放大器同相比例放大器反相放大电路有如下特点:运放两个输入端电压相等并等于0,故没有共模输入信号,这样对运放的共模抑制比没有特殊要求。vN=vP,而vP=0,反相端N没有真正接地,故称虚地点。电路在深度负反馈条件下,电路的输入电阻为R1,输出电阻近似为零。输入输出关系:V同相比例运算电路的特点如下:输入电阻很高,输出电阻很低。由于vN=vP=vS,电路不存在虚地,且运放存在共模输入信号,因此要求运放有较高的共模抑制比。输入输出关系:V由于实际放大倍数比理论值低,所以我们设计Rf=100千欧,R1=5.1千欧,放大倍数约为21倍。自选波形实现自选波形有两种不同的理解和方法:手动描波形,由硬件接收,然后描点显示出来;写好一组波形,存在flash内部,通过按键选择我们实现的是第二种,首先用MATLAB描出想要产生的任意波形,然后取出大量的点写入代码中,将波形描绘出来。按照设计好的方案,扩展功能中的任选波形用DA来实现,有2种方法:外接DAC0832或者自带的DAC5571。自带的DAC5571优点:使用较简单(因为有完整的test代码和文档,而且已经集成在5438的开发板上);缺点:速度上不去(因为5438自带的操作DA用来产生任选波形的代码要放在main中,但main函数比较庞大,影响了任选波形的频率)外接DAC0832优点:可以自己去设计DA的驱动函数,产生的任选波形的频率较高;缺点:设计和搭电路较复杂(0832的输出端还要加运放来将电流输出转换成电压输出)综上考虑,我们选择使用自带的DAC处理。键盘本实验中,我们通过按键实现波形切换和调频、调幅。通过开关实现波形的切换比较简单只需通过输出波形后不断返回到检测开关的子程序中,判断是否有别的开关拨动,如果有别的开关拨动则执行别的程序,否则输出原来的波形,不过如果要能够识别别的开关发生变化,必须将此开关关掉否则会识别不了别的键按下。当然开关的调频和调幅的实现也一样,不过首先先输出一个波形,然后再检测开关是否需要调频或者调幅,如果需要则转入到相应的程序中,最后再重新输出波形。下面是我们设计的按键对应控制的功能:LCD显示我们使用的是BW-DK5438开发板自带的TFT液晶屏,用SPI的SCK端来驱动液晶的写信号,当全屏刷新、区域填充时,刷新速度可达10Mpps,因此可以流畅的运行。下图是TFT液晶接口示意图:系统软件设计与实现总体设计框图初始化功能介绍由于初始化代码由开发板自带,且并不很多实际内容,故仅列出初始化流程,省略具体代码。核心代码 主函数中主要功能包括初始化、扫频功能实现、自选波形功能实现以及键盘扫描。伪代码如下:Init();//初始化函数 while(1)//主函数循环 { __delay_cycles(2048000);//键盘扫描延迟 if(扫描使能)//扫频功能函数 { FreqCoeff=(FreqCoeff+1)%99;//当前档位下频率系数递增 DDS输出;LCD显示; }elseif(Mode==3)//自选波形函数 { while(ReadKey()==0xFF)//当无键盘按下时,执行自选波形DAC循环输出 { 自选波形DAC绘制;}} ScanKey();//扫描键盘}DDS功能介绍主要是对AD933进行SPI模拟与单片机进行连接,再根据按键输入的数据分别转换成正弦波、三角波和方波进行输出的程序。其中转换的格式固定,但是AD9833输出频率时是先低位后高位,区别于SPI模拟时单片机给AD9833数据时是先高位后低位。FSYNC为使能,低电平可传数据,刚开始必须为高电平,SCLK为时钟,在下降沿对应数据,SDATE为传数据(频率控制字),16位,但可能单片机输出一次性为8位,必须先高8位后低8位给AD9833的SDATA核心代码:voiddds(void){//WDTCTL=WDTPW+WDTHOLD;//Stopwatchdogtimerunsignedlongfreq_value;//不是频率!是计算出的频率控制字AD9833_SPI_PORT_Init();output_init();switch(FreqStep)//根据频率计算频率控制字{case0:freq_value=(unsignedlong)(FreqCoeff*0x400*1.05);break;case1:{if(FreqCoeff==7)freq_value=(unsignedlong)(0x11800*1.05);elseif(FreqCoeff==8)freq_value=(unsignedlong)(0x13000*1.05*1.05);elseif(FreqCoeff==9)freq_value=(unsignedlong)(0x15800*1.05*1.05);elsefreq_value=(unsignedlong)(FreqCoeff*0x2800*1.05);}break;case2:freq_value=(unsignedlong)(FreqCoeff*0x19000*1.05);break;case3:freq_value=(unsignedlong)(FreqCoeff*0xFA000*1.05);break;default:freq_value=0;break;}switch(Mode)//不同Mode调用不同output函数{case0:output_square(freq_value);//Mode=0对应方波break;case1://Mode=1对应三角波output_triangle(freq_value);break;case2://Mode=2对应三角波output_sinusoid(freq_value);break;default:output_sinusoid(0x00005000);}LCD显示功能介绍完成液晶初始化、显示功能。由于TFT性能优良、尺寸大,且开发板自带TFT液晶驱动程序以及相应显示函数,则在编写过程中,主要内容是通过调用绘制函数,将按键输入的信息显示在TFTLCD上,从而实现人机交互。在LCD上,我们设计了一个图形化的显示界面,它可以实时的反应波形状态、频率、幅值等等信息。下面是该界面的详细说明,上面标示出了各元素的具体坐标:核心代码voidInitInterface(void)///////////初始化{//清屏Clear_LCD(Color_BK);TA0CCR1=220;DrawRectFill(0,0,240,320,WINDOW_BK_COLOR);//绘制背景DrawRectFill(0,0,240,30,STATUS_BK_COLOR);//标题栏Color_BK=STATUS_BK_COLOR;Color=STATUS_COLOR;PutString24M(60,3,"波形发生器");//标题字DrawRectFill(20,60,205,30,WINDOW_COLOR);//波形窗口题Color_BK=WINDOW_COLOR;Color=WINDOW_BK_COLOR;PutString24M(70,63,"波形信息");Color=WINDOW_COLOR;Color_BK=WINDOW_BK_COLOR;DrawRect(20,90,205,125,WINDOW_COLOR);PutString24M(25,105,"波形:");Mode=2;DrawMode();//初始化波形为正弦波PutString24M(25,140,"频率:");FreqStep=0;FreqCoeff=10;DrawFreq();//初始化频率为100HzPutString24M(25,175,"峰-峰值:");Vpp=6;DrawVpp();//初始化峰峰值为0.6VDrawRectFill(0,290,240,30,STATUS_BK_COLOR);}其他绘制函数及关键代码:voidDrawMode(void);—绘制波形模式 PutString24M(90,105,"方波");voidDrawFreqStep(void);—绘制频率档位switch(FreqStep)//判断FreqStep取值,在LCD中绘制档位提示符{case0:PutString24M(130,255,"x100Hz");//100Hz档Break;……}voidDrawFreq(void);—绘制频率unsignedcharstr[10];//用于存储字符型频率值floatfreq_f;//浮点型频率值switch(FreqStep){case0:freq_f=100*FreqCoeff*0.1;//100Hz档位时,频率=频率系数(1-99)*0.1*100,单位Hzbreak;……//其余档位同上,省略}sprintf((char*)str,"%3.1f",freq_f);//浮点型数据到字符串型转换DrawRectFill(90,140,70,30,WINDOW_BK_COLOR);//绘制背景覆盖数据,以防叠加至当前值PutString24M(90,140,str);//绘制当前频率值if(FreqStep==0)PutString24M(170,140,"Hz");//通过判断FreqStep取值,确定绘制的单位为“Hz”或“kHz”elsePutString24M(170,140,"kHz");voidDrawVpp(void);—绘制峰峰值unsignedcharstr[10];//用于存储字符型峰峰值floatVpp_f;//浮点型峰峰值Vpp_f=0.1*Vpp;//峰峰值=峰峰值系数(0-50)*0.1sprintf((char*)str,"%3.1f",Vpp_f);//浮点型数据到字符型数据转换PutString24M(130,175,str);//绘制当前峰峰值PutString24M(170,175,"V");//绘制单位“V”DAC功能介绍DAC在本次设计中完成两个功能:一、通过改变输入的数字信号,输出自选波形;二、输出压控放大器参考电压,从而改变放大器的增益。核心代码////////////////////初始化#defineSDA5571BIT6//DAC5571数据#defineSCK5571BIT7//DAC5571时钟#defineSCL_HP9OUT|=SCK5571#defineSCL_LP9OUT&=~SCK5571#defineSDA_HP9OUT|=SDA5571#defineSDA_LP9OUT&=~SDA5571//完成IIC的起始条件操作voidstart(void){SCL_H;//时钟信号置高SDA_H;//数据线置高delay();//延迟SDA_L;//数据线置低delay();//延迟SCL_L;//时钟信号置低delay();//延迟}///////////////////核心功能实现if(Mode==3)//当自选波形模式{while(ReadKey()==0xFF)//当没有键盘按下时{Write_DAC(voltage++);//递增输出锯齿波}}键盘功能介绍//P6引脚定义#define KPR0 BIT0//键盘0行#define KPR1 BIT1//键盘1行#define KPR2 BIT2//键盘2行#define KPR3 BIT3//键盘3行#defineKPC0 BIT4//键盘0列#define KPC1 BIT5//键盘1列#define KPC2 BIT6//键盘2列#define KPC3BIT7//键盘3列由键盘接口图以及引脚定义可以看出,P6端口的8条I/O端口线被分成4条行线P6.0~P6.3和4条列线P6.4~P6.7。按键的两端分别接在行线和列线上,行线与列线的每个交界处均有一个按键。如果有按键被按下,则与之相连的行线与列线被接通。要想检测是否有按键被按下,先使4条行线输出低电平,读列线P6.4~P6.7。因为所有列线都经上拉电阻接到VCC,如果没有按键被按下,列线读进来的都是高电平1;如果有按键被按下,则列线读进来的电平应与行线输出的一致,为低电平0.据此可以判断是否有按键按下。对于行列扫描式键盘,常采用扫描的办法识别键码。如果4条行线没有输出低电平,那么就可以根据读列线的值来判断这一行是否有键被按下了。核心代码#defineKEY_PORT_INP6IN#defineKEY_PORT_OUTP6OUT#defineKEY_PORT_DIRP6DIR#defineKEY_PORT_RENP6REN#defineROW_IN_COL_OUTP6DIR=KPC0+KPC1+KPC2+KPC3;\P6OUT=~(KPC0+KPC1+KPC2+KPC3);\__delay_cycles(20)//键盘列输出行输入#defineCLO_IN_ROW_OUTP6DIR=KPR0+KPR1+KPR2+KPR3;\P6OUT=~(KPR0+KPR1+KPR2+KPR3);\__delay_cycles(20)//键盘行输出列输入unsignedcharReadKey(void){unsignedcharcolumn,row,key;//分别表示行、列线读取值、返回键值unsignedcharKey;//储存键值对应的8位键盘扫描值,对应关系见下图ROW_IN_COL_OUT;//键盘列输出行输入row=KEY_PORT_IN&(KPR0+KPR1+KPR2+KPR3);//读取P6端口并屏蔽高4位输出值即行线值if(row!=(KPR0+KPR1+KPR2+KPR3))//若行线没有输出低电平,说明有按键按下{CLO_IN_ROW_OUT;//键盘行输出列输入column=KEY_PORT_IN&(KPC0+KPC1+KPC2+KPC3);//读取P6并屏蔽低4位即列线值ROW_IN_COL_OUT;//键盘列输出行输入Key=row+column;//行列线值相加,则高低4位的不同取值可以表示不同的键值_NOP();switch(Key)//通过判断键值做出对应的响应{case0xE7:key=1;break;case0xD7:key=2;break; ……//其他键值省略default:key=0xFF;}}elsekey=0xFF;//若没有键盘输出,则返回键值0xFFKEY_PORT_DIR=0xFF;//键盘8个IO口均设置为输出KEY_PORT_OUT=0x00;//输出低电平returnkey;//返回逻辑键值}下图是8位键值与逻辑值对应关系:各按键功能代码按键1:模式选择按键后Mode值循环模4递增,在方波、三角波、正弦波、自选波形中单向切换。通过改变全局变量Mode值,可以传递给LCD模块输出正确的波形模式显示在屏幕上,并通过调用DDS模块的函数输出正确的控制字给DDS从而输出正确波形。Mode=(Mode+1)%4;//0-方波,1-三角波,2-正弦波,3-自选波形DrawMode();//绘制修改后的波形模式dds();//dds输出修改后的波形按键2:频率档位选择按键后FreqStep值循环模4递增,在100Hz、1kHz、10kHz、100kHz四个档位中单向切换,通过改变全局变量FreqStep值,确定频率档位的选择。在切换档位后初始化频率系数FreqCoeff=50,即将频率值置为该档位下的中间值,方便使用。同按键“1”,将改变后的档位值输出在LCD上,并调用DDS函数输出正确波形。FreqStep=(FreqStep+1)%4;//0-100Hz,1-1kHz,2-10kHz,3-100kHzDrawFreqStep();//绘制频率档位值FreqCoeff=50;//初始化系数为50,便于调试和使用DrawFreq();//绘制修改后的频率值dds();//dds输出修改后的波形按键3:扫频按键可使扫频使能信号在0,1中切换,通过判断是否为可以扫频的三种基本波形,改变扫频使能信号,在主函数中可以确定当前是否处于扫频状态,实现扫频功能。在LCD显示的过程中,需要注意通过清屏消除“扫频”字样。//判断是否处于三种基本波形模式下,若不是则无扫频功能if(Mode==0||Mode==1||Mode==2){if(FreqScanEn==0)//若扫频使能为低{FreqScanEn=1;//通过按键,修改使能信号为高PutString24M(160,105,"-扫频");//绘制扫频模式至TFT}else//若扫频使能为高{FreqScanEn=0;//通过按键,修改使能信号为低//绘制底色,消除TFT显示的扫频字样DrawRectFill(160,105,60,30,WINDOW_BK_COLOR);}}按键4、7:频率增减按键可使频率系数FreqCoeff在1-99中递增或递减,该数值表示在当前频率档位中,频率步进的系数,由于频率步进设计为档位的0.1倍,故当前频率值的计算公式为:频率值=FreqCoeff*0.1*FreqStep 由于FreqStep、FreqCoeff两个全局变量可以唯一确定当前频率值,输出给LCD模块可以在屏幕上可以正确显示,并输出正确控制字给DDS模块。//当系数小于99时,按键递增//当系数大于1时,按键递减if(FreqCoeff<99)FreqCoeff++;if(FreqCoeff>1)FreqCoeff--;DrawFreq();DrawFreq();dds();dds();按键5、8:幅度细调由于峰峰值的改变是通过开发板自带的DAC输出控制电压来改变压控放大器的放大倍数来实现,而8位DAC输出电压值由输入8位数字值(voltage)控制,当按下“5”、“8”按键后,voltage以1为步进增减,即可以最小分辨率调节输出波形的峰峰值。voltage++;voltage--;Write_DAC(voltage);Write_DAC(voltage);按键6、9:幅度粗调为了实现峰峰值以0.1V步进增减,设计步进按钮。按键后全局变量Vpp相应变化,输出给LCD显示。读取v1[51]数组中相应输出值,使DAC输出正确的压控电压,达到幅度控制的目的。if(Vpp<50)Vpp++;if(Vpp>0)Vpp--;DrawVpp();DrawVpp();voltage=v1[Vpp];voltage=v1[Vpp];Draw(voltage);Draw(voltage);Write_DAC(voltage);Write_DAC(voltage); 实际联调中,由于DDS方波输出电压与三角波、正弦波输出电压值有很大的区别,可以在读取数组值时,判断当前模式,进行对应的修改。修改后代码: If(Mode==0){//方波时 …… Voltage=v2[Vpp]; ……}elseif(Mode==1||Mode==2){//三角波、正弦波时 …… Voltage=v1[Vpp] ……}系统测试与结果总体方案选择原方案我们原定由MSP430F149单片机作为波形发生器的主控制器。因为在种类和数量繁多的单片机中,TI的MSP430系列颇具特色,并具有良好的性能。我们原计划采用MSP430F149控制DDS输出高频率的正弦波、方波和三角波。输出的数字波形通过DAC0832转换为模拟波形。模拟波形经过滤波、放大、稳幅电路后,就可以输出到示波器观察。输入采用4×4键盘中断控制。这样可以最大限度的避免占用CPU机时。输出采用LED循环显示频率和幅度,以及用字符表示当前波形。下图是原方案系统框图:遇到的障碍:但是随着工作的深入,我们遇到了很多障碍和预想不到的困难。比如LED显示的效果并不好,特别是和LCD比较起来明显很粗糙。所以我们决定改用LCD显示。然而这样又带来了新的问题,149不能直接相连LCD去控制,它需要很复杂的外围驱动电路和软件控制。我们在经过很长时间的尝试之后还是没能成功。再加上其他很多编程时遇到的细节问题,经过讨论决定使用430开发板。改进方案:考虑到上面的问题,我们购买了一块开发板,它使用的是比430F149更先进的核心芯片430F5438。工作原理是430产生DDS的控制字,让后者输出正弦波、三角波或是方波。波形经过放大稳幅后输出。其实也可以直接通过查表法让430产生各种波形,但430系列是以其低功耗见长,数MHz的主频虽然并不低,但还不足以产生百kHz以上的正弦波形。为了达到尽可能高的输出频率,我们这样做,而是仅仅把430用作控制用途。为了控制幅度,我们决定使用一个压控调幅器件。用430输出振幅相应的数字信号通过DA转换为模拟信号,输入到VCA中控制需要波形的幅度。硬件电路测试VCA810压控放大器首先,在连接VCA810压控放大器的时候,按照Datasheet上面的电路连接,如下图:由于参考电压Vc应为负,调试阶段Vc的输入我用的是-5V的电压分压。可是波形几乎没有输出,而且没有任何改变放大倍数的迹象。这块芯片的电路调了一整天,后来发现Rc不能连,因为会和我设计的分压器并联,使得电压非常低,去掉之后波形的冲击消失。但是仍然不可调放大倍数,后来将RL由并联改成串联,串上一个100欧的电阻,结果输出波形正常。Datasheet上的VCA810可调放大倍数范围是1/100~100,由于实际上芯片只有正负5V的电压,而输入的正弦波和三角波的幅度有680mV,方波的幅度有6.8V,所以实际上不可能达到100倍,实际上只有七八倍左右,而缩小可以达到1/100。我们需要精确的调幅,所以这一级只用它的缩小。我们从DA送给它的参考电压为0~-1V。OPA1632在调试由OPA1632搭的放大电路时,基本上很顺利,只是实际的放大倍数小于理论的放大倍数。但是在调试由OPA1632搭的电压跟随器时,偶尔会出现自激和干扰,加上输出对地的电容时,输出就很好了。级联DDS和VCA810及OPA1632级联时,出现各种问题,要不就是失真,要不就是频率上不去。最开始,我试过在DDS和VCA810之间加上一级电压跟随器,因为DDS的带负载能力不强,它输出的正弦波和三角波本来有680mV,加上后级电路时,马上衰减到100mV左右。而电压跟随器的带负载能力很强,接上这一级之后输出电压就不变了。但是后来我们发现VCA810的输入最大只能有5V,而DDS接电压跟随出来的方波幅度有6.8V,因此不能直接接VCA,我考虑接衰减电路,但是后来觉得去掉电压跟随器,直接利用由于带负载能力不强的因素产生的衰减电压,输入到VCA中。事实表明这个方法很管用。VCA810和OPA1632之间级联的时候也是有些问题,后来接了一个耦合电容在两极之间,滤除直流成分,效果比较好。由于DDS衰减,我开始尝试接两级放大,在带负载的时候出现强烈的干扰,考虑到放大器有同相和反相两种,同相容易引起电磁干扰,我把第二级放大电路改为反相放大,而第一级仍然为同相放大器,结果很好。关于换备选方案由于最后一天我们的AD9833因为误操作烧了,所以不得不启用临时方案,临时方案的性能没有原来的好,后面也不需要两级放大了,我就直接接一级放大,然后接电压跟随器输出。但是这个备选方案的频率有点达不到200Khz。其他功能都很好。系统联调结果三角波、正弦波、方波测试结果经过测试输出波形的频率范围为10Hz-200KHz,完成了系统的基本要求100Hz-20kHz(非正弦波频率按10次谐波计算)和扩展功能要求;重复频率可调,频率步进间隔设为四档:10Hz、100Hz、1KHz和10KHz,调节初始值分别为500Hz、5KHz、50KHz、500KHz,满足了频率步进小于等于100Hz的基本要求,并可以实现频率的快速调节。综上所述,本系统完成了正弦波的基本要求并达到了扩展频率要求。具体的测试过程如下所示:图中CH2接的是整个模块电路处理后最终波形。下图为频率20KHz的时候的输出波形,可以看到波形没有失真,输出比较理想。输入波形峰峰值为100mV左右,输出峰峰值为5V左右的波形如下,符合设计标准。三角波:正弦波:方波:下面三图为频率200KHz的时候的输出波形,可以看到波形基本没有失真,输出比较理想。输入波形峰峰值为100mV左右,输出峰峰值为1-2V左右的波形如下,符合设计标准。三角波:正弦波:方波:扩展波形的测试结果除了基本的波形设计以外,我们还设计了一个自己较为常用的锯齿波形,如下。扩展扫频功能的测试结果可以实现从10Hz到500KHz的大范围扫频功能,其基本测试情况满足要求(附件中有扫频功能的视频)结束语目标完成情况基本要求中:能够产生正弦波、方波、三角波三种周期性波形;输出波形的频率范围为100Hz-20KHz(非正弦波频率按10次谐波计算);重复频率可调,频率步进间隔≤100Hz(我们最小步进可以达到10Hz);输出波形幅度范围0-5V(峰峰值),可按步进0.1V(峰峰值)调整(我们可以微调(步进<0.1V)和粗调(步进0.1V峰峰值));可由外界按键输入选择产生波形的种类、频率与峰峰值;通过LCD界面显示输出波形的类型、重复频率(周期)和幅度。发挥部分中:输出波形频率范围扩展至100Hz-200KHz;用键盘产生任意波形(事先存储在msp430的flash中的波形);增加稳幅输出功能,当负载变化时,输出电压幅度变化不大于±3%(负载电阻变化范围:100Ω)(我们是在200Ω的基础上变化100Ω的范围);方波,三角波,正弦波的扫描输出功能。感想这学期的硬件课程设计是以TI杯的形式进行的,我们选择了波形发生器这个题目。相比较另一个题目温度巡检,波形发生器更加需要硬件电路的设计和调试,而温度巡检则增多的是编程。既然做的是硬件课程设计,所以经过协商,我们选择波形发生器这个命题。

之所以选择MSP430,是为了符合TI杯的宗旨。并且在随后的工作中,随着不断的查找相关用户手册、数据手册,我们确实被TI公司丰富的产品型号和配套的严谨资料所折服。此外,TI让我们可以极其方便的申请样片,这大大方便了我们的工作同时也节约不少经费。这种经营方式也让我们大开眼界。硬件课设和我们之前做的注重理论的项目完全不同,趣味性强,不仅锻炼能力,而且可以学到很多东西。在与老师和同学的交流过程当中,互动学习,将知识融会贯通,这是我们所有组员共享的一笔非常宝贵的财富。

回忆这些废寝忘食的日子,有苦也有欢乐。在开始阶段基础知识的不足成为一个非常大的问题。在很多基础问题上走了不少弯路。等到渐渐步入正轨的时候,时间又所剩无几。再加上因为技术生疏,调试时因为个人的误操作烧坏过不少芯片,造成工作无法顺利继续的情况也时有发生。每当这时,我们的工作气氛不可避免地会很压抑,然后经过紧张的补救、寻求帮助之后,直到解决之时,才终于喘了一口气。而由此而来的幸福感,不亲身经历过也是无从得知的。

快乐至上,享受过程,而不是结果。认真对待每一个实验,珍惜每一分一秒,学到最多的知识和方法,锻炼自己的能力,这个是我们在本次课设上学到的最重要的东西,也是以后都将受益匪浅的!

参考文献[1]Datasheet:MSP430F5438、AD9833、VCA810、OPA1632、UA741等[2]洪利等编著《MSP430单片机原理与应用实例详解》北京航空航天大学出版社ISBN:978-7-5124-0122-82010年7月[3]周灵彬任等编著《基于Proteus的电路与PCB设计》电子工业出版社ISBN:978-7-121-11614-82010年10月附录电路图总体电路图:其中,DDS部分电路图是:源码清单voidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗//AD9833_SPI_PORT_Init();//output_init();Init();LCD_Init();Clear_LCD(Color_BK);_EINT();InitInterface();Init_I2C();voltage=0;while(1){__delay_cycles(2048000);if(FreqScanEn==1&&(Mode==0||Mode==1||Mode==2))//扫频{FreqCoeff=(FreqCoeff+1)%99;dds();DrawFreq();}ScanKey();}}///////////////////////////////////////////////////////////////////////////////////////////////////////////externvoidInit_LCD(void);externunsignedintColor;//前景颜色externunsignedintColor_BK;//背景颜色voidInit_Port(void);voidInit_CLK(void);voidInit_Timer0_A5(void);voidInit_KeyPad(void);voidInitInterface(void);///////////////////////////////////////////////////////////////////////////////////////////////////////////#pragmavector=TIMER0_A0_VECTOR__interruptvoidTimer0_A0(void){P7OUT^=BUZZER;}//系统初始化voidInit(void){Init_CLK();Init_Port();Init_KeyPad();Init_Timer0_A5();}voidInit_KeyPad(void){KEY_PORT_REN=0xFF;KEY_PORT_OUT=0x00;}//***************************************************************************////Init_Port(void):设置IO端口////***************************************************************************//voidInit_Port(void){//P5DIR|=POWER;//主电源MAIN_POWER_ON;}//***************************************************************************////////函数:Init_CLK(void)////功能:初始化主时钟:MCLK=XT2////////***************************************************************************//voidInit_CLK(void){WDTCTL=WDTPW+WDTHOLD;//关看门狗P5SEL|=0x0C;//端口功能选择振荡器UCSCTL6&=~XT2OFF;//振荡器使能UCSCTL3|=SELREF_2;//FLLref=REFOUCSCTL4|=SELA_2;//ACLK=REFO,SMCLK=DCO,MCLK=DCOP7SEL|=0x03;//端口选择外部低频晶振XT1//UCSCTL6&=~XT1OFF;//使能外部晶振UCSCTL6|=XCAP_3;//设置内部负载电容UCSCTL3|=SELREF_2;//DCOref=REFO//UCSCTL4|=SELA_0;//ACLK=XT1__bis_SR_register(SCG0);//关闭FLL控制回路UCSCTL0=0x0000;//设置DCOx,MODxUCSCTL1=DCORSEL_7;//设置DCO振荡范围UCSCTL2=FLLD__1+FLL_FACTOR;//Fdco=(FLL_FACTOR+1)×FLLRef=(649+1)*32768=21.2992MHz__bic_SR_register(SCG0);//打开FLL控制回路__delay_cycles(1024000);do{UCSCTL7&=~(XT2OFFG+XT1LFOFFG+XT1HFOFFG+DCOFFG);//清除XT2,XT1,DCO错误标志SFRIFG1&=~OFIFG;}while(SFRIFG1&OFIFG);//检测振荡器错误标志UCSCTL6|=XT2DRIVE0+XT2DRIVE1;//XT2驱动模式24~32MHzUCSCTL4|=SELS_5+SELM_5;//SMCLK=MCLK=XT2}//***************************************************************************////Init_TimerA0(void):设置TimerA0////************************************************************************

温馨提示

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

评论

0/150

提交评论