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

下载本文档

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

文档简介

1、华中科技大学电子与信息工程系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单

2、片机73.2.2数模转换DAC73.2.3压控增益放大器73.2.4运算放大器84系统硬件设计与实现84.1系统框图84.2系统电路图94.3器件清单94.4模块分析104.4.1DDS104.4.2幅度控制114.4.3放大稳压134.4.4自选波形144.4.5键盘144.4.6LCD显示155系统软件设计与实现165.1总体设计框图165.2初始化175.3DDS185.4LCD显示195.5DAC215.6键盘226系统测试与结果266.1总体方案选择266.1.1原方案266.1.2遇到的障碍:276.1.3改进方案:276.2硬件电路测试276.2.1VCA810压控放大器276.

3、2.2OPA1632286.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源码清单35511. 设计目标设计并制作一个波形发生器,该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定波形,并根据用户输入选择产生指定类型与参数的波形,同时在必要的辅助输出显示设备上显示产生波形的类型与参数。1.1 基本功能l 具有产生正弦波、方波、三角波三种周期性波形的功能;l 输出波形的频

4、率范围为100Hz-20KHz(非正弦波频率按10次谐波计算);重复频率可调,频率步进间隔100Hz。l 输出波形幅度范围0-5V(峰峰值),可按步进0.1V(峰峰值)调整。l 由外界按键输入选择产生波形的种类、频率与峰峰值;l 界面显示输出波形的类型、重复频率(周期)和幅度。1.2 扩展功能l 输出波形频率范围扩展至100Hz-200KHz。l 用键盘或其它输入装置产生任意波形。l 增加稳幅输出功能,当负载变化时,输出电压幅度变化不大于±3%(负载电阻变化范围:100)。l 可产生单次或多次(1000次以下)特定波形(如产生1个半周期三角波输出)。l 具有掉电存储功能,可存储掉电前

5、用户编辑的波形和设置。l 其它(如增加频谱分析、失真度分析、频率扩展大于200KHz、扫描输出等功能)。2 团队组成我们的工作分为以下模块(详细分工在个人报告中叙述)l 前期:收集资料、方案设计、器件选型 l 硬件部分:电路参数设计、proteus制图及硬件仿真、各单级调试、PCB布线、通用版布线、电路焊接、排查焊接错误 l 软件部分: LCD模块、键盘扫描模块、DDS模块、调频、扫频、模块间接口设计与实现、自选波形模块(DA部分)、软件联调l 后期:硬件级联调试、软件联调报告书写、文档排版、幻灯片演示、视频制作、答辩展示3 系统设计方案3.1 几种初步方案3.1.1 方案一由MSP43F14

6、9单片机产生三角波、正弦波和方波,并且控制波形之间的转换,以及波信号的频率和幅度。用LCD液晶显示模块显示波形的种类和相关参数。单片机输出数字信号,通过DAC进行数模转换。采用低通滤波器滤除DAC转换过程中形成的高频小锯齿波,运算放大器进行放大,电压跟随器稳幅,最后送入示波器显示信号。3.1.2 方案二用DDS(直接数字合成 Direct Digital Synthesis)芯片产生三角波、正弦波和方波,并用MSP430单片机送控制字给DDS以控制波形之间的转换,以及波信号的频率,通过TI公司的VCA810压控放大器芯片进行调幅。然后通过滤波器滤除高频噪声,通过放大电路对信号进行放大,之后通过

7、缓冲对信号进行稳幅,最后送入示波器显示信号,用单片机产生任意波形和其他扩展功能。3.1.3 方案的比较方案一的基本思路是用单片机发出指令输出相应的数字量,然后通过DA产生要求的模拟量,但是存在一个致命的问题,那就是本次的频率基本要求为100Hz-20KHz,扩展要求是100-200KHz,但是通常的MSP430系列单片机的晶振一般为8M左右,指令周期是机器周期,可达1/8ms,所以对生成方波来说还可以,而要合成三角波或正弦波则存在很多问题,程序实现难度很大,所以我们最终放弃了这个方案。方案二的基本思路是走两条路,使用DDS芯片产生三种基本波形,用单片机实现任意波形以及控制和显示等功能,容易对功

