用CPLD和单片机设计任意波形发生器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机频率计的设计
说明书
开封大学参赛成员:郭东卫王超参赛指导教师:杨志帮侯静
基于单片机频率计的设计
指导老师-杨志帮、侯静
核心器件: AT89C52 74HC163
在电子工程设计与测试中,常常需要一些复杂的、具有特殊要求的信号,要求其波形可任意产生,频率方便可调。通常的信号产生器难以满足要求,市场上出售的任意信号产生器价格昂贵。结合实际需要,我们设计了一种任意波形发生器。电路设计中充分利用MATLAB的仿真功能,将希望得到的波形信号在MATLAB中完成信号的产生、抽样和模数转换,并将得到的数字波形数据存放在数据存储器中,通过单片机和CPLD控制,将波形数据读出,送入后向通道进行A/D转换和放大处理后得到所需的模拟信号波形。利用上述方法设计的任意波形发生器,信号产生灵活方便、功能扩展灵活、信号参数可调,实现了硬件电路的软件化设计。具有电路结构简单、实用性强、成本低廉等优点。
一、系统框图
任意波形发生器的设计思想,是利用MATLAB的强大仿真功能,方便、快捷的生成给定频率、周期、脉宽的任意波形数据;并将数据预存在数据存储器中。在单片机控制下,利用CPLD电路产生地址读出数据,送入D/A转换电路,得到所需的任意波形信号。系统结构框图如图1;图中分频电路和地址发生器由CPLD实现。
图1 系统框图
二、电路设计及实现
单片机控制电路
单片机采用AT89C52芯片,通过软件编程产生所要求的控制信号。主要的控制参数包括:信号周期、脉宽;分频电路的开始信号、地址发生器的复位信号;E2PROM的选通信号;D/A转换电路的选通信号。在具体电路中,端口P1.0控制分频电路的启动、P1.1控制地址发生器的清零,P2.0控制28C256和AD7545的选通信号。单片机工作在定时器0方式,软件设计利用C语言实现。流程图如图2所示。
图2 软件流程图
三、波形数据生成
MATLAB作为一款优秀的数学工具软件,具有强大的运算功能;可以方便的产生各种信号波形,在软件中实现波形信号的产生、抽样和模数转换。设计的任意波形发生器,数据存储器选用28C256芯片,信号波形通过MATLAB仿真产生;得到的波形数据存放在数据存储器28C256中。具体设计中,我们要求产生周期为200ms,脉宽为5ms的单/调频混合信号,其中单频信号的脉宽为4ms,频率为30KHz;调频信号的脉宽为1ms,频率为30KHz_35KHz。在MATLAB中设定抽样率为500KHz,得到了2500个波形数据。这些混合波形数据在烧录入数据存储器的过程中,由于波形数据较多,直接用手工录入数据存储器中不仅费时且容易出错。为克服这一弊端,通过MATLAB编程的方法将产生的波形数据按照HEX文件的INTEL格式存放,然后将这些波形数据整批次烧录入数据存储器中。采用上述方法,波形数据生成简单,快捷;可根据需要在软件程序中方便地修改信号参数;无需改动硬件电路即可实现信号参数的功能扩展。
四、CPLD逻辑设计
分频电路采用两片74HC163实现。通过分频电路,将12MHz的晶振标准频率分频后,得到500KHz的抽样频率,作为地址发生器的时钟。分频电路的工作由单片机控制。地址发生器电路由3片74HC163组成,时钟频率为500KHz,有分频电路提供;和预存的波形数据抽样频率相一致,以实现数据的无失真读出。
电路设计中,采用ALTRA公司的EPM7128AETC100-10芯片,在MAX+PLUSⅡ开发环境中完成分频缏泛偷刂贩⑸鞯缏返纳杓啤;贑PLD的电路设计,可以省去大部分的中小规模集成电路和分离元件;使得电路具有集成度高、工作速度快、编程方便、价格低廉的显著优点。通过CPLD和数据预生成的信号实现方法,无需改变硬件电路,即可实现信号参数的任意调整;同时外围电路十分简单,为工程调试和应用带来了方便。
五、D/A转换电路
D/A转换电路的实现如图3所示。电路中,AD7545将波形数据转换为模拟信号;LF353进行信号滤波和整形。
根据项目要求,要实现输出波形程序设计主要解决按键控制输出三角波、方波、锯齿波和正弦波的问题。
按键控制:根据设计要求和按键控制输出波形的变化,程序应设计不断查询检测按键的状态,以便输出对应的波形。对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块设置ID号进行标识,这样每按一次键,ID的值就不一样。因此,我们不同的波形用flag标识:当flag=0时,输出三角波;当flag=1时,输出方波;当flag=2时,输出锯齿波;当flag=3时,输出正弦波。我们规定,每次按下K键,分别给出不同的flag值就能实现任务。
输出模拟电压:由于DAC0832和单片机AT89C51采用直通方式,因此只要往数据输入端送数字量,从后面的运放输出端就可得到模拟电压。输出的电压根据公式计算到。由此在需要输出某个电压值时,求出对应的数字值,通过P2口输出,就可以得到所需的模拟电压。为了方便编程我们将DAC0832的输出封装为一个子函数,用形参表示待输出的数值。程序中用4个子函数分别表示产生不同的波形,程序设计的流程图如图所示
图简易波形发生器程序流程图
根据程序流程图,写出单片机C语言程序清单:
#include
#define uchar unsigned char
#define uint unsigned int
#define DAC0832 P2 // 将DAC0832定义为P2口
#define ALL 65536 // 将ALL定义为65536
#define Fosc 12000000 // 频率为12MHz
uchar TH_0,TL_0,flag1,flag=0;
uint FREQ=100,num;
float temp;
uchar code sin_num[]={0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,4,4,4,
5,5,6,6,7,7,8,8,9,9,10,10,11,12,12,13,14,15,15,16,17,18,18,19,20,
21,22,23,24,25,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,
44,45,46,47,49,50,51,52,54,55,56,57,59,60,61,63,64,66,67,68,70,71,
73,74,75,77,78,80,81,83,84,86,87,89,90,92,93,95,96,98,99,101,102,
104,106,107,109,110,112,113,115,116,118,120,121,123,124,126,128,
129,131,132,134,135,137,139,140,142,143,145,146,148,149,151,153,
154,156,157,159,160,162,163,165,166,168,169,171,172,174,175,177,
178,180,181,182,184,185,187,188,189,191,192,194,195,196,198,199,