(精选)基于单片机的全数字信号发生器设计_第1页
(精选)基于单片机的全数字信号发生器设计_第2页
(精选)基于单片机的全数字信号发生器设计_第3页
(精选)基于单片机的全数字信号发生器设计_第4页
(精选)基于单片机的全数字信号发生器设计_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、基于单片机的全数字信号发生器设计设备技术网   时间:2010-4-13来源:电子技术网    作者:工业设备常用频率量信号作为采集量,如使用光电编码器采信数据,当调试使用频率信号的设备时,由于机械等部份还未动作,无法采集信号,因此需要使用信号发生器。对于在工业现场使用的设备,其要求与实验室设备并不相同,如果直接使用实验室中所用的标准信号发生器,往往会觉得其体积过大、价格太高、使用较麻烦等。工业现场使用的设备,其绝对精度要求并不高,关键要稳定可靠,便于携带和使用。一、性能分析这个项目的目标是替代工业现场的频率采样装置,典型的如光电编码

2、器。通过调查,确认最终要制作的信号发生器的性能指标如下:频率范围:01Hz,以0.1Hz步进,1500Hz,以1Hz步进;波形:矩形波或方波均可;精度:频率值的相对误差不超过±1%;功能:(1)信号发生,信号发生器以给定的频率输出信号;(2)脉冲个数计数,仪器可对本身已发出的脉冲个数进行计数;(3)设定值可存储,每次上电自动调出前次设定值。二、初步设计在确定了性能指标后,可以进行初步设计,考虑其显示、操作等方面的要求。1、显示部分待设定的频率值最高为500HZ,只要3位数码管即可;要求对输出脉冲计数,虽未给出要求的计数值,但3位数码管最大仅能计到999,似乎太少了一些,再考虑到该仪器

3、以后的扩展,如希望以后能加一些高端点频(600、700、800、900、1000、2000、5000、10K等),需要更多的数码管显示,因此最终选择5位数码管显示。2、键盘部分键盘有很多方案可供选择,如工业品中常用的三键或四键方案,当然也可以用多键(如市售有一些标准的12或16键键盘)等,经过反复比较,考虑到易制作、易使用等等诸多因素,最终将键的个数确定为5个。键盘操作方案是仪器易用性的很重要的一个方面,这并非仪器的关键部分,但键盘、显示程序的工作量往往占据整个设计的很大的一部份。对键盘设计,重要的是要确定各按键功能,描述出各键的具体操作。本仪器的键设计如下:1工作状态描述由转换键切换两种状态

4、(1)显示设定的频率值(2)显示脉冲个数值2键定义切换键增加键减少键开启/停止键清除键3键操作描述切换键:切换两种工作状态增加和减少键:在显示设定频率值时按,按增加键、减少键设定频率,范围为0.1500HZ,每按一次增加键,设定值加1,如果按着键不放,稍后进入连续状态,设定值快速增加;按减少键,设定值减1,如果按着键不放,稍后进入连续状态,设定值快速减少。当频率设定值小于1以后,每按一次增加或减少键,设定值增加或减少0.1。开启/停止键:开始/停止信号发生清除键:用于清除当前脉冲个数的计数值。4工作过程开机后,信号发生器自动运行,有信号输出,按下“开启/停止”键,则信号发生器停止工作,没有信号

5、输出,再次按下“开启/停止”键,则信号发生器又开始工作,继续输出信号。信号灯用于指示信号发生器工作还是停止,当有信号产生时,信号指示灯闪烁,信号发生器暂停工作时,信号指示灯灭。三、硬件电路的设计在确定了性能指标、操作方案后,可以开始设计,首先要确定信号产生的方式。该信号发生器的绝对精度指标不高,但是其要求的最低频率低至0.1HZ,而最高分辨也要求达到0.1HZ,如果采用模拟技术难以达到,或需要付出较高代价才能做到。考虑到仪器的最高输出频率仅为500HZ,而且只需要提供要方波或矩形波,所以采用单片机做成全数字信号发生器。在有了这一设计思想之后,需要确定该方案是否可行,该方案准备采用单片机的定时器

6、产生信号,由于定时器的定时时间只能是整数,因此,不可避免会在一些频率点上产生误差,为此,用Excel对计数值、真实频率值作了测算,部分表格如表1和表2所示,经过测算表明,当采用12M晶振时,绝对误差最大约0.12HZ(492Hz处),相对误差最大约0.024%(492Hz处),可以满足要求,因此决定采用这一方案。当然,这仅是理论值,考虑到单片机定时中断的响应时间等因素,实际的误差肯定要比这个计算值大,但是要达到±1%的精度要求并不难,而其长期工作的稳定性取决于晶振的稳定度,并且晶振频率的变化引起的输出频率的变化也很微小,因此其长期工作稳定性也很好。 以下是部份测算的表格,完