8、能进行扩充,且外围电路简单,系统可靠性较高,编程实现较为简单,整个系统成本较低,我们最终选择了这个方案。信号初步产生之后都要经过滤波、放大、缓冲输出等电路,各个方案下的设计大同小异,主要还是需要稳定可靠,带宽很宽。3.2 器件选型3.2.1 单片机选用MSP430F5438单片机,因为在种类和数量繁多的单片机中,TI的MSP430系列颇具特色,并具有良好的性能。3.2.2 数模转换DAC按照设计好的方案,扩展功能中的任选波形用DA来实现,有2种方法:外接DAC0832或者自带的DAC5571。l 自带的DAC5571优点:使用较简单(因为有完整的test代码和文档,而且已经集成在5438的开发

9、板上);缺点:速度上不去(因为5438自带的操作DA用来产生任选波形的代码要放在main中,但main函数比较庞大,影响了任选波形的频率)l 外接DAC0832优点:可以自己去设计DA的驱动函数,产生的任选波形的频率较高;缺点:设计和搭电路较复杂(0832的输出端还要加运放来将电流输出转换成电压输出)我们选择第一种自带DA3.2.3 压控增益放大器比较两个选择:VCA810和VCA822。具体来说,我们比较它们的增益带宽积,输出(驱动)电流,及我们对芯片的熟悉程度。最后决定选择VCA810,利用DAC产生控制电压改变放大器的增益。控制电压和放大器增益成线性,方便实现精确的增益控制。VCA810

10、的最小增益步进仅取决于 DAC 的位数,可以实现增益微调,为闭环改善放大器的性能提供方便。3.2.4 运算放大器主要考虑因素有增益带宽积,输出驱动电流(表明带负载的能力),噪声电压,电路复杂程度,对芯片的熟悉程度和价格,对于常用的几个比较结果如下:l OPA1632:增益带宽积:180MHZ; 输出驱动电流:150mAl OPA551:带宽:3MHZ;,增益带宽积:3MHZ; 输出驱动电流:200mAl OPA552:带宽:12MHZ,增益带宽积:3MHZ; 输出驱动电流:200mAl NE5532:小信号带宽:10MHZ, 输出驱动电流:60mAl THS4031:增益带宽积:100MHZ,

11、 输出驱动电流:90mAl THS4521:带宽:145MHZ, 输出驱动电流:100mAl uA741:增益带宽积:1MHZ, 输出驱动电流:25mAl 综合考虑,opa1632各项性能比其他芯片要好很多,因此决定选用opa16324 系统硬件设计与实现4.1 系统框图 由MSP430单片机通过3个SPI接口控制AD9833产生各种频率的正弦波、三角波、方波,经放大整形电路后输出,并通过独立的按键切换输出的波形,也可改变频率和幅度以及频率和幅度变化的步进(通过软硬件的配合)。通过TFT液晶模块和独立按键进行人机交互。系统上电后检查启动按键是否按下,当启动按下被按下时,启动各个模块,与此同时检

12、查被按下的按键值。当检查到不同的按键被按下时,由MSP430通过SPI控制AD9833进行相应的改变。4.2 系统电路图其中DDS模块较为复杂,上图只是外部接口。其详细电路设计如下图所示:4.3 器件清单l msp430f5438开发板(1个)l VCA810压控增益放大器(1个)l OPA1632放大器(3个)l AD9833(1个)l UA741放大器(1个)l 电阻,电容,导线若干4.4 模块分析4.4.1 DDS 1) AD9833介绍AD9833是ADI公司的一款低功耗的DDS器件,能够输出正弦波、三角波、方波。AD9833无需外接元件,输出频率和相位可通过软件编程设置,易于调节。其

