摘要:信号发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。目前使用的信号发生器大部分是函数信号发生器,且特殊波形发生器的价格昂贵。本设计使用的是以AT89C51单片机为核心的器件,制作一种可产生三角波、方波、正弦波的信号发生器,波形的频率可用程序控制改变。并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑等优点。在本设计的基础上,加上按键控制和LED显示器,通过键盘控制波形频率的增减以及波形的选择,并在LED显示频率。在单片机的输出端口接DAC0832进行D/A转换,再通过运放进行波形调整,最后输出波形。
关键词:信号发生器,单片机,波形调整
The design of low-frequency signal source
Abstract:Signal-generator is a kind of signal source in common use, broadly applied at the electronics electric circuit, auto control system and teaching experiment etc. Currently used mostly function signal generator signal generator, waveform generator and a special price of expensive . The design is based on AT89C51 single-chip microcomputer used as the core of the device, can generate the production of a triangular wave, square wave, sine wave signal generator, waveform control can be used to change the frequency. May need to select in accordance with unipolar or bipolar output of output, with simple lines, the advantages of compact structure.During the design basis, if the button control and LED display, the keyboard control through changes in wave frequency, as well as the choice of waveform and frequency in the LED display. In single-chip DAC0832 output port access to D/A converter, and then wave through the operational amplifier to adjust the final output waveform.
Key words: signal generator, MCU , wave-form adjustmen
1 绪论
1.1 论文研究的背景和意义
在科学研究、工程教育及生产实践中,如工业过程控制、教学实验、机械振动试验、动态分析、材料试验、生物医学等领域,常常需要用到低频信号发生器。而在我们日常生活中,以及一些科学研究中,锯齿波和正弦波、矩形波信号是常用的基本测试信号。譬如在示波器、电视机等仪器中,为了使电子按照一定规律运动,以利用荧光屏显示图像,常用到锯齿波产生器作为时基电路。函数发生器作为一种通用的电子仪器,在生产、科研、测控、通讯等领域都得到了广泛的应用。 但市面上能看到的此类仪器在频率精度、带宽、波形种类及程控方面都已不能满足许多方面实际应用的需求。加之各类功能的半导体集成芯片的快速生产,都使我们研制一种高精度、宽频带,并且能产生多种波形并具有程控等多功能函数发生器成为可能。
随着电子测量及其他部门对各类信号发生器的广泛需求及电子技术的迅速发展,促使信号发生器种类日益增多,性能日益提高,尤其随着70年代微处理器的出现,更促使信号发生器向着自动化、智能化方向发展。现在,许多信号发生器除带有微处理器,因而具备了自校、自检、自动故障诊断和自动波形形成和修正等功能外,还带有IEEE-488或RS232总线,可以和控制计算机及其他测量仪器一起方便的构成自动测试系统。当前信号发生器总的趋势是向着宽频率覆盖、高频率精度、多功能、自动化和智能化方向发展。
我们长期使用的信号发生器,大部分是由模拟电路构成的,这类仪器作为信号源,频率可达上百MHz,在高频范围内其频率稳定性高、可调性好。但用于低频信号输出时,它所需要的RC值很大,参数准确度难以保证。而且其体积大,损耗也大。有人研制了采用8031单片机及程序存储器构成的最小系统组成的数字式低频信号发生器,它在低频范围内性能好,但是体积较大,价格较贵。随着大规模集成电路技术的发展,集成度不断提高,使得微型机的速度和性能大为提高,可靠性增加,成本降低。MCS-51就是将具有存储程序、处理数据以及与外设交换信息的功能电路集成在一块芯片中,并符合一定系统结构而构成的单片机。
单片机在生产过程控制、自动检测、数据采集与处理、科技计算、商业管理和办公室自动化等方面获得了广泛的应用。单片机具有体积小、重量轻、耗能省、价格低、可靠性高和通用灵活等优点,因此也广泛应用于卫星定向、汽车火花控制、交通自动管理和微波炉等专用控制上。近几年来,单片机的发展更为迅速,它已渗透到诸多学科的领域,以及人们生活的各个方面。单片机并没有超脱冯·诺依曼原理下的计算机的结构框 架和工作原则,而是着眼于应用到更广阔的范围:工业控制、数字显示、智能仪表、电子设备、汽车电控、农机、家电乃至儿童玩具的控制。它不求规模大,只求小而全。
1.2 信号发生器在国内外发展现状
在70年代前,信号发生器能够提供正弦波、余弦波、方波、三角波等几种常用标准波形,产生其它波形时,需要采用较复杂的电路和机电结合的方法.这个时期的信号发生器采用的是模拟电子技术,由分立组件或模拟集成电路构成,其电路结构复杂,且仅能产生正弦波、方波、锯齿波和三角波等几种简单波形,输出的波形具有良好的相位噪声、较低的寄生分量以及较快的开关速度等,但是模拟电路的漂移较大,使输出的波形的幅度稳定性差,而且模拟器件构成的电路存在着尺寸大、价格贵、功耗大等缺点,并且要产生较为复杂的信号波形则电路结构非常复杂101。同时,由于通过电位器的调节来实现输出频率的调节,因而很难将频率调到某一固定值
在70年代以后,微处理器的出现,可以利用微处理器、AID、和DIA、硬件和软件使波形发生器的功能扩大,产生更加复杂的波形。这时期的信号发生器采用的数字电子技术,多以软件为主,实质是采用微处理器对DAC的过程控制,就可以得到各种简单的波形。软件控制波形的一个最大缺点就是输出波形的频率低,这主要是由CPU的工作速度决定的1。如果想提高频率可以改进软件程序减少其执行周期时间或提高CPU的时钟周期,但这些办法是有限度的,根本的办法还是要改进硬件电路。
现代电子、计算机和信号处理等技术的发展,极大的促进了数字化技术在电子测量仪器中的应用,函数发生器蓬勃发展起来。但是它的工作方式有两种:地址计数器方式和直接数字合成方式,目前函数发生器大多数采用的是地址计数器工作方式,采用这种工作方式的电路输出信号的频率分辨率和稳定度都达不到太高指标,在高频输出时相位分辨率不够。
现代波形合成技术大多采用直接数字合成技术,简称DDS技术。DDS技术把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平,并且可以在很宽的频率范围内进行精细的频率调节。已出现了许多功能强大的直接数字合成芯片,如果把这些DDS芯片用嵌入式处理器来控制,这就适合了现在信号源能产生波形的种类多、频率高,而且还要体积小、可靠性高、操作灵活、使用方便及可由计算机控制的要求。
长期以来现有测试设备性能提升的速度总是无法跟上需求复杂性的增长,用户面临着三个令人困扰的问题:易用性问题,即减少开发时间,并快速将产品推向市场的问题;效率问题,即用更少的人力、资金,开发出更好的产品;功能问题,即缺少更快的速度、更复杂的设备来开发功能丰富的产品的设备。可编程片上系统SOPC的出现使这一问题得到了更加方便解决。
目前各大芯片制造厂商相继推出采用先进CMOS工艺生产的高性能和多功能的DDS芯片(其中应用较为广泛的是AD公司的AD985X系列),为信号发生器的电路设计提供了多种选择。虽然有的专用DDS芯片的功能也比较多,但控制方式却是固定的,因此不一定是我们所需要的。这时如果用高性能的FPGA器件设计符合自己需要的DDS电路,再加上相应的软核CPU来增加控制的灵活性就是一个很好的解决方法。这时不再使用DDS 芯片,这就是用SOPC技术进一步提高系统的可靠性、灵活性,减小了体积,降低了功耗。
目前常用到的低频信号发生器的设计方案有以下四种:
1.用分立元件组成的函数发生器,可以由晶体管、运放IC、电容、电阻等通用器件制作,通过调节外部阻容元件值,即可改变振荡频率,产生高质量的中、低频正弦波,通过电路转换产生其他波形。通常这种电路产生的频率不高,其工作不很稳定,不易调试。2. 用专门的函数信号发生器IC产生。用它实现的好处在于,外围电路极其简单,另外在DAC的编程方面又提供及其便利的编程环境。早期的函数信号发生器IC,如L8038、BA205、XR2207/2209等,它们的功能较少,精度不高,频率上限有300kHz,无法产生更高频率的信号,调节方式也不够灵活,频率和占空比不能独立调节,二者互相影响。3. 利用常用的单片机芯片以及外围器件构成函数发生器,能产生多种波形,而且软硬件灵活结合,能达到较高的频率,且易于调试,设计制作比较简单,成本较低。可以设计一种低频任意函数发生器,将输出波形函数以数据表的方式嵌入在软件程序中,通过软件程序更改输出波形数据表,即可实现输出任意函数信号,而无需变动硬件电路。4. 利用专用直接数字合成DDS芯片的函数发生器:直接数字合成技术是一种新型的频率合成技术,采用这种技术能够产生频率很低,分辨率很高和多种波形较为复杂的信号,而且便于实现程控。 但只采用DDS 技术本身还很难解决带宽的问题,为扩大输出频率范围,在DDS波形发生器的基础上,增加了一个锁相倍频电路问题就解决了能产生任意波形并达到很高的频率,但成本较高。
1.3 本课题要研究解决的问题
本课题所研究的就是一种采用一片AT89C51单片机和DAC0832数模转换器组成的智能数字式低频信号发生器。按设计的需要,选择运行不同的程序,将会得到不同的波形信号。再在 DAC0832 输出端加上一些电压变换电路以及放大整形电路,就完成了一个频率可调的多功能信号发生器的设计。
本次毕业设计要求熟悉模拟电路及数字电路基本知识,对模拟电路单元模块、微机原理、数据采集单元等要求认识深刻,完成软硬件的设计以及电路调试。具体要求如下:
1.可同时输出正弦波、方波、三角波;
2.信号频率:0Hz ~50Hz;
3.频率稳定度:Δf/f< 10-3;
4.波形精度:方波:上升沿和下降沿tr、tf时间均应小于2us。三角波:线性度< 2%。正弦波:谐波失真< 2%;
5.采用AT89C51(可选)作为核心部件,编程语言采用汇编或C。
2 系统设计方案
2.1 基本设计原理
根据设计要求,考虑到电路的简单和成本等因素,选用ATMEL公司的AT89C51单片机作为微处理器,它内含4KB快闪程序存储器,其编程和擦除完全用电实现;其时钟频率为0~33KHz;并且价格低廉。用AT89C51,加上相应的时钟和复位电路就组成了最小系统,采用外接键盘操作控制输出三角波、正弦波、方波,同时也可以用键盘方便地调整频率的变化,并且还可以将频率用2位十进制数通过LED数码显示器显示出来。键盘输入部分主要用于选择波形和调节波形的频率。键盘共设5 个键,其中3 个键用于选择3 种不同的波形,2 个键用于调节波形频率的增或减。显示部分使用74138译码器和LED,用来显示波形频率。AT89C51 单片机用来执行某一波形发生程序,向D /A 转换器的输入端发送数据,将其转化成模拟量,并通过运算放大器调节波形,从而在输出端得到所需的波形。该系统有5个发光二极管,用于指示按键工作情况。频率调节范围在0~50Hz。从结构上看,单片函数发生器主要由单片机构成的计算机系统和各种功能接口组成。本设计系统的结构框图见图2-1。
图2-1 硬件设计的结构框图
2.2 单片机AT89C51的简介
AT89C51具有4k 字节 Flash 闪速存储器,128 字节内部 RAM,32个I/O 口线,看门狗(WDT),两个数据指针,两个 16 位定时/计数器,一个 5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。空闲方式停止 CPU 的工作,但允许 RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存 RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。外部引脚图如图2-2。
图2-2 外部引脚图
Vcc(40脚):典型值+5V,接5V电源模块。Vss(20脚):接地。
EA/VPP该引脚为低电平时,则读取外部的程序代码 (存于外部EPROM 中)来执行程序。在电路连接中,该引脚接5V电压,此引脚接成高电平使程序运行时访问内部程序存储器,当程序指针PC 值超过片内程序存储器地址时,将自动转向外部程序存储器继续运行。此外,在将程序代码烧录至8751 内部EPROM、89C51 内部FALSH 时,可以利用此引脚来输入提供编程电压。
P0 口(P0.0~P0.7)是一个8 位漏极开路双向输入输出端口,当访问外部数据时,它是地址总线(低8 位)和数据总线复用。外部不扩展而单片应用时,则作一般双向I/O 口用。P0 口每一个引脚可以推动8 个LSTTL 负载。电路连接中作为输出口,与DAC0832输入口连接。
P1 口(P1.0~P1.7)口是具有内部提升电路的双向I/O 端口(准双向并行I/O 口),其输出可以推动4 个LSTTL 负载。与LED的a~g,还有DP端连接,用作显示端口用。
P2 口(P2.0~P2.7)口是具有内部提升电路的双向I/O端口(准双向并行I/O 口),当访问外部程序存储器时,它是高8 位地址。外部不扩展而单片应用时,则作一般双向I/O 口用。每一个引脚可以推动4 个LSTL 负载。P2.0~P2.4与按键连接,5个按键用作独立键盘接口电路。P2.5~P2.7与74138连接,驱动译码器。
P3 口(P3.0~P3.7)口是具有内部提升电路的双向I/O 端口(准双向并行I/O口),它还提供特殊功能,包括串行通信、外部中断控制、计时计数控制及外部随机存储器内容的读取或写入控制等功能。
XTAL1接外部晶振的一个引脚。在单片机内部,它是一反相放大器输入端,这个放大器构成了片内振荡器。它采用外部振荡器时,对于HMOS单片机,此引脚应接地,对于CHOMS单片机,此引脚做为外部震荡器信号的输入端。
XTAL2接外部晶振的一个引脚。在片内接至振荡器的反相放大器输出端和内部时钟发生器输入端。当采用外部振荡器时,则此引脚接外部振荡信号的输入。
2.3 电源模块设计
在本设计中,采用的是三固稳压电源,三端固定稳压器主要特点:输出稳定性好、使用方便、输出过流、过热自动保护。其中,CW78××系列稳压器输出固定的正电压,如7805输出为+5V:CW79××系列稳压器输出固定的负电压,如7905输出为-5V。输入与输出端之间的电压不得低于3V!输入端接电容Ci可以进一步滤除纹波,输出端接电容Co能改善负载的瞬态影响,使电路稳定工作。Ci、Co最好采用漏电流小的钽电容。
2.4 键盘模块设计
在计算机控制系统中,数据和控制信号的输入主要使用键盘。键盘接口,尤其是键入信号的软件处理方法是影响系统使用和操作性能的重要因素。键盘接口及其软件的任务主要有以下几个方面:
(1)检测并判断是否有键按下;
(2)按键开关的延时消抖功能;
(3)计算并确定按键的键值;
(4)根据计算出的键值进行一系列的动作处理和执行
一般常用到的键盘设计有:独立式按键和矩阵式按键。
1.独立式按键:
在单片机控制系统中,常常只需要用到功能键。少量的功能键一般采用独立式结构,独立式按键是各按键相互独立的接通一条输入数据线,每个键的工作不会影响其它的I/O口。这是较简单的键盘结构。当某一个键闭合时,相应的I/O口线电平变化(高电平或者低电平)。当程序检测到变化的I/O口线电平时,就可以执行相应的功能。这种键盘的优点是电路简单;缺点是当键数较多时,要占用较多的I/O线。
2.矩阵式按键:
矩阵键盘的按键按N行M列排列,每个按键占据行列的一个交点,需要的I/O口数目是N+M,容许的最大按键数是N×M。显然,矩阵键盘可以减少与微机接口的连线数,简化电路结构,是一般微机常用的键盘结构。
因为本设计需要的按键数较少,所以选用独立式按键。
2.5 显示模块设计
用单片机驱动的LED数码管有很多方法,按显示方式,可分为静态显示和动态显示,按译码方式,可分为硬件译码和软件译码。
(1)LED静态显示方式
所谓静态显示方式,就是当显示器显示某一个字符时,相应的发光二极管恒定地导通或截止。静态显示时,较小的电流能得到较高的亮度。这是由于显示器的各位相互独立,而且各位的显示字符一经确定,相应锁存器的输出将维持不变,直到显示另一个字符为止。当显示器位数很少(仅一、二位)时,采用静态显示方式是合适的。当位数较多时,用静态显示所需的I/O口太多,占用太多的硬件资源。故在位数较多时往往采用动态显示方式。
(2)LED显示器动态显示方式
在多位LED显示时,为了简化电路,降低成本,可采用动态显示方式。所谓动态显示,就是一位一位地轮流点亮各位显示器(扫描)。通常将所有位的段选线相应地并联在一起,由一个(7段LED)8位I/O口控制,形成段选线的多路复用。而各位的共阳极或共阴极分别由相应的I/O口线控制,实现各位的分时选通。对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参数,可实现较高较稳定的显示。
这两种显示方式各有利弊:静态显示虽然数据显示稳定,占用很少的CPU时间,但每个显示单元都需要单独的显示驱动电路,使用的电路硬件较多;动态显示虽然有闪烁感,占用的CPU时间多,但使用的硬件少,能节省线路板空间。在动态显示方式下,每位显示器的点亮时间是极为短暂的,约1ms左右,但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的数据,不会有闪烁感。
可以看出,动态显示方案具有一定的实用性,也是目前单片机数码显示中较为常用的一种显示方法。所以,本设计采用动态显示方案。
2.6 D/A转换
DAC0832是CMOS工艺制造的8位D/A转换器,属于8位电流输出型D/A转换器,转换时间为1us,片内带输入数字锁存器,其引脚排列和内部组成原理图如1.3所示。DAC0832与单片机接成数据直接写入方式,当单片机把一个数据写入DAC寄存器时,DAC0832的输出模拟电压信号随之对应变化。利用D/A转换器可以产生各种波形,如方波、三角波、正弦波、锯齿波等以及它们组合产生的复合波形和不规则波形。这些波形利用标准的测试设备是很难产生的。
图2-3 DAC0832引脚排列图
2.6.1 DAC0832主要性能
1. 输入的数字量为8位;
2. 采用CMOS工艺,所有引脚的逻辑电平与TTL兼容;
3. 数据输入可以采用双缓冲、单缓冲和直通方式;
4. 转换时间:1us;
5. 精度:1LSB;
6. 分辨率:8位;
7. 单一电源:5—15V,功耗20mw;
8. 参考电压:-10—+10V.
2.6.2 DAC0832的引脚功能
1. D7—D0:8位数据输入;
2. ILE:数据输入锁存允许,高电平有效;
3. :片选;
4. :输入寄存器写信号。当ILE、、同时有效时,数据装入输入寄存器,实现输入数据的第一级缓冲;
5. :数据传送控制信号,控制从输入寄存器到DAC寄存器的内部数据传送;
6. :DAC寄存器写信号,当和均有效时,将输入寄存器中的数据装入DAC寄存器并开始D/A转换,实现输入数据的第二级缓冲。
7. :参考电压源,电压为-10—+10V;
8. :内部反馈电阻接线端;
9. :DAC电流输出1,其值随输入数字量线性变化;
10. :DAC电流输出2。
当DAC寄存器的内容全为1时,=最大,=0;
当DAC寄存器的内容全为0时,=0,=最大;
当DAC寄存器的内容为N时,=*N/(256*),=/-;
无论N值多大,+=/为常数。
11.:工作电源,其值为+5—15V,典型值为+5V;
12. AGND:模拟信号地线;
13. DGND:数字信号
3 硬件电路
3.1 硬件设计原则
单片机应用系统的硬件电路设计包含两部分内容:一是系统扩展,即单片机内部的功能单元(如ROM、I/O、定时/计数器等)容量不能满足应用系统的要求时,必须在片外进行扩展,选择适当的芯片,设计适当的电路。二是系统配置,即按照功能要求配置外围设备如显示器、D/A转换等,要设计合适的电路。系统的扩展和模块设计应遵循下列原则:
(1) 尽可能选择标准化、模块化的典型电路,提高设计的成功率和结构的灵活性。
(2) 系统的扩展与外围设备配置的水平应充分满足应用系统的功能要求。
(3) 硬件结构应结合应用软件方案一并考虑。硬件结果与软件方案会产生相互影响,考虑的原则是:软件能实现的功能尽可能由软件来实现,以简化硬件结构。但必须注意,由软件实现的硬件功能,其响应时间要比直接用硬件响应来的长,而且占用CPU时间。所以,选择软件方案时,要考虑到这些因素。
(4) 整个系统中相关的器件要尽可能做到性能匹配,例如选用的晶振频率较高时,存贮器的存取时间有限,就该选择允许存取速度较高的芯片;选择CMOS芯片单片机构成低功耗系统时,系统中的所有芯片都应该选择低功耗的产品。
(5) 可靠性及抗干扰性设计是硬件系统设计不可缺少的部分,它包括芯片、器件选择,去耦滤波等。
(6) 单片机外接电路较多时,必须考虑其驱动能力。驱动能力不足时,系统工作不可靠,解决的办法是增加驱动能力,增设线驱动器或减少芯片功耗,降低总线负载。
(7) 系统的扩展及各功能模块的设计在满足系统功能要求的基础上,应适当留有余地,以备将来修改、扩展之需。
(8) 在考虑硬件总体结构的同时要注意通用性的问题。
根据以上原则,进行硬件设计。系统采用较为普及的AT89C51单片机作为系统的核心。它不但容易实现设计指标,而且还有较好的性价比。由于是教学用实验系统,各元器件的选择较固定,电路设计方面也与教科书中内容相近。从整体系统来看地址译码方法也只能采用地址译码法。但在存贮器扩展、键盘接口、总线驱动器、可靠性设计等方面还应多考虑。
3.2 系统各硬件电路
3.2.1 时钟电路及复位电路
单片机的复位是靠外电路实现的,在时钟电路工作后,只要在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平,单片机便实现初始化状态复位。为了保证应用系统可靠地复位,通常是RST引脚保持10ms以上的高电平。
本系统具有上电复位功能。电路连接如图3-1所示。此电路仅用一个电容及一个电阻。系统上电时,在RC电路充电过程中,由于电容两端电压不能跳变,故使RESET端电平呈高电位,系统复位。经过一段时间,电容充电,使RESET端呈低电位,复位结束。
图3-1时钟电路及复位电路
3.2.2 电源电路
本次设计使用三种共地电源:+12V,-12V,+5V,硬件设计中采用自带电源方式。因为本次设计有AT89S51单片机与0832,这些芯片的工作电源电压为+5V。单片机的正极接40引脚,负极(地)接20引脚。0832 的19,20脚接正极,负极(地)接3脚。另外由于本机设计为小信号输出,运放741采用±12V 电源。电路中在集成三端稳压器输入端、输出端与公共端之间,分别接有小电容,电容值大小是查阅很多资料以及问实验室的同学得来的。这里是为了更好地改变集成三端稳压片的瞬态响应,防止稳压块自激振荡,保证正常工作。原理图如图3-2所示。
图3-2 电源电路
3.2.3 按键电路设计
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。在本设计中可以选用,I/O接口选用P2.0~2.4, 5个按键分别定义为波形选择键和频率增大减小键。按键直接与P2.0~2.4连接,当键按下时,二极管点亮,指示键选通。具体电路如图3-3
图3-3 按键电路
3.2.4 显示电路
在本设计中,用一片74138译码器直接与单片机连接占用 P2.5~2.7接口。由译码器的输出端直接驱动七段数码管,而数码管的数码端接单片机的P1.0~1.7端口。当前输出波形频率需要显示出来,因为频率范围是0HZ到50HZ,所以只需要二位数码管。电路图如3-4。
图3-4 显示电路
3.2.5 D/A转换及波形输出电路
在D/A转换电路中,D0-D7 为数字信号输入端,与单片机的P0 口(P0.0~P0.7)连接。ILE接+5V, IOUT2 接地,IOUT1输出电流经运放(F007)输出一个单极性电压范围0~5V。片选信号CS和转换控制信号XFER都连到P3.6,因为P3.6 WR 为外部随机存储器的写选通,本设计中不用外部采集信号,所以可做0832的选通。0832的“写”选通线WR1和WR2与单片机的P3.7连接,CPU对0832执行一次“写”操作,把一个数据直接写入DAC寄存器,DAC0832的输出模拟信号随之对应变化。这样,由CPU送来的数据PD0~PD7,通过DAC0832转换成电流输出,由运放等将电流信号转换成电压信号,得到了所需要的各种波形信号。
图3-5 波形输出
4 软件设计
4.1 应用软件设计原则
单片机应用系统中的应用软件是根据系统功能要求设计的,应可靠地实现系统的各种功能。应用系统种类繁多,应用软件各不相同,但一个优秀的应用系统的软件应具有下列特点:
1、软件结构清晰、简洁、流程合理。
2、各种功能程序实现模块化、子程序化。这样,既便于调试、链接,又便于移植、修改。
3、程序存储区、数据存储区规划合理,既能节约内存容量,又使操作方便。
4、运行状态实现标志化管理。各个功能程序运行状态、运行结果以及运行要求都设置状态标志以便查询,程序的转移、运行、控制都可状态标志条件来控制。
5、经过调试修改后的程序应进行规范化,除去修改“痕迹”。规范化的程序便于交流、借鉴,也为今后的软件模块化、标准化打下基础。
6、实现全面软件抗干扰设计。软件抗干扰是计算机应用系统提高可靠性的有力措施。
7、为了提高运行的可靠性,在应用软件中设置自诊断程序,在系统工作运行前先运行自诊断程序,用以检查系统各特征状态参数是否正常。
4.2 编程语言的选择
汇编语言的掌控系统硬件的能力强于C 语言,设计出来的程序更加贴近硬件特性,往往能将硬件效能发挥到极致。代码精练,效率高。但是可读性差,不利于复杂算法的开发和实现,可移植性差。容易产生流水线冲突,排除冲突需要靠人来辅助完成,这要求编程人员有较为丰富的开发经验和对硬件工作机制的深刻理解。
由于用C 语言书写接近自然语言,其可读性强、利于理解,在编制、修改、实现算法方面比用汇编语言开发容易。易于开发和维护,可移植性强。不容易发生流水线冲突,编译器能提供完善的解决流水线冲突的结果。有大量现存的算法可利用,适用于人机界面的开发。
综上所述,由于C语言的可读性强,有利于理解,编程灵活,所以本程序选用C语言。
4.3 软件设计总流程图
本次设计中软件是非常重要的部分,可以说是整个设计的基础。对于一个复杂的软件,一定要有一个软件总流程图,以便反映各个软件子模块间的内在联系,表达各个子模块的功能。根据对软件任务的讨论,得到波形发生器的软件总流程图如图4-1。
4-1 设计总流程图
4.4 各软件模块设计
软件的整个程序在附录3。以下是按照波形发生器的功能,其应用程序必须有系统复位初始化、键盘扫描与处理、定时器0中断服务程序、显示程序、波形发生程序、频率改变等几部分,现将各主要软件模块介绍如下。
4.4.1 系统复位初始化
初始化程序模块主要进行全局变量的定义、0832的选通。这部分程序如下:
#include
#include
#include//库函数
#define uchar unsigned char
#define uint unsigned int//宏定义
sbit cs=P3^7;//选通0832
sbit wr=P3^6;//写选通
int num=0;
int boxing,sanh,sanl,sj,fang,zh;
boxing=0;
sanh=0;
sanl=127;
sj=0;
zh=1;//全局变量定义
4.4.2 键盘扫描与处理
在此次设计中键盘主要是用来控制波型转换、频率的增加及减少。在设计键盘时,最关键的就是软件的设计。
在检测到有按键按下时,执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态。
独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为高电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
键盘扫描与处理的流程图如图4-2。P2.0~ P2.4分别为正弦波、三角波、方波、频率增、频率减按键。
图4-2 键盘扫描与处理流程图
4.4.3 显示程序
本显示由2个7段LED组成。L1~L2二位用于显示频率值,显示范围是0-50,满足本波形发生器的频率要求。个十位通过74138译码选通。频率大小由程序计算。
4.4.4 波形发生程序
以产生正弦波为例,采用定点法来生成波形,即将一个周期的正弦波按360等分为256,计算出各点的正弦函数值,并转化相应的D/A转换器输入数值,这样得到一个正弦函数表。通过程序将该表存于单片机的程序存储器中,利用单片机的定时器来产生定时,每当定时时间到时,查表得到该点对应的输出值,然后通过D/A转换得到该点的对应电压值。如此,周而复始地查表输出,就得到所要的正弦波。
三角波的上升沿是从0以1为基数加到128,然后下降沿从128降到0,两边对称。方波的产生较简单,只要交替地将最大值和最小值输出给D/A进行转换即可,它们的延续时间为周期的一半。波形的流程图如图4-3。
图4-3 波形发生流程图
4.4.5 频率改变
程序中频率改变由定时/计数器中断产生,与定时/计数器应用有关的控制寄存器有三个。
1、定时控制寄存器(TCON)
TR0和TR1:定时器运行控制位
TR0(TR1)=0 停止定时/计数器工作
TR0(TR1)=1 启动定时/计数器工作
该位根据需要以软件方法使其置“0”或“1”。
程序如下:TR0=1;//启动定时记数器工作
TR0=0;//停止定时记数器工作
2、工作方式控制寄存器(TMOD)
TMOD寄存器是一个专用寄存器,用于设定两个定时/计数器的工作方式,格式如下:
符号 GATE C/T M1 M0 GATE C/T M1 M0
类别 定时/计数器1 定时/计数器2
GATE –门控制
当GATE=1 时,由外中断请求信号INT0或INT1和TR的组合状态启动定时器。
若GATE=0由运行控制位TR启动定时器。
C/T -选择定时或计数器模式。
当C/T=1 为计数器工作方式,C/T=0 为定时器工作方式。
M1M0-工作方式选择位
M1M0=0 0 方式0 13 位定时/计数器
M1M0=0 1 方式1 16位 定时/计数器
M1M0=1 0 方式2 自动再装入的8位 定时/计数器
M1M0=1 1 方式3 定时/计时器1 无效,将定时/计数器0 分成两个8 位计数器。
在程序中,选用方式一,其定时时间计算公式见公式(4-1)
T=(2-计数初值)*晶振周期*12 (4-1)
程序如下:
int val; //计数初值
val=1-50/(256*F);//方式一的定时公式
TMOD=0x01;//定时器0方式一
TH0=val/256;//定时器默认初值
TL0=val%256;
3、中断允许控制寄存器(IE)
EA-中断允许总控制位;
ET0和ET1-定时/计数器中断允许控制位。ET0(ET1)=0,禁止定时/计数器中断;ET0(ET1)=1,允许定时/计数器中断。
程序如下:
EA=1;//中断允许总控制
ET0=1;//允许定时记数器中断
由于一个周期的点数固定,改变定时器的定时值,就改变相邻两点的间隔时间,从而改变正弦波的频率。正弦波和三角波的点数都是256,所以每个点数的延续时间为周期的1/256。方波只有2个点,所以每个点数的延时为周期的1/2。
程序中设置了频率初始值50HZ,按键增减1HZ,其程序在键盘扫描程序段,在此不重复。
5 系统调试
5.1 PROTEUS调试软件
Proteus(海神)的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。
该软件的特点:
① 全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。
②具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS一232动态仿真、1 C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
③ 目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
④ 支持大量的存储器和外围芯片。总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真51、AVR、PIC。
5.2 软件使用环境
Proteus软件可运行于DOS环境和Windows环境。
5.3 软件调试
软件的调试主要是各子程序的调试,对于频率的增减按键,由于计数器为16位定时器,最大值为65535,所以在加减是用255作为加减数,这样频率的调节变化交快些,但在接近最高频率时变化太快。如果加减是用1作为加减数,那么在频率的高端变化平稳,而在频率的低端则变化太慢。
在设计时,每周期波形用了256个采样点合成,波形不是很光滑,如果增加采样点,则输出的频率会变低。
首先,选择目标芯片AT89C51,设置开发工具命令选项,设置频率为12MHZ,默认的是33MHZ。然后创建源文件,把所编写的程序写入,把源文件加入工程,接下来连接并编译工程,Output窗口显示错误和警告信息。比如if else 不匹配,等常见错误。经过修改后再进行汇编,若这时提示汇编成功,保存目标文件,则说明源程序的指令使用没有错误。但并不表示程序没有错误,还必须经过仿真调试,仿真通过才说明程序设计正确。
仿真结果如下:
Build target 'Target 1'
linking...
Program Size: data=43.0 xdata=0 code=1521
"boxing" - 0 Error(s), 0 Warning(s).
仿真波形图如下:
正弦波10Hz
正弦波20Hz
正弦波40Hz
方波10Hz
方波20Hz
方波40Hz
三角波10Hz
三角波20Hz
三角波40Hz
总结
综观整个设计,设计涉及的内容比较多,但涉及的思路清晰,各个部分都经过详细的考虑,通过这次设计,我更加全面的了解到了信号发生器的实现原理。熟悉了Protel99软件的使用。
在选择编程语言的时候,我觉得C语言的那种书写接近自然语言,可读性强、利于理解,编制、修改、实现算法方面比用汇编语言开发容易。对软件的仿真上,我选择的是Proteus软件,这个以前比较陌生,但是在网上找了很多资料,我觉得还是比较简单好用。对程序中问题不断修改调试,最后顺利通过。
设计的整个过程我都在不断学习,也遇到了不少问题,通过网上查阅资料还有老师同学的帮助,我觉得还是学到了很多东西,使我更加系统的了解了电路设计和制作的全过程。
另外,我也深刻了解了课外知识的重要。如何能够快速的查阅对自己有用的知识,对于我们的学习和工作都起到了很大的帮助,当我在设计过程中遇到一些没有学到的知识时,就需要有针对的查找资料,然后对有用的资料加以吸收和利用,不断的发展和壮大自己,扩大自己的求知欲,阔宽自己的知识面,这样对于自己的全面发展将会起到巨大的推动作用。
在整个设计的过程中,我学会了如何分析问题,如何利用身边已有的条件去解决问题。但在整个实验中仍可以看出自己无论在理论还是动手方面都存在着有些不足,这点仍需要在将来的学习中,不断的进步,希望经过长期的锻炼,自己将成为个优秀的电子制作者。
附录1 硬件电路图
附录2 电路图的PCB
附录3 软件程序
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit cs=P3^7;
sbit wr=P3^6;
int num=0;
int boxing,sanh,sanl,sj,fang,zh;
boxing=0;
sanh=0;
sanl=127;
sj=0;
zh=1;
//LEDa~g分别接P0~P6
void delay(uint x)
{
while(--x);
}//延时
uchar code tab[]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,
0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,
0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,
0xfd,0xfe,0xfE,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,
0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,
0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc9,
0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,
0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,
0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,
0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,
0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,
0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,
0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,
0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80
};
void time0() interrupt 1 using 1//声明内部定时器0中断,指定中断所用的寄存器组1
{
if(boxing==0)//正弦波
{ if(num==256)
num=0;
P0=tab[num++];
}
else if(boxing==1)//三角波
{
if(sj==0)//三角波上升
{ P0=sanh++;
if(sanh==127)
{sanh=0;sj=1;}
}
else //三角波下降
{
P0=--sanl;
if(P0==0)
{sanl=127;sj=0;}
}
}
else if(boxing==2)//方波
{
if(zh==1)
P0=0xFF;
else P0=0x00;
zh*=-1;
}
}
void inital(int F) //初始化定时器
{
int val;
val=65535-1000000/(256*F);//方式一的定时公式
TMOD=0x01;//定时器0
TH0=val/256;//定时器默认初值
TL0=val%256;
EA=1;//中断允许总控制
ET0=1;//允许定时记数器中断
TR0=1;//启动定时记数器工作
}
void xianshi(int addr,int shu)
{
P2=(P2&0X1F)|(addr<<5);//把addr的值赋予P2.7—P2.5
switch (shu)
{
case 0:P3=0X3F; break;//按键显示输入数值
case 1:P3=0X06; break;
case 2:P3=0X5B;break;
case 3:P3=0X4F; break;
case 4:P3=0X66; break;
case 5:P3=0X6D; break;
case 6:P3=0X7D;break;
case 7:P3=0X07; break;
case 8:P3=0X7F;break;
case 9:P3=0X6F;break;
default :break;
}
}
void main(void)
{
int qian,bai,shi,ge;
long int val;//TH0,TL0
int FTI;//采样间隔时间
int F=50;//频率
cs=0; //启动DAC0832
wr=0;
inital(F);//默认正弦波,频率5K的初始化
while(1)
{
qian=(F%10000)/1000;
bai=(F%1000)/100;
shi=(F%100)/10;
ge=F%10;
xianshi(0,qian);
xianshi(1,bai);
xianshi(2,shi);
xianshi(3,ge);
if(P3&0x01!=0)//P3.0
{boxing=0;//正弦波
FTI=F/256;
TR0=0;//停止定时器工作
inital(FTI);//重新初始化定时器
}
else if(P2&0x02!=0)//P2.1
{boxing=1;//三角波
FTI=F/256;
TR0=0;//停止定时器
inital(FTI);//重新初始化定时器
}
else if(P2&0x04!=0)//P2.2
{boxing=2;//方波
FTI=F/2;
TR0=0;//停止定时器
inital(FTI);//重新初始化定时器
}
if(P2&0x08!=0)//P2.3
{F+=10;//按键频率加,步进10HZ
delay(500);//延迟一定时间
TR0=0;//停止定时器
inital(FTI);//重新初始化定时器
}
else if(P2&0x10!=0)//P2.4
{F-=10;//按键频率减,步进10HZ
delay(500);// 延迟一定时间
TR0=0;//停止定时器
inital(FTI);//重新初始化定时器
}
}
}
参考文献
[1] 郝建国.单片机在电子电路设计中的应用[M].北京:清华大学出版社,2002:171-205.[2] 姜志海.单片机原理及应用[M].北京:电子工业出版社,2005:102-114,255-264 .
[3] 蔡美琴,张为民等.MCS-51系列单片机系统及其应用[M]. 北京:高等教育出版社,1988:112-175.
[4] 谭浩强.C程序设计(第二版)[M] .北京:清华大学出版社,1999:91-120.
[5] 康华光,陈大钦.电子技术基础模拟部分(第四版)[M]. 北京:高等教育出版社,1998:394-467.
[6] 彭容修.数字电子技术基础[M]. 武汉:武汉理工大学出版社,2001:198-212.
[7] 谷树忠,闫胜利.Protel DXP实用教程[M] .北京:电子工业出版社,2003:205-237.
[8] 相迎军,李兴城等.基于AT89C4051单片机的专用信号发生器设计与应用[J].传感器与仪表技术,2004 vol20,No11.
[9] 汪丽芳.多功能函数发生器设计[J].仪表技术,2005No5.
[10] 江明.单片机控制多功能信号发生器[J].西安电子科技大学学报,2004,16(4):19-17.
[11] 徐承忠.一个单片微型计算机超低频信号发生器[J].南京理工大学学报(自然科学版),1987,29(12A):72-80.
[12] 赵兴亮.一种数字式移相信号发生器的设计与实现[J].自动化仪表,2007,9
[13] 景国新.基于DDS技术的函数发生器设计与实现[J].实验科学与报告,2006,8
[14] Mark N.Horenstein: Microelectronic Circuits and Devices[M]. Prentice Hall Inc,1996:55-72.
[15] Richard J. Hiygins: Electronis with Digital and Analog Integrated Ciecuits[M].Prentice
Hall,Inc,1983:121-145.
[16] Lattice.Lattice semiconductor ISP[M] .USA,2000:13-19.
[17] 何立民.单片机应用技术选编[J].电子学报,1993,5(16):18-58.
[18] 刘庆雄.低频信号发生器的设计[J].北京航空航天大学学报,1989,7(3):17-25.