7、整的表格在本期光盘Excel文件中。表1较高频率算法理论频率 t(ms) 真实频率 绝对误差 相对误差10 100000 10 0.00E+00 0.00E+0011 90909 11.00001 1.00E-06 9.09E-0812 83333 12.00005 4.00E-06 3.33E-0713 76923 13.00001 1.00E-06 7.69E-0814 71429 13.99992 -6.00E-06 -4.29E-0715 66667 14.99993 -5.00E-06 -3.33E-0716 62500 16 0.00E+00 0.00E+0017 58824 16

8、.99986 -8.00E-06 -4.71E-0718 55556 17.99986 -8.00E-06 -4.44E-0719 52632 18.99985 -8.00E-06 -4.21E-0720 50000 20 0.00E+00 0.00E+00表1较低频率算法f(hz) t(ms) 次数 频率值 误差 相对误差0.1 10000000 5000 0.1 0.00E+00 0.00E+000.2 5000000 2500 0.2 0.00E+00 0.00E+000.3 3333333 1667 0.29994 -2.00E-04 -6.67E-040.4 2500000 1250

9、 0.4 0.00E+00 0.00E+000.5 2000000 1000 0.5 0.00E+00 0.00E+000.6 1666667 833 0.60024 4.00E-04 6.67E-040.7 1428571 714 0.70028 4.00E-04 5.72E-040.8 1250000 625 0.8 0.00E+00 0.00E+000.9 1111111 556 0.899281 -7.99E-04 -8.88E-04在确定了信号发生的方式以后,综合初步设计中提出的一些技术指标要求,进一步确定具体的实施方案。根据以往的设计经验,显示部分由单片机的P0口与P2口直接驱动;

10、数据存储则采用串行EEPROM;信号由单片机的一个I/O口输出,并经驱动后输出。经过上述的设计后,可以确定这个仪器的框图如图1所示。 原理框图出来后,选择一款合适的机壳,然后综合考虑按键、数码管的安装方式,以便进行更详细的设计。数码管和按键必须安装在印板上才能安装到面板上,数码管与单片机的连线较多,5位数码管,需要13根线,再加上按键的连线共有19根,如果将单片机放在另一块板上,必然要用大量导线与键盘显示板连接,而大量的连线是我们不愿意做的,这不仅使得安装困难,而且线易折断造成故障,因此干脆将单片机也装在同一块板上,只留下电源和输出电路放在另一块板上,这样,两块板间只需3根引线即可,

11、大大降低了装配困难,也减少了故障隐患。整个设计的原理图,如图2和图3所示。其中图2是主板图,提供了包括数码管显示驱动、键盘等在内的大部份功能。从图中可以看到,该电路主要由这样几部份组成:(1)数码管显示部份,由单片机及相关外围电路构成5位数码管显示电路;(2)按键部份,按设计共有5个按键;(3)EEPROM存储器,这里选择I2C接口的AT24C01A芯片;(4)一只LED指示灯;(5)输出管脚。以上分别需要单片机片机的13、5、3、1、1个引脚,因此,单片机共要用到23只管脚。引脚数量确定后,即可初步确定主芯片的型号,这里选用40引脚的AT89C51单片机。如果编程中发现内部资源(如片内RAM

12、、ROM、定时器等)不够,可以更换为89C52等其他单片机,比较灵活。图3是电源、输出部分,从图中可以看出,仪器的输出接口采用两种方式,即集电极开路(OC门)方式和射极输出方式,其中OC门方式是很多以频率信号为输出的仪器的标准输出方式,如光电编码器、霍尔开关等。基于单片机的全数字信号发生器设计设备技术网   时间:2010-4-13全数字信号发生器的硬件部分就介绍到这里,下一期将介绍程序的编写。图2    本仪器的程序主要由键盘、显示程序、AT24C01A读写程序、信号产生程序等部分组成。以下对部分功能作一些分析。一、键盘程

13、序本仪器需要调整的数值范围较大,因此,“增加”和“减少”键必须具有快速连加和快速连减的功能,否则调整速度太慢。这种键盘可以用多种方法来实现,关键在于设计一个正确的程序结构,图1是一种实现方法的流程图。 图1流程图程序工作时,不断地扫描键盘,第一次扫描到有键按下后如常规键盘一样,进行键值处理,处理完毕,不等待键盘释放,直接退出键盘程序。当又一次执行到键盘程序,如果检测到键还被按着,就不再直接去键值处理程序,而是将一个计数器加1,直接返回主程序,如此循环,直到计数到一个定值(如500,表示键盘程序已被执行了500次),如果键还被按着,说明用户有连加(或连减)要求,程序即将计数器减去一个数

14、值(如30),然后进行键值处理。这样,以后键盘程序每执行30次,就执行一次键值处进程序,实现了第一次启动时间较长,以后快速连续动作的要求。如果检测到键已被释放,则清除所有标志,将计数器清零,准备下一次按键处理。程序开始时定义了两个常量:Qdsj和Ljsj,如下所示const  uint  Qdsj=500; /*与首次启动连加(减)功能的时间有关*/const  uint  Ljsj=30;  /*与连加(减)的速度有关*/这两个常量与第一次启动及连加、减的速度有关,具体数值应根据实际情况试验后确定。下面