13、频率寄存器为28位,主频时钟为25 MHz时,其精度为01 Hz;主频时钟为l MHz时精度可达0004 Hz.AD9833内部有5个可编程寄存器:1个16位控制寄存器,用于设置器件_T作模式;2个28位频率寄存器和2个12位相位寄存器,分别用于设置器件输出正弦波的频率和相位。它的SIN-ROM查询表把输入的地址相位信息映射成正弦波幅值的数字量信号,驱动DA转换器输出模拟量。输出正弦波频率为:fout=FREQREG(fMCLK/228)式中:FREQREG为频率控制字,由频率寄存器FREQOREG或FREQlREG的值给定,其范围为0M<228-1 fMCLK为参考时钟频率。2) 从单

14、片机输入控制字AD9833模块有3根串行接口线,分别是FSYNC、SCLK和SDATA,与SPI、QSPI、MICROWIRE和DSP接口标准兼容,在串口时钟SCLK的作用下,数据是以16位的方式加载到设备上,FSYNC引脚是使能引脚,电平触发方式,低电平有效。进行串行数据传输时,FSYNC引脚置低,在16个SCLK的下降沿数据通过SDATA引脚被送到AD9833的输入移位寄存器。因此,此处我们通过3个100的电阻进行限流,并将这3个引脚接到单片机MSP430F5438的P9.4、P9.3和P9.2脚,通过单片机来控制AD9833。下图是SCI串行数据通信的时序图:3) 从Vout的各种输出O

15、PBITEN BitMODE BitDIV2 BitVOUT Pin00X正弦波01X三角波100DAC数据的MSB / 2 101DAC数据的MSB其中MSB/2和MSB对应为方波,且MSB/2为MSB频率的一半。即正弦波,三角波,方波对应的频率控制字分别为:0x2000,,0x2002,0x2028(MSB方波),0x2020(MSB/2方波)。4) 完整工作流程简介l 虽然MSP430单片机具有硬件SPI总线功能,但是一次只能传输8位数据位,而AD9833在接收数据时是16位数据位,因此,需要用软件模拟SPI总线;l AD9833在接收16位数据时是高位在前,低位在后;l 先发送控制寄存

16、器字然后发送想要的频率字;l 发送数据前必须把FSYNC置成低电平,发送完以后把FSYNC置成高电平;l 当对AD9833初始化时,为了避免DAC产生虚假输出,RESET必须置为1,直到配置完毕,需要输出时才将RESET置为0。RESET为0后的89个MCLK时钟周期就可在DAC的输出端观察到波形。l 在+5V的电源电压下DDS的输出峰峰值为:0.6V,但测试后发现三角波和正弦波的输出峰峰值在0.68V左右,而方波的输出峰峰值超过6V,这也成为后面处理的一个考虑的比较多的问题4.4.2 幅度控制1) 我们考虑了如下四种方案:i. 由数控电位器组成的电阻分压网络控制幅度。 ii. 采用峰值检波器

17、获得输出端的电压幅值,经A/D采样后得到输出端当前的电压幅值,然后就得到了输出当前的电压幅值,然后通过与预设的输出幅值比较就可以知道输出下降的情况。并由单片机控制放大器增加放大倍数,直至输出幅值调整到预期值。 iii. 采用一级D/A转换实现。直接将DDFS产生的信号作为参考电压输入到D/A中,这样D/A就成为一个数控可变增益放大器,通过改变D/A的转换数据就可以控制输出幅度。 iv. 数模转换和幅度控制部分采用双D/A技术,由单片机控制,第一级D/A的输出波形作为第二级D/A的基准电压源,以此来控制信号发生器的输出电压幅度。最后经分析和试验,方案四电路简单、通过软件控制、可控性强,故采用这种

