2信号发生器设计
1 绪论
1.1 信号发生器概述
目前,市场上的信号发生器多种多样,一般按频带分为以下几种:
超高频:频率范围1MHz以上,可达几十兆赫兹。
高频:几百KHZ到几MHZ。
低频:频率范围为几十HZ到几百KHZ。
超低频:频率范围为零点几赫兹到几百赫兹。
超高频信号发生器,产生波形一般用LC振荡电路。
高频、低频和超低频信号发生器,大多使用文氏桥振荡电路,即RC振荡电路,通过改变电容和电阻值,改变频率。
用以上原理设计的信号发生器,其输出波形一般只有两种,即正弦波和脉冲波,其零点不可调,而且价格也比较贵,一般在几百元左右。在实际应用中,超低频波和高频波一般是不用的,一般用中频,即几十HZ到几十KHZ。用单片机89S52,加上一片DAC0808,就可以做成一个简单的信号发生器,其频率受单片机运行的程序的控制。我们可以把产生各种波形的程序,写在ROM中,装入本机,按用户的选择,运行不同的程序,产生不同的波形。再在DAC0808输出端加上一些电压变换电路,就完成了一个频率、幅值均可调的多功能信号发生器的设计。这样的机器体积小,价格便宜,耗电少,频率适中,便于携带。
1.2 本论文主要研究的内容
本设计采用89S52及其外围扩展系统,软件方面主要是应用C语言设计程序。系统以89S52单片机为核心,配置相应的外设及接口电路,用C语言开发,组成一个多功能信号发生系统。该系统的软件可运行于Windows XP环境下,硬件电路设计具有典型性。同时,本系统中任何一部分电路模块均可移植于实用开发系统的设计中,电路设计具有实用性。
本设计将完成以下几个方面的工作:
(1)选芯片,尽量满足一般工业控制要求、以增强其实用性。
(2)原理图设计在保证正确的前提下,尽量采用典型的电路设计。
(3)印制板设计既要精巧,又要便于摆放及测试。
(4)固化于单片机芯片中的软件采用模块设计,层次清楚,具有上电复位及初始化功能,具有很好的软件开发框架。
(5)掌握单片机仿真软件Proteus6.7的使用。
为此,论文包括以下内容:
Ⅰ绪论。主要介绍单片机发展概况和信号发生器的概述,为以后几章的介绍奠定基础。
Ⅱ系统总体方案设计。本章主要考虑系统性能、功能和器件选择。包括两个主要内容:系统分析和系统总体方案设计。其中系统分析包括问题定义、可行性研究和需求分析。问题定义中对设计的课题进行定义,详述设计环境。可行性分析中分别从经济可行性、元器件具备程度和对可能遇到的问题的可解决性几个方面论证设计是否可行。需求分析对系统功能要求、性能要求和运行环境要求说明。系统总体方案设计包括算法设计、系统总体框图设计以及系统中使用的主要芯片。
Ⅲ系统的硬件设计。本章完成系统的硬件总体设计,详细说明了设计思路。Ⅳ系统软件设计实现。本章是系统的具体实现,对系统按功能模块进行介绍。
Ⅴ系统测试报告。分别对系统的功能测试、调试过程和系统的使用方法进行介绍。
Ⅵ总结与展望未来。
2 系统设计方案
2.1 系统分析
2.1.1 问题定义
基于单片机的信号发生系统是一个实际应用系统,可为相关实验及实际应用提供支持。本论文包括硬件系统的详细设计及C语言在基本控制中的应用。此系统具有的功能如下:
硬件部分
(1)8位七段数码动态扫描显示;
(2)2×4的8位矩阵键盘;
(3)时钟电路与复位电路;
(4)具有8位精度的D/A转换功能;
(5)波形产生功能;
软件部分
(1)系统复位初始化;
(2)键盘扫描与处理;
(3)按键服务程序;
(4)定时器0中断服务程序;
(5)正弦波发生程序;
(6)三角波发生程序;
(7)方波发生程序;
(8)锯齿波发生程序。
2.2 系统需求分析
2.2.1 系统功能要求
系统具有D/A转换功能,信号幅度放大功能,8位七段数码显示功能,上电自动复位功能,2×4键盘输入接口。
2.2.2 系统性能要求
(1)系统的D/A转换功能具有8位精度;
(2)动态扫描七段数码显示器;
(3)89S52单片机时钟信号为12MHZ;
(4)系统上电自动复位;
(5)系统具有8位行列扫描键盘。
2.3 总体方案设计
2.3.1 算法设计
本设计涉及的算法较少,将在第四章软件设计中介绍。
2.3.2系统总体结构框图设计
图2-1 主系统结构框图
3 硬件设计
3.1 总体硬件设计
(1)程序存贮器
89S52内部自带8K的ROM,512B的RAM,所以不需要对其扩展存储器。
(2)键盘接口
系统采用矩阵键盘,用I/O线组成行、列结构,按键设置在行列的交点上,2×4的行列结构可构成8个键的键盘,采用行列扫描法。
(3)数码管驱动
本设计实现了89S52的I/O口对2×4键盘和8位数码管显示的控制。为增加对数码管显示器的驱动能力及稳定性,在它与89S52之间设置了提高驱动能力的74LS373。
(4)D/A转换
本设计D/A转换部分采用DAC0808芯片,由于它不带锁存器,故在使用时必须加74LS373进行数据锁存。
(5)信号变换部分
对信号的变换部分采用四运放集成芯片LM324,它采用14脚双列直插塑料封装,它的内部包含四组形式完全相同的运算放大器。
(6)可靠性方面
在使用应用系统时,可能会受到多种干扰的侵袭,直接影响到系统的可靠性,因此,本系统适当加入去耦电容,以减少干扰,确保精度。
3.2系统模块设计
3.2.1显示器接口设计
本机显示采用软件译码动态显示,系统显示电路如图3-1所示。采用软件译码动态显示的理由如下:1)如果用静态显示,单片机的接口资源肯定不够用,那么还要进行接口的扩展,增加了系统的复杂度;2)如果要制成印刷线路板,得占相
当大一块面积;3)另外,采用动态显示,可以明显的降低功耗,因为每一时刻只有一个LED发光,其功耗为静态显示的1/8。一个LED最大电流为120mA,如用静态显示,8个LED就耗电流960mA综上分析,采用动态显示才是最经济的方案。
在显示的时候,只要把显示的字码输送到P2口,再经过74LS373进行数据锁存,P3口作为位选控制信号。由于采用的是共阴极数码管,当需要显示哪一位的时候,只要在相应的位选控制信号输出低电平就行。例如,要在第一个数码管显示P,那么在P2口就要输出73H字段码,同时P3口输出FEH位选码。
图3-1 系统显示电路
3.2.2 复位与时钟电路设计
3.2.2.1 复位电路设计
单片机的复位是靠外电路实现的,在时钟电路工作后,只要在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平,单片机便实现初始化状态复位。为了保证应用系统可靠地复位,通常是RST引脚保持10ms以上的高电平。复位电路连接如图3-2所示。此电路仅用一个电容及一个电阻。系统上电时,在RC电路充电过程中,由于电容两端电压不能跳变,故使RESET端电平呈高电位,
系统复位。经过一段时间,电容充电,使RESET端呈低电位,复位结束[2]。
图3-2 复位电路
3.2.2.2 时钟电路设计
8XX51系列单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。
在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振),就构成了内部振荡方式。由于单片机内部有一个高增益反向放大器,当外接晶振后,就构成了自激振荡器,并产生振荡时钟脉冲。晶振通常选用6MHZ、12MHZ或24MHZ。内部振荡方式如图3-3所示。图中电容C1、C2起稳定振荡频率、快速起振的作用。电容值一般为5~30pF。内部振荡方式所得时钟信号比较稳定,实用电路中使用较多。
外部振荡方式是把已有的时钟信号引入单片机内。这种方式适宜用来使单片机的时钟与外部信号保持一致。外部振荡方式电路如图3-4所示。
对HMOS的单片机(8031,8031AH等),外部时钟信号由XTAL2引入;对于CHMOS 的单片机(8XCXX),外部时钟信号由XTAL1引入。
图3-3 内部振荡图3-4外部振荡
3.2.3 键盘接口设计
3-5 系统键盘实现
工作原理如下:
1.检测键盘上是否有键按下:将行线送入低电平,列线送入高电平。读入P1口的状态来判别。其具体过程如下:P1口输出0FH,即所有行线置成高电平,所有列线置成低电平,然后将P1口状态读入与0FH比较。如果有键按下,总会有一根行线电平被拉至低电平,从而使行输入状态不全为1。
2.识别键盘中哪一个键按下:确认有键按下后,保存行扫描时有键按下时的状态X 。P1口输出F0H,进行列扫描,保存列扫描状态Y,取出键值Z=X|Y.例如第一行第一列有键按下,那么行扫描读入的状态为00001110,列扫描读入的状态为11100000,最后键值Z=11101110=EEH,然后转去执行相应的服务程序。
3.2.4 D/A转换设计
一、D/A转换器概述
D/A转换器的性能指标[3]:
1.分辨率:输出模拟电压应能区分0~2n-1共2n个输入数字量。表示方法:
(1)用输入二进制数的位数表示;如8位。
(2) 用输出模拟电压的最小值与最大值的比值表示。指最小输出电压和最大输出电压之比。DAC0808的分辨率为1/256。
2.精度:DAC实际输出电压与理想的输出电压的偏差。 DAC0808的最大满刻度偏差为+1LSB 。
3.线性度:DAC实际传输特性曲线与理想的传输特性曲线的偏差。 DAC0808的最大误差为+0.19% 。
4.温度灵敏度:在输入不变的情况下,输出模拟电压随温度变化产生的变化量。一般用满刻度输出条件下温度每升高1℃,输出电压变化的百分数作为温度系
数。
5.转换速度:用完成一次转换所需的时间——建立时间Tset 来衡量。建立时间:输入信号从开始变化到输出电压进入与稳态值相差1/2LSB 范围以内的时间。输入信号由全0变为全1所需时间最长。当外接运放时,转换时间还应加上运放的上升(下降)时间。
()()R
O s TR S V t T max max +
= (3—1)
式中()max TR T 为转换时间 ,s t 为建立时间,()max o V 输出最大电压值,R S 为运放输出转换速率。
二、D/A 转换器的分类
D/A 转换器的品种繁多、性能各异。按输入数字量的位数分:8位、10位、12位和16位等;按输入的数码分:二进制方式和BCD 码方式;按传送数字量的方式分:并行方式和串行方式;按输出形式分:电流输出型和电压输出型,电压输出型又有单极性和双极性;按与单片机的接口分:带输入锁存的和不带输入锁存的。 三、D/A 转换器的原理
以倒T 形电阻网络D/A 转换器为例,介绍D/A 转换器的原理。倒T 形电阻网络D/A 转换器结构如图3-6所示。
图3-6 倒T 形电阻网络D/A 转换器
图中S 0~S 3为模拟开关,由输入数码Di 控制,当Di =1时,Si 接运算放大器反相输入端(虚地),电流Ii 流入求和电路;当Di =0时,Si 将电阻2R 接地。所以,无论Si 处于何种位置,与Si 相连的2R 电阻均接“地”(地或虚地)。流过各开关
支路(从右到左)的电流分别为 I /2、I /4、I /8、I /16。 总电流:
()
∑=∑
??=??? ??+++=3
413223140
222222i i i
REF
REF D
R
V D D D D R V i (3—2)
输出电压:()∑=∑??-=-=3
4
22
i i
i
REF
f f o D V R R R i v (3—3)
将输入数字量扩展到n 位,则有:(
)??
??????-=-=∑-=∑1
22n i i
i n REF f f o D V R R R i v
可简写为:n n o B K v -= (3—4)
其中n REF
f n V R R K 2?=,n B =()
∑-=?10
2n i i i D 四、DAC0808简介
DAC0808是八位电流输出型D/A 转换器件,由4脚输出转换电流,其简化电路图及引脚结构如图3-7所示。VREF 为参考电源,VEE 负电压供电;D0是高数据位(MSB ),D7才是地数据位(LSB )。DAC0808的电源极性:VCC=+5V ,VEE=-15V ,VREF=+15V 。D0~D7是数据输入端,I 0是电流输出端,COMP 是接电容进行补偿。在单片机应用系统中通常需要的是电压信号,电流信号与电压信号之间的转换可由运算放大器实现。DAC0808不带锁存器,所以在使用时必须加一个74LS373进行数据锁存。
NC D 4
D 5
D D 012D 3
CC -V EE
I O GND REF REF
图3-7 DAC0808简化电路框图和管脚排列
根据DAC0808的特性设计出本系统的D/A 转换电路如图3-8所示。
图3-8 系统D/A 实现
工作原理:本系统由V REF 提供参考电压,相应参考电流为I=V REF /R1。电容C4提供补偿,OUT 输出电流,经过LM324运算放大器转换成电压。 所以输出电压:
V V REF 12= 1R R f ==5K
i i i i
i i REF f o D D R V R v 2212227
087
1
8?=?=
∑∑== (3—5)
4 软件设计
4.1 软件总体设计
应用系统中的应用软件是根据系统功能要求而设计的,能可靠地实现系统的各种功能。一个优秀的应用系统的应具有下列特点:
(1)根据软件功能要求,将系统软件分成若干个独立的部分。设计出软件的总体结构,使其结构清晰、流程合理。
(2)要树立结构化程序设计风格,各功能程序模块化、子程序化。既便于调试、链接,又便于移植、修改。
(3)建立正确的数学模型。即根据功能要求,描述各个输入和输出变量之间的数学关系,它是关系到系统好坏的重要因素。
(4)为提高软件设计的总体效率,以简明、直观法对任务进行描述,在编写应用软件之前,应绘制出程序流程图。
(5)要合理分配系统资源,包括ROM、RAM、定时数器、中断资源等。
(6)注意在程序的有关位置处写上功能注释,提高程序的可读性。
(7)加强软件抗干扰设计,它是提高系统应用可靠性的有利措施。
本系统的软件包括以下几个程序模块:
(1)初始化程序;
(2)显示程序;
(3)键盘扫描程序与处理程序;
(4)定时器0服务程序;
(5)正弦波发生程序及其服务程序;
(6)三角波发生程序;
(7)方波发生程序;
(8)锯齿波发生程序。
4.2 软件功能设计
4.2.1 系统初始化程序设计
复位程序完成如下工作:
1.显示2秒的PPP.HELLO初始界面;
2.初始频率设置为983HZ;
3.将频率值转换成定时器的初值;
4.置定时器0工作于方式1,即16位定时器方式,送入
定时器0定时初值,启动定时器0工作;
5.显示初始频率和产生波形的类型;
6.转键盘扫描程序。
系统的初始化流程如图4-1所示。
图4-1 初始化流程图
4.2.2 键盘扫描及处理程序设计
这部分程序包括如下几部分:
1.键盘扫描程序judge;
2. 先对P1置数,行扫描;
3. 判断是否有键按下;
4. 延时10ms,软件去干扰;
5. 确认按键按下X = P1,保存行扫描时有键按下时状态;
6. 列扫描;
7. 保存列扫描时有键按下时状态;
8. 取出键值;
9. 执行相应键值程序。
下面分别介绍其功能及设计思想。
1.键盘扫描程序
单片机系统中,键盘扫描是CPU工作的一个主要内容之一。CPU忙于各项工作任务时,如何兼顾键盘扫描。既保证不失时机的响应键盘操作,又不过多占用CPU 时间。因此,要根据应用系统中的CPU的忙、闲情况,选择好键盘的工作方式。
在单片机应用系统设计中,为了节省硬件,通常采用非编码键盘,在这种键盘结构中,单片机对它的控制有三种方式:程序控制扫描方式;定时扫描工作方式;中断工作方式[6]。
(1)程序控制扫描方式
这种方式就是只有当单片机空闲时,才调用键盘扫描子程序,响应键盘的输入请求。
(2)定时扫描方式
这种方式就是每隔一定的时间对键盘扫描一次。通常是利用单片机内部定时器产生10ms的定时中断,CPU响应定时器溢出中断请求,对键盘进行扫描,以响应键盘输入请求。
(3)中断工作方式
为进一步提高CPU效率,可以采用中断扫描工作方式。即在键盘有健按下时,才执行键盘扫描,执行该键功能程序。
本系统采用程序控制扫描工作方式。在该设计中的键盘的行列线连接于89S52的P1口上。键盘扫描程序自复位后就开始工作,时刻监视键盘,有无键按下。在监视键盘过程中,允许定时器T0中断,即同时动态显示数据和输出波形。一旦有键按下,先延时10ms,去除键的抖动,然后关中断,不允许定时器T0发生中断。其框图如图4-2所示:
图4-2 键盘扫描
对应键盘如图4-3所示
图4-3 键盘实现
键盘采用矩阵式键盘(如图4-3所示),由软件产生相应编码,再根据相应编码调用相应的子程序。编码产生原理:P1口低四位表示行,高四位表示列。键盘所在的行和所在的列用0表示,其它的行和列用1表示。如第一行第一列GW编码值
为(11101110)
2=0xee,第二行第三列ZKBJ编码值为(10111101)
2
=0xbd。
表4-1 键盘处理程序
键盘扫描源程序如下:
void judge(void)
{
unsigned char X,Y,Z;
P1 = 0xff;
P1 = 0x0f; //先对P1置数行扫描
if(P1 != 0x0f) //判断是否有键按下
{
delay10ms(); //延时,软件去干扰
if(P1 != 0x0f) //确认按键按下X = P1;
{
X = P1; //保存行扫描时有键按下时状态
P1 = 0xf0; //列扫描
Y = P1; //保存列扫描时有键按下时状态
Z = X | Y; //取出键值
switch ( Z ) //判断键值(那一个键按下)
{
case 0x7d: key1(); break;
case 0xee: key2(); break; //对键值赋值
case 0xde: key3(); break;
case 0xbe: key4(); break;
case 0x7e: key5(); break;
case 0xed: key6(); break;
case 0xdd: key7(); break;
case 0xbd: key8(); break;
}
}
}
}
4.2.3中断服务程序设计
采用定时器T0定时中断,根据不同的choice值,产生不同的波形。其中方波的占空比可以通过K变量来控制。定时器的初值可以这样计算:
f = 100000 * ww + 1000 * qw + 100 * bw + 10 * sw + gw; t = 1000000 / f;
th = -t / 256; //定时器高八位值
tl = -t % 256; //定时器低八位值
void time0_int(void) interrupt 1 //中断服务程序
{
TR0 = 0;
if(wave_choice == 1)
{
P0 = to_sin[b]; //正弦波
b ++;
}
else if( wave_choice == 2 ) //三角波
{
if(c <= 128)
{
P0 = c;
}
else
{
P0 = 255 - c;
}
c ++;
}
else if( wave_choice == 3 ) // 方波
{
k = zk * 256 / 100;
d ++;
if(d <= k)
{
P0 = 0x00;
}
else
P0 = 0xff;
}
else if(wave_choice == 4) //锯齿波
{
if(e <= 255)
{
P0 = 255 - e;
}
else
{
P0=0;
}
e++;
}
TH0 = th;
TL0 = tl;
TR0 = 1;
}
4.2.4 正弦波发生程序设计
DAC0808是8位的D/A转换器件,其工作电压是0—5V,当输入00数字量的时候,输出为0V电压;当输入80数字量的时候,输出为2.5V电压;当输入FF数字量的时候,输出为5V电压。单片机的I/O输出均为+5 V的TTL电平,因此产生的正弦波幅值为+2.5 V。将一个周期内的正弦波形等分为256份,那么第1点的角度为0°,对应的正弦值为2.5sin0°;第2点的角度为360°/256,对应的正弦值为2.5sin (360°/256 )……,如此计算下去,将这些模拟量正弦值都转换为单极
性方式下的数字量,得到一张按照点号顺序排列的正弦波波形数据表格[11]。而每次送到74LS373的八位数字量是根据查正弦波形数据表格而得到。
其实在计算正弦波形数据的时候,并不需要算出整个0—2π区间的每一个值,
而只需计算出0—
21π中的值就行,其他区间的值都可以通过对0—21
π中的值取不同的变换。比如21π—π的值可以和0—2
1
π值一一对应,而π—2π的值可以对
0—π区间的值取反得到。计算值可以用C 语言编程得到。
幅度公式为Y=2.5[1+sin(
N 64
90
)] (N=0,1,2……64) 相应的Y 值数字化后的递增量δ=255
5
≈0.0196
那么每一个点相对于起一个点的递增率为A=δ
1
2Y Y (Y2当前的点,Y1为前
一个点)
所以每一个点的数字量与递增率A 成一一对应关系。 数字量化C 程序: #include
int n ,i=0,j ,k ;
float y=0, a=3.1415926,b=0,c=2.5000,d=0; for(n=0;n<=64;n++) {
y=2.5*sin(a*n/128)+2.5; b=y ; //b ,y 为当前幅度值 d=b-c ; //d 为递增率
j=d/0.0196; //j 为数字递增率,0.0196为δ k=128+j ; //k 为数字量
printf(“%d ,%f ,%f ,%d ,%d\n ”,i ,y ,d ,j ,k);
i++; } }
表4-2 正弦波形数据表