15、是部分键处理程序,注意其中这两个变量的使用。void Key()/*键处理*/             if(!KeyValue)                无键按下,清除一切标志退出         &#

16、160;      if(KeyMark)     /*第一次检测到按键吗?*/           KeyCounter+;   /*不是第一次(KeyMark已是1了)*/            if(Qdsj=KeyCoun

17、ter) /*连续按着已有Qdsj次了*/               KeyCounter-=Ljsj; /*减去Ljsj次*/             KeyProcess(KeyValue,1);   /*键值处理*/      &#

18、160;                     else return     /* 如果按着还没有到Qdsj*/                else /

19、*第一次检测到有键按下*/          mDelay(10);     /*延时10毫秒*/再次检测            if(!KeyValue) 清除一切标志并返回 二、小数点的处理要在LED数码管上显示小数点,可以有两种选择,一种方式是在显示0.10.9时用小数显示,而在显示1500时不显示小数点,这种方式编程略麻

20、烦一些;另一种是使用定点的方式显示小数点,即不论是在0.10.9Hz段,还是1500Hz段,均在倒数第二位点亮小数点,这种显示方式比较简单,本机采用了第二种方式。通常,用高级语言编程时,可以用浮点型数据来表示小数,但本程序并没有这样来处理。因为单片机的资源有限,而浮点型数据的表达方式与其他数据的表达方式很不相同,无论是存储还是运算,都相当占用资源,因而在单片机中能不用浮点型数据就尽量不要使用。这里我们将所有的频率设定值扩大10倍,即所要求的频率值是0.1500Hz,但在单片机内部用15000来表示。如果频率设定值小于10,每按一次键,频率设定值就加或减1,如果频率设定值大于等于10,每按一次按

21、键就加或减10。例如,当前频率设定值为100,按一下“增加”键,该值就会变为110,相当于频率设定值由10变为11;如果当前设定值为9,按一下“减少”键,该值变为8,相当于频率值由0.9变到了0.8。在根据频率设定值计算定时常数时,只要将被除数扩大10倍即可,程序中是这样表示的: ltemp=1000000;ltemp*=10; /由于plsd被放大了10倍,故被除数也放大10倍在显示频率设定值时,点亮倒数第二位的数码管上的小数点,显示程序中有这样的程序行:if(Counter1=1) /如果当前正在显示倒数第二位时 if(!PlSl) /如果是要求显示频率   

22、DispCode=DispCode&0xbf; /*点亮小数点*/由于P0.6与小数点位相连,所以不论待显示的数是多少,该位被清零后,小数点就能被点亮。要将该位清零,只要将字形码与0xbf(10111111)相与即可。三、AT24C01A的读写AT24C01A芯片是具有I2C接口的EEPROM,由于89C51单片机没有I2C接口,因此,必须用I/O口模拟I2C时序。这里仅提供作者用C语言编写的接口程序,不对此作更多的介绍。使用这一接口程序,只要定义好写常数、读常数及根据硬件连线定义好三个引脚SDA、SCL和WP,然后直接调用读、写函数即可。#define AddWr

23、   0xa0            /*器件地址选择及写标志*/#define AddRd   0xa1            /*器件地址选择及读标志*/sbit    Sda=    P37; 

24、          /*串行数据*/sbit    Scl=    P36;           /*串行时钟*/sbit    WP=    P35;接口程序提供了多字节的读、写函数,其中读函数需要用到三个参数:用于存放读出数据

25、的数组,待读EEPROM的起始地址,字节数;写函数也要用到三个参数:用于存放待写入数据的数组,待写入EEPROM的起始地址,字节数。下面是这两个函数的用法参考:RdFromROM(Number,10,2);/从地址10H开始处读出2个字节,存入Numbre数组中。WrToROM(Number,10,2);/将Number数组中的2个字节写入EEPROM,地址从10H开始四、信号产生信号发生由定时中断0完成,在定时时间到之后,重置定时常数,接着判断究竟是较高频率还是较低频率,分别予以处理,如果是较高频率,直接取反输出端口即可返回,如果是较低频率,则要进行计数,并判断计数值是否到设定值,如果到了,

26、则取反输出端口,并清零计数器,然后再返回,这部分程序如下:void OutWave() interrupt 1 /定时0中断用于波形输出 static uint Count; /较低频率时计数用TH0=CTH0; /重装时间常数TL0=CTL0;if(HighLow) /如果是较高频率 WaveOut=!WaveOut;Mczsl+; else  Count+;if(Count>=Plcs) WaveOut=!WaveOut;Count=0;Mczsl+; 其中Mczsl是脉冲输出个数的计数值。从程序中还可以看出,每次输出只能得到波形的一半,要么高电平,要么低电平,一个完整的波形需

温馨提示

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

评论

0/150

提交评论