18、方案。2) VCA810介绍本实验中,调幅部分我们选用TI公司的VCA810芯片,VCA810是一个宽带、连续变化、电压控制增益放大器。它提供了一个对差分输入单端输出转换与高阻抗输入用来改变增益控制的增益线性范围为-40dB到+ 40dB在dB / V。供给电压±5V、VCA810增益控制电压在0V时为-40dB,在-2V为+ 40dB。增加地面控制电压将衰减信号> 80dB。信号带宽和压摆率保持在整个增益调节范围内保持恒定。这40db/ V增益控制在±1.5db(最高误差范围±0.9db),让应用程序在一个AGC增益控制电压精确到作为接收信号强度指示器(R

19、SSI)的使用精度为±1.5db。通过调节控制电压(Vc)来控制压控增益放大器VCA810的放大增益,从而控制正确的输出。VCA810 作为压控增益的主要部分, 其增益与控制电压的关系为:G=-40(VC+1)其中, Vc 表示控制电压, 可见, VCA810 的增益与其控制电压成线性关系, 只要用单片机控制D/ A 输出一线性变化的控制电压给Vc, 便可得到线性变化的电压增益输出理论上VCA810可调的放大倍数为1/100100,实际上由于DDS输出的正弦波和三角波幅度为680mV,方波的幅度为6.8V左右,而且VCA的工作电压只有-5V+5V,所以放大倍数不可能为100倍,差不多

20、达到7、8倍,但是缩小则可以到1/100。为了确保调节的精确,我们采用VCA810的缩小功能,提供给它的参考电压为0-1V。经过这一级缩小后,再送入后级放大。3) uA741反相模块由于我们采用的MSP430单片机自带DA模块,所以没有外接DA,利用单片机给DA写控制字,使DA输出幅值可变的电压作为VCA810的参考电压。从DA输出的电压幅度值范围为03.3V,而VCA810要求的参考电压为0-1V,所以需要反相和缩小,利用简单的uA741实现,电路如下:4.4.3 放大稳压1) OPA1632介绍设计运算放大器时,我们考虑了许多不同型号的运放,功能各异,主要考虑增益带宽积,输出驱动电流(表明

21、带负载的能力),噪声电压,(电路复杂程度,芯片熟悉程度,价格)等等。TI公司的OPA1632是音频运算放大器,性能比较好。增益带宽积为180MHZ,输出驱动电流为150mA。可以工作在较高频率下而不出现失真,且驱动能力较好。2) 功能实现该实验中,我们主要用OPA1632设计放大电路和电压跟随器。放大电路主要分为同相比例放大器和反相比例放大器两种。 反相比例放大器 同相比例放大器反相放大电路有如下特点:l 运放两个输入端电压相等并等于0,故没有共模输入信号,这样对运放的共模抑制比没有特殊要求。l vN= vP,而vP=0,反相端N没有真正接地,故称虚地点。l 电路在深度负反馈条件下,电路的输入

22、电阻为R1,输出电阻近似为零。l 输入输出关系: Vo=-RfRlVs同相比例运算电路的特点如下:l 输入电阻很高,输出电阻很低。l 由于vN= vP= vS,电路不存在虚地,且运放存在共模输入信号,因此要求运放有较高的共模抑制比。l 输入输出关系: Vo=(1+RfRl)Vs由于实际放大倍数比理论值低,所以我们设计Rf=100千欧,R1=5.1千欧,放大倍数约为21倍。4.4.4 自选波形实现自选波形有两种不同的理解和方法:l 手动描波形,由硬件接收,然后描点显示出来;l 写好一组波形,存在flash内部,通过按键选择我们实现的是第二种,首先用MATLAB描出想要产生的任意波形,然后取出大量

23、的点写入代码中,将波形描绘出来。按照设计好的方案,扩展功能中的任选波形用DA来实现,有2种方法:外接DAC0832或者自带的DAC5571。 l 自带的DAC5571优点:使用较简单(因为有完整的test代码和文档,而且已经集成在5438的开发板上);缺点:速度上不去(因为5438自带的操作DA用来产生任选波形的代码要放在main中,但main函数比较庞大,影响了任选波形的频率)l 外接DAC0832优点:可以自己去设计DA的驱动函数,产生的任选波形的频率较高;缺点:设计和搭电路较复杂(0832的输出端还要加运放来将电流输出转换成电压输出)综上考虑,我们选择使用自带的DAC处理。4.4.5 键

