陈红,谢勤岚
(中南民族大学实验中心,湖北武汉430074)
摘要:设计一种多功能波形发生器,以C8051F040单片机为控制器,控制波形发生器MAX038和功放实现输出正弦波、方波、三角波。该多功能波形发生器使用键盘调整波形频率,通过液晶显示屏显示频率,使用键盘选择不同的功能模式,实现外测电压的信号采集、数据存储和波形再现;可以实现USB串口传输并将接收到的信号进行波形再现。采集和由串口接收到的数据可通过I2C总线方式存入数据存储器中,也可以在单片机内部存储器中存入波形数据,再将其显示。
教育期刊网 http://www.jyqkw.com
关键词 :波形发生器;MAX038;C8051F040单片机;I2C
中图分类号:TN911-34;TP937 文献标识码:A 文章编号:1004-373X(2015)12-0110-05
收稿日期:2014-12-15
基金项目:国家自然科学基金(61178087)
0 引言
在现代电子技术的研究及应用领域中,常常需要价格便宜、简单易用、高精度且频率可调的信号源。而信号源的核心是波形发生器,因此设计实用的波形发生器是很有必要的[1]。
波形发生器可以由晶体管、运算放大器等通用器件构成,但更多的则是用专门的函数信号发生器集成电路实现。早期的波形发生器集成芯片,如L8038、BA205、XR2207/2209等,它们的功能较少、精度不高,频率上限只有300 kHz,无法产生更高频率的信号,调节方式也不够灵活,频率和占空比不能独立调节,二者互相影响[2]。目前市场上主要的波形发生芯片有美国Harris公司的ICL8038和美国MAXIM公司的MAX038。ICL8038只能产生300 kHz以下的频段波形,而且频率调节与占空比调节不能独立进行,无法满足信号源频率的高精度要求。相比而言MAX038 芯片有着ICL8038 芯片无法实现的优点。因此本设计使用高精度波形发生芯片MAX038,该芯片电路连接简单,只需很少的外部电路就可以产生频率在0.1~40 MHz的高精度、高稳定度的宽频带波形[3]。同时结合Silicon Labs公司的C8051F040单片机,使其可以满足多任务、实时性要求。
1 波形发生器总体设计
采用C8051F040单片机为核心,设计制作可以调节频率的多功能波形信号发生器[4]。芯片MAX038产生信号的频率可以通过调整电流和外接电容的大小来控制,因此本设计主要采用控制电流的方法来控制MAX038所产生的频率。该信号发生器能同时产生3路输出可调的正弦波、方波和三角波,并且占空比可以连续调节。
系统可以检测外部电路模拟信号,通过一个电压跟随器对检测的信号进行缓冲和隔离后,再经过单片机C8051F040 内集成的A/D 将信号转换为数字信号并存入AT24C02中。当需要输出时再通过D/A转换,转换成模拟信号,由D/A0 端口输出,经MAX038 芯片产生波形,并由液晶显示器1602 显示其频率。也可以通过USB 串口接受从电脑中下载的数据,并存入AT24C02中,同样可以再通过D/A 转换,转换成模拟信号,由D/A0端口输出,经MAX038产生波形,通过液晶显示器显示频率[5]。系统可以通过4×4键盘输入频率值,从而达到直接控制MAX038产生波形的目的,并能够用1602液晶显示器显示波形的频率。系统还可以在单片机中存入波形信号,然后通过功率放大器,直接产生波形。波形发生器框图如图1所示。
2 波形发生器硬件设计
2.1 波形发生模块
将C8051F040单片机的D/A0端口通过一个电阻直接与芯片MAX038的IN 管脚相连,通过控制D/A0端口的电压值的变化来控制IN 管脚的电流产生变化,从而达到控制波形频率的目的。本信号发生器通过3 路MAX038芯片能同时产生3路输出可调的正弦波、方波、三角波波形,输出的波形稳定性好、精度高,占空比可以连续调节。信号输出部分再采用低损耗电流反馈型宽带运放MAX477作电压放大,很好地解决了带宽和带负载能力的要求。
MAX038所产生的波形的频率是由COSC引脚的电容量和IN引脚的电流所决定的。假设C8051F040单片机的D/A0端口的输出电压为VIN,D/A0端口与IN管脚相连的电阻大小为RIN,COSC 引脚所接的电容的大小为CF,则MAX038所产生的波形的频率(单位:MHz)为:
当在FADJ引脚施加一个±2.4 V 范围的电压时,可使输出频率有±70%的变化,此时可以实现对频率进行精确的调整[4]。
MAX038所产生的波形的占空比是由DADJ引脚的电压变化来控制的,当DADJ引脚的电压在±2.4 V范围内变化时,输出波形的占空比将在15%~85%之间变化。
MAX038 产生的正弦波、方波或三角波,具体的输出波形由地址A0和A1的输入数据进行设置,如表2所示(其中X表示无关)。波形发生器能同时3路输出3种波形,所以将3路MAX038的输出波形的选择地址分别设置成为表1所示的3种固定状态。
图2为MAX038的基本电路连接(此图中A0和A1 选择为输出矩形波)。
2.2 功放模块
波形发生器对输出波形具有一定的功率要求,因此要对MAX038 的输出信号进行功率放大。MAX477 是MAXIM 公司开发的一款低噪声、低微分增益和阶段误差、高转换速率、高精度、高输出电流的高频运算放大器,其-3 dB 带宽可达到300 MHz,最小输出电流为100 mA。因此选用MAX477 对输出信号进行功率放大。图3为功放模块的原理图,通过调节反馈电阻值可以改变输出电压的放大倍数,其中电压最大可放大10 倍左右,整个系统的输出功率可达到数瓦。
2.3 USB接口模块
采用CH372 芯片来接收由串口传来的数据。CH372 是一个USB 总线的通用设备接口芯片,遵守USB1.1 协议。在本地端,CH372 具有8 位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机、DSP等控制器的系统总线上。
2.4 数据存储
数据存储主要用于存储外测电压的信号数据以及从USB 串口接收到的数据,采用的存储芯片为AT24C02。AT24C02的特点是支持I2C总线数据传送协议,相应的存储器电路如图4所示。采用由主器件控制传送数据的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。
2.5 键盘模块
为了减少I/O口的占用,波形发生器的键盘采用矩阵式键盘。图5为键盘原理图。
2.6 液晶显示模块
波形发生器采用1602液晶显示屏。1602液晶显示屏具有外接电路简单,操作方便等特点,能够同时显示16×2,即32 个字符。1602 液晶显示器具体电路如图6所示。
3 软件设计
3.1 软件总设计与总流程图
系统采用C8051F040 单片机。C8051F040 单片机是完全集成的混合信号片上系统型MCU,具有64 个数字I/O 引脚,片内集成了一个CAN 2.0B 控制器,并集成有ADC 和DAC。其中ADC 为真正12 位、100 KSPS 的ADC,并带有PGA 和8 通道模拟多路开关;DAC 有两组,为12 位DAC,且具有可编程数据更新方式[6]。程序采用C 语言编写,操作C8051F040 对外围器件进行控制[7],总流程图如图7所示。
3.2 波形发生程序
产生波形时对MAX038的控制只需控制其IN脚所输入的电流。该电流应由C8051F040 提供,而电流是一个模拟量。因此,在这里需要用到C8051F040中的D/A转换器,将数字量转换成模拟量。
C8051F040中的D/A 转换器有两组,每组D/A 转换器的输出摆幅均为0 V到VREE-1LSB,对应的输入码范围是0x000~0xFFF。由于三路MAX038 所输出的信号为同一频率,所以在此将只用到第一组D/A转换器。
输入给D/A转换器的数据来源有3种:第一种是从键盘获得的需要产生的波形的频率;第二种是单片机内部存储的波形数据;第三种是来自于外部信号存储于AT24C02存储器中的波形数据。本程序均可将其完好的转换成模拟信号。
3.3 外测电压采集程序
外测电压为模拟量,要将其进行存储与处理,应当对其进行数字化,在此就需要用到A/D 转化器。C8051F040中的12位A/D 转换器中需要转换的12 b数据存储于2 B 存储器中,2 B 存储器分别为高字节存储器ADC0H和低字节存储器ADC0L。
3.4 USB串口程序
串口程序是由写入命令与读出数据来组成的。在此将根据CH372 芯片的写入、读出时序图来编写具体程序。命令写入程序的步骤如下:
(1)将A0置1,使芯片可以写命令;
(2)将命令值写到P3端口,用空函数延时一次;
(3)将WR拉到低电平0,用空函数延时一次;
(4)将WR拉到高电平1,用空函数延时一次。
以下为命令写入程序的代码:
void wr_cmd_ch372(uchar cmd)
{
a0=1; //将A0置1
P3=cmd; //将命令值写到P3端口
nop(); //空函数
wr_ch372=0; //将WR拉到低电平0
nop();
wr_ch372=1; //将WR拉到高电平1
nop();
}
数据读出程序的步骤如下:
(1)将A0置0,使芯片可以读取数据,用空函数延时一次;
(2)将RD拉为低电平0,用空函数延时一次;
(3)读出P3端口的数据,用空函数延时一次;
(4)将RD拉为高电平0,用空函数延时一次;
(5)把接收到的数据返回给主程序。
以下为数据写入程序的代码:
int rd_dat_ch372()
{
int dat;
a0=0; //将A0置0
nop();
rd_ch372=0; //将RD拉为低电平0
nop();
dat=P3; //读出P3端口的数据
nop();
rd_ch372=1; //将RD拉为高电平0
nop();
return dat; //把接收到的数据返回给主程序
}
当选择USB串口传输模式后,应先将中断打开,以获取CH372的中断请求。进入中断时应向CH372写入GET_STATUS 命令,命令代码为0x22,作用是获取CH372的中断状态并通知CH372取消中断请求,否则单片机会不停的响应CH372 的中断命令。然后再向CH372 中写入RD_USB_DATA 命令,命令代码是0x28,作用是从当前USB中断的端点缓冲区中读取数据块并释放当前缓冲区。
3.5 存储程序
从外测电压采集到的数据以及从USB串口接收的数据都必须存储到数据存储器当中。本多功能波形发生器的数据存储器采用AT24C02 芯片,存储方法采用I2C总线方式存储。I2C总线在传送数据过程中共有3种类型信号是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。存储程序开始代码如下:
void star(t )
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
}
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。存储程序结束伪代码如下:
void stop()
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}
应答信号:接收数据的器件在接收到8 b 数据后,向发送数据的器件发出低电平脉冲,表示已收到数据。若未收到低电平脉冲,为保证程序的正常运行,将在一段时间后认定器件已经收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。应答信号的代码如下:
void respons()
{
uchar i;
scl=1;
nop();
while((sda==1)&&i<250)i++;
scl=0;
nop();
}
3.6 矩阵键盘
确定矩阵式键盘上何键被按下时采用“ 行扫描法”。在实际应用中,由于电压存在抖动现象,所以在程序设计时要设计一个消抖程序。由于抖动现象为小概率事件,所以检测两次便可消除抖动现象的影响。
在检测完后,还要有一个松手程序,用于检测是否已经松手,否则按下一次将会产生很多键盘信号。第一行键盘扫描的代码如下:
uchar keyscan()
{
P1=0x7f;
temp=P1;
i(f temp!=0x7f)
{
delay(5);
P1=0x7f;
temp=P1;
i(f temp!=0x7f)
{
temp=temp&0xf0;
switch(temp)
{
case 0x77:num=1;break;
case 0x7b:num=2;break;
case 0x7d:num=3;break;
case 0x7e:num=4;break;
}
}
P1=0x7f;
temp=P1;
while(temp!=0x7f)
{
P1=0x7f;
temp=P1;
}
}r
eturn num;
}
3.7 液晶显示程序
由于波形发生器的显示部分只用于写,故只考虑写入部分的程序。在此主要依据1602的时序图来完成对液晶显示的程序编写。液晶显示程序分为写入数据与写入命令两部分,且写入方法大体相同。写入数据的程序步骤为:
(1)将数据/命令选择端RS设置成为高电平,即为写入数据;
(2)将数据写入输入P0端口,然后延时5 ms;
(3)将使能信号置为高,再次延时5 ms;
(4)将使能信号置为低。
液晶显示程序代码为:
void write_data(uchar dat)
{
rs=1; //令选择端RS设置成为高电平
P0=dat; //将数据写入输入P0端口
delay(5);
en=1; //将使能信号置为高
delay(5);
en=0; //将使能信号置为低
}
4 结语
本系统以C8051F040 为核心,使用键盘操作,通过控制MAX038可以实现正弦波、方波、三角波的输出,并通过液晶显示屏可以显示波形的频率,可以通过键盘调整频率,操作方便简单。通过键盘选择不同的模式,还可以使用A/D转换器实现外来信号的采集,应用CH372芯片接收USB 串口传输来的信号,并将这些数据通过I2C 总线方式存储到存储芯片之中,再通过D/A 转换器可以将其波形再现。另在单片机内部储存有波形信号,同样可以通过D/A转换器直接将其波形再现。
教育期刊网 http://www.jyqkw.com
参考文献
[1] 张吉林,张晴.MAX038 及函数信号发生器[J].南昌大学学报:理科版,2000,24(4):350-355.
[2] 金斗焕,王少军.采用MAX038制作的函数信号发生器[J].电子元器件应用,2001(1):33-35.
[3] MAXIN 公司.MAX038 技术资料[EB/OL].[2011-04-17].http://wenku.baidu.com.
[4] 潘琢金.C8051F040 混合信号ISP flash 微控制器数据手册[M].深圳:新华龙电子有限公司,2004.
[5] 李朝青.单片机原理及串行外设接口技术[M].北京:北京航空航天大学出版社,2008.
[6] 王为青,程国钢.单片机Keil Cx51 应用开发技术[M].北京:人民邮电出版社,2007.
[7] 童长飞.C8051F系列单片机开发与C语言编程[M].北京:北京航空航天大学出版社,2005.