24、盘本实验中,我们通过按键实现波形切换和调频、调幅。通过开关实现波形的切换比较简单只需通过输出波形后不断返回到检测开关的子程序中,判断是否有别的开关拨动,如果有别的开关拨动则执行别的程序,否则输出原来的波形,不过如果要能够识别别的开关发生变化,必须将此开关关掉否则会识别不了别的键按下。当然开关的调频和调幅的实现也一样,不过首先先输出一个波形,然后再检测开关是否需要调频或者调幅,如果需要则转入到相应的程序中,最后再重新输出波形。下面是我们设计的按键对应控制的功能:4.4.6 LCD显示我们使用的是BW-DK5438开发板自带的TFT液晶屏,用SPI的SCK端来驱动液晶的写信号,当全屏刷新、区域填充

25、时,刷新速度可达10Mpps,因此可以流畅的运行。下图是TFT液晶接口示意图:5 系统软件设计与实现5.1 总体设计框图5.2 初始化1) 功能介绍由于初始化代码由开发板自带,且并不很多实际内容,故仅列出初始化流程,省略具体代码。2) 核心代码主函数中主要功能包括初始化、扫频功能实现、自选波形功能实现以及键盘扫描。伪代码如下:Init();/初始化函数 while(1) /主函数循环 _delay_cycles(2048000);/键盘扫描延迟 if(扫描使能)/扫频功能函数 FreqCoeff=(FreqCoeff+1)%99;/当前档位下频率系数递增 DDS输出;LCD显示; else i

26、f(Mode=3) /自选波形函数 while(ReadKey() = 0xFF) /当无键盘按下时,执行自选波形DAC循环输出 自选波形DAC绘制; ScanKey();/扫描键盘5.3 DDS1) 功能介绍主要是对AD933进行SPI模拟与单片机进行连接,再根据按键输入的数据分别转换成正弦波、三角波和方波进行输出的程序。其中转换的格式固定,但是AD9833输出频率时是先低位后高位,区别于SPI模拟时单片机给AD9833数据时是先高位后低位。FSYNC为使能,低电平可传数据,刚开始必须为高电平,SCLK为时钟,在下降沿对应数据,SDATE为传数据(频率控制字),16位,但可能单片机输出一次性

27、为8位,必须先高8位后低8位给AD9833的SDATA 2) 核心代码:void dds(void) /WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timer unsigned long freq_value; /不是频率!是计算出的频率控制字 AD9833_SPI_PORT_Init(); output_init(); switch (FreqStep) /根据频率计算频率控制字 case 0: freq_value = (unsigned long)(FreqCoeff * 0x400 * 1.05); break; case 1: if (Freq

28、Coeff = 7) freq_value = (unsigned long)(0x11800 * 1.05); else if (FreqCoeff = 8) freq_value = (unsigned long)(0x13000 * 1.05 *1.05); else if (FreqCoeff = 9) freq_value = (unsigned long)(0x15800 * 1.05 *1.05); else freq_value = (unsigned long)(FreqCoeff * 0x2800 * 1.05); break; case 2: freq_value = (

29、unsigned long)(FreqCoeff * 0x19000 * 1.05); break; case 3: freq_value = (unsigned long)(FreqCoeff * 0xFA000 * 1.05); break; default: freq_value = 0; break; switch (Mode) /不同Mode调用不同output函数 case 0: output_square(freq_value); /Mode=0对应方波 break; case 1: /Mode=1对应三角波 output_triangle(freq_value); break;

30、 case 2: /Mode=2对应三角波 output_sinusoid(freq_value); break; default: output_sinusoid(0x00005000); 5.4 LCD显示1) 功能介绍完成液晶初始化、显示功能。由于TFT性能优良、尺寸大,且开发板自带TFT液晶驱动程序以及相应显示函数,则在编写过程中,主要内容是通过调用绘制函数,将按键输入的信息显示在TFTLCD上,从而实现人机交互。在LCD上,我们设计了一个图形化的显示界面,它可以实时的反应波形状态、频率、幅值等等信息。下面是该界面的详细说明,上面标示出了各元素的具体坐标:2) 核心代码void Ini

31、tInterface(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); / 波形窗口

32、题 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

33、 = 10;DrawFreq();/初始化频率为100Hz PutString24M(25,175,"峰-峰值:");Vpp = 6;DrawVpp();/初始化峰峰值为0.6V DrawRectFill(0,290,240,30,STATUS_BK_COLOR);其他绘制函数及关键代码:l void DrawMode(void); 绘制波形模式PutString24M(90,105,"方波 ");l void DrawFreqStep(void); 绘制频率档位 switch(FreqStep)/判断FreqStep取值,在LCD中绘制档位提示符 ca

34、se 0: PutString24M(130,255,"x100 Hz");/100Hz档Break; l void DrawFreq(void); 绘制频率 unsigned char str10;/用于存储字符型频率值 float freq_f;/浮点型频率值 switch(FreqStep) case 0: freq_f = 100 * FreqCoeff * 0.1;/100Hz档位时,频率 = 频率系数(1-99) * 0.1 * 100,单位Hz break; /其余档位同上,省略 sprintf(char *)str,"%3.1f",fre

35、q_f);/浮点型数据到字符串型转换 DrawRectFill(90,140,70,30,WINDOW_BK_COLOR);/绘制背景覆盖数据,以防叠加至当前值 PutString24M(90,140,str);/绘制当前频率值 if(FreqStep = 0)PutString24M(170,140," Hz");/通过判断FreqStep取值,确定绘制的单位为“Hz”或“kHz” else PutString24M(170,140,"kHz");l void DrawVpp(void); 绘制峰峰值unsigned char str10;/用于存储字

36、符型峰峰值float Vpp_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”5.5 DAC1) 功能介绍DAC在本次设计中完成两个功能:一、通过改变输入的数字信号,输出自选波形;二、输出压控放大器参考电压,从而改变放大器的增益。2) 核心代码/初始化#define SD

37、A5571 BIT6 / DAC5571数据#define SCK5571 BIT7 / DAC5571时钟#define SCL_H P9OUT |= SCK5571#define SCL_L P9OUT &=SCK5571#define SDA_H P9OUT |= SDA5571#define SDA_L P9OUT &=SDA5571/完成IIC的起始条件操作void start(void) SCL_H;/时钟信号置高 SDA_H;/数据线置高 delay();/延迟 SDA_L;/数据线置低 delay();/延迟 SCL_L;/时钟信号置低 delay();/延迟/

38、核心功能实现if(Mode=3)/当自选波形模式while(ReadKey() = 0xFF)/当没有键盘按下时 Write_DAC(voltage+);/递增输出锯齿波5.6 键盘1) 功能介绍/P6引脚定义#defineKPR0 BIT0 / 键盘0行#defineKPR1 BIT1 / 键盘1行#defineKPR2 BIT2 / 键盘2行#defineKPR3 BIT3 / 键盘3行#define KPC0 BIT4 / 键盘0列#defineKPC1 BIT5 / 键盘1列#defineKPC2 BIT6 / 键盘2列#defineKPC3 BIT7 / 键盘3列由键盘接口图以及引脚

39、定义可以看出,P6端口的8条I/O端口线被分成4条行线P6.0P6.3和4条列线P6.4P6.7。按键的两端分别接在行线和列线上,行线与列线的每个交界处均有一个按键。如果有按键被按下,则与之相连的行线与列线被接通。要想检测是否有按键被按下,先使4条行线输出低电平,读列线P6.4P6.7。因为所有列线都经上拉电阻接到VCC,如果没有按键被按下,列线读进来的都是高电平1;如果有按键被按下,则列线读进来的电平应与行线输出的一致,为低电平0.据此可以判断是否有按键按下。对于行列扫描式键盘,常采用扫描的办法识别键码。如果4条行线没有输出低电平,那么就可以根据读列线的值来判断这一行是否有键被按下了。2)

40、核心代码#define KEY_PORT_IN P6IN #define KEY_PORT_OUT P6OUT #define KEY_PORT_DIR P6DIR #define KEY_PORT_REN P6REN#define ROW_IN_COL_OUT P6DIR = KPC0+KPC1+KPC2+KPC3 ; P6OUT =(KPC0+KPC1+KPC2+KPC3) ; _delay_cycles(20) / 键盘列输出行输入 #define CLO_IN_ROW_OUT P6DIR = KPR0+KPR1+KPR2+KPR3 ; P6OUT =(KPR0+KPR1+KPR2+KP

41、R3) ; _delay_cycles(20) / 键盘行输出列输入unsigned char ReadKey(void) unsigned char column,row,key;/分别表示行、列线读取值、返回键值 unsigned char Key;/储存键值对应的8位键盘扫描值,对应关系见下图 ROW_IN_COL_OUT;/键盘列输出行输入 row = KEY_PORT_IN&(KPR0+KPR1+KPR2+KPR3);/读取P6端口并屏蔽高4位输出值即行线值 if(row!=(KPR0+KPR1+KPR2+KPR3)/若行线没有输出低电平,说明有按键按下 CLO_IN_ROW

42、_OUT ;/键盘行输出列输入 column = KEY_PORT_IN&(KPC0+KPC1+KPC2+KPC3);/读取P6并屏蔽低4位即列线值 ROW_IN_COL_OUT;/键盘列输出行输入 Key = row + column;/行列线值相加,则高低4位的不同取值可以表示不同的键值 _NOP(); switch(Key)/通过判断键值做出对应的响应 case 0xE7: key=1; break; case 0xD7: key=2; break; /其他键值省略 default: key=0xFF; else key=0xFF;/若没有键盘输出,则返回键值0xFF KEY_P

43、ORT_DIR=0xFF;/键盘8个IO口均设置为输出 KEY_PORT_OUT=0x00;/输出低电平 return key;/返回逻辑键值下图是8位键值与逻辑值对应关系:3) 各按键功能代码l 按键1:模式选择按键后Mode值循环模4递增,在方波、三角波、正弦波、自选波形中单向切换。通过改变全局变量Mode值,可以传递给LCD模块输出正确的波形模式显示在屏幕上,并通过调用DDS模块的函数输出正确的控制字给DDS从而输出正确波形。Mode = (Mode+1)%4;/0-方波,1-三角波,2-正弦波,3-自选波形DrawMode();/绘制修改后的波形模式dds();/dds输出修改后的波形

44、l 按键2:频率档位选择按键后FreqStep值循环模4递增,在100Hz、1kHz、10kHz、100kHz四个档位中单向切换,通过改变全局变量FreqStep值,确定频率档位的选择。在切换档位后初始化频率系数FreqCoeff=50,即将频率值置为该档位下的中间值,方便使用。同按键“1”,将改变后的档位值输出在LCD上,并调用DDS函数输出正确波形。FreqStep = (FreqStep+1)%4;/0-100Hz,1-1kHz,2-10kHz,3-100kHz DrawFreqStep();/绘制频率档位值FreqCoeff = 50;/初始化系数为50,便于调试和使用DrawFreq

45、();/绘制修改后的频率值dds();/dds输出修改后的波形l 按键3:扫频按键可使扫频使能信号在0,1中切换,通过判断是否为可以扫频的三种基本波形,改变扫频使能信号,在主函数中可以确定当前是否处于扫频状态,实现扫频功能。在LCD显示的过程中,需要注意通过清屏消除“扫频”字样。/判断是否处于三种基本波形模式下,若不是则无扫频功能if(Mode=0|Mode=1|Mode=2) if (FreqScanEn = 0) /若扫频使能为低FreqScanEn = 1;/通过按键,修改使能信号为高PutString24M(160,105,"-扫频");/绘制扫频模式至TFTels

46、e/若扫频使能为高FreqScanEn = 0;/通过按键,修改使能信号为低/绘制底色,消除TFT显示的扫频字样DrawRectFill(160,105,60,30,WINDOW_BK_COLOR);l 按键4、7:频率增减按键可使频率系数FreqCoeff在1-99中递增或递减,该数值表示在当前频率档位中,频率步进的系数,由于频率步进设计为档位的0.1倍,故当前频率值的计算公式为:频率值 = FreqCoeff *0.1*FreqStep由于FreqStep、FreqCoeff两个全局变量可以唯一确定当前频率值,输出给LCD模块可以在屏幕上可以正确显示,并输出正确控制字给DDS模块。/当系数

47、小于99时,按键递增 /当系数大于1时,按键递减if( FreqCoeff < 99) FreqCoeff+; if( FreqCoeff > 1) FreqCoeff-;DrawFreq(); DrawFreq();dds(); dds();l 按键5、8:幅度细调由于峰峰值的改变是通过开发板自带的DAC输出控制电压来改变压控放大器的放大倍数来实现,而8位DAC输出电压值由输入8位数字值(voltage)控制,当按下“5”、“8”按键后,voltage以1为步进增减,即可以最小分辨率调节输出波形的峰峰值。voltage+; voltage-;Write_DAC(voltage);

48、 Write_DAC(voltage);l 按键6、9:幅度粗调为了实现峰峰值以0.1V步进增减,设计步进按钮。按键后全局变量Vpp相应变化,输出给LCD显示。读取v151数组中相应输出值,使DAC输出正确的压控电压,达到幅度控制的目的。if(Vpp < 50) Vpp+; if(Vpp>0)Vpp-;DrawVpp(); DrawVpp();voltage=v1Vpp; voltage=v1Vpp;Draw(voltage); Draw(voltage);Write_DAC(voltage); Write_DAC(voltage);实际联调中,由于DDS方波输出电压与三角波、正弦

49、波输出电压值有很大的区别,可以在读取数组值时,判断当前模式,进行对应的修改。修改后代码:If(Mode = 0)/方波时Voltage = v2Vpp;else if(Mode = 1 |Mode = 2)/三角波、正弦波时Voltage=v1Vpp6 系统测试与结果6.1 总体方案选择6.1.1 原方案我们原定由MSP430F149单片机作为波形发生器的主控制器。因为在种类和数量繁多的单片机中,TI的MSP430系列颇具特色,并具有良好的性能。我们原计划采用MSP430F149控制DDS输出高频率的正弦波、方波和三角波。输出的数字波形通过DAC0832转换为模拟波形。模拟波形经过滤波、放大、

50、稳幅电路后,就可以输出到示波器观察。输入采用4×4键盘中断控制。这样可以最大限度的避免占用CPU机时。输出采用LED循环显示频率和幅度,以及用字符表示当前波形。下图是原方案系统框图:6.1.2 遇到的障碍:但是随着工作的深入,我们遇到了很多障碍和预想不到的困难。比如LED显示的效果并不好,特别是和LCD比较起来明显很粗糙。所以我们决定改用LCD显示。然而这样又带来了新的问题,149不能直接相连LCD去控制,它需要很复杂的外围驱动电路和软件控制。我们在经过很长时间的尝试之后还是没能成功。再加上其他很多编程时遇到的细节问题,经过讨论决定使用430开发板。6.1.3 改进方案:考虑到上面的

51、问题,我们购买了一块开发板,它使用的是比430F149更先进的核心芯片430F5438。工作原理是430产生DDS的控制字,让后者输出正弦波、三角波或是方波。波形经过放大稳幅后输出。其实也可以直接通过查表法让430产生各种波形,但430系列是以其低功耗见长,数MHz的主频虽然并不低,但还不足以产生百kHz以上的正弦波形。为了达到尽可能高的输出频率,我们这样做,而是仅仅把430用作控制用途。为了控制幅度,我们决定使用一个压控调幅器件。用430输出振幅相应的数字信号通过DA转换为模拟信号,输入到VCA中控制需要波形的幅度。6.2 硬件电路测试6.2.1 VCA810压控放大器首先,在连接VCA810压控放大器的时候,按照Datasheet上面的电路连接,如下图:由于参考电压Vc应为负,调试阶段Vc的输入我用的是-5V的电压分压。可是波形几乎没有输出,而且没有任何改变放大倍数的迹象。这块芯片的电路调了一整天,后来发现Rc不能连,因为会和我设计的分压器并联,使得电压非常低,去掉之后波形的冲击消失。但是仍然不可调放大倍数,后来将RL由并联改成串联,串上一个100欧的电阻,结果输出波形正常。Datasheet上的VCA810可调放大倍数范围是1/100100,由于实际上芯片只有正负5V的电压,而输入的正弦波和三角波的幅度

温馨提示

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

评论

0/150

提交评论