基于双ad574数据采集板的软件设计--毕业论文设计_第1页
基于双ad574数据采集板的软件设计--毕业论文设计_第2页
基于双ad574数据采集板的软件设计--毕业论文设计_第3页
基于双ad574数据采集板的软件设计--毕业论文设计_第4页
基于双ad574数据采集板的软件设计--毕业论文设计_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计(论文)题目:基于双AD574数据采集板的软件设计TITLE:SoftwareDesignofDataAcquisitionBoardBasedOnDoubleAD574二零一零年六月摘要随着计算机技术的发展与普及,数字设备正越来越多地取代模拟设备,在生产过程控制和科学研究等广泛的领域中,计算机测控技术正发挥着越来越重要的作用。然而,外部世界的大部分信息是以连续变化的物理量形式出现的,例如温度、压力、位移、速度等。要将这些信息送入计算机进行处理,就必须先将这些连续的物理量离散化,并进行量化编码,从而变成数字量,这个过程就是数据采集。它是计算机在监测、管理和控制一个系统的过程中,取得原始数据的主要手段。本论文主要讲述是基于双AD574的数据采集程序设计,两个不同的模拟信号通过两个AD574分别进行A/D转换,得到的值通过经过单片机控制来处理和显示。前端电路要进行相应的处理,用的是OP07进行精确的放大,转化成量程范围内的电压值,再输入到AD574中,同时单片机控制AD574的转换和读写,并将得到的数据进行处理和显示。程序设计主要思路是根据其原理电路图来编写软件程序,将重点以流程图的形式并结合实际的电路进行分析。在Keil软件调试,分析系统的调试过程出现的问题,总结出现的问题,提出相应的解决办法,最后将对该系统的整体的总结和拓展进行讲述。该设计结果是一个单独的采集模块,使用方便,快速。采集板的应用可在教学,实验,工业,林业,水利,矿山等各个部门,尤其是对于一些要求测量多个变量的设备很有使用价值,开拓了一个完整的数据采集系统,具有很广的发展前景。关键词:数据采集;AD574;串行显示ABSTRACTWiththedevelopmentandpopularizationofcomputertechnology,digitaldevicesaregraduallyreplacinganalogequipment.Inthewiderangeareasofprocesscontrolandscientificresearch,computermonitoringandcontroltechnologiesplayanimportantroleinit.However,mostoftheinformationiscontinuouslyemerginginphysicalform,suchastemperature,pressure,displacement,speedandsoon.Thisinformationisgivenwaytothecomputerprocessing,sowemustknowthecontinuousphysicaldiscreteandquantitativecoding,whichbecomedigital.Theprocessisdatacollection.Itisthecomputermonitor,managementandcontroltheprocessofasystemthatobtaintheoriginaldata.ThisthesisisbasedonaboutdoubleAD574dataacquisitionprogramdesign,thatistosaytwodifferentAD574analogsignalthroughtwoseparateA/Dconversion.ThevalueobtainedthroughaMCUtodisplayandstorage.Front-endcircuitconductstheappropriatetreatment,usingtheOP07accurateamplificationintoavoltagevaluewithintherange,andtheninputtotheAD574,conversionandmicroprocessoroftheAD574controllreadingandwriting,andtherewillbethedatastorageanddisplay.Mainideasofprogramsarebasedontheprincipleofcircuittowritesoftwareprograms,whichwillfocusontheformofaflowchartofthecircuitcombinedwithpracticalanalysis.TheKeilSoftwaredebugging,whichanalysessystemproblems,thensumuptheproblems,andputforwardthecorrespondingsolution,atlast,thisthesisdescribe.asummaryoftheoverallsystemanddevelopment.Thedesignresultisasingleacquisitionmodule,anditiseasytousefastly.Acquisitionboardapplicationscanbeusedtoteaching,laboratory,industrial,forestry,waterconservancy,miningandotherdepartments,especiallyinsomeoftherequirementsforthemeasurementofmultiplevariableswhichareusefultodevelopacompletedataacquisitionsystemwithwidedevelopmentprospects.Keywords:dataacquisition;AD574;serialdisplay目录TOC\o"1-3"\h\u17312绪论 1177310.1.数据采集的应用背景 1305840.1.1A/D模数转换器发展背景 1171980.1.2本设计基于双A/D转换器研究意义和任务 1250840.2数据采集的发展的趋势 2176510.2.1现代数据采集系统具有如下主要特点 2200590.2.2未来发展的数据采集特点 22541第一章硬件系统的分析 3173461.1硬件的整体框图 3135221.2核心硬件模块的思路梳理 365041.2.1单片机与AD574接口电路 3189501.2.2显示模块电路 6194551.3其他硬件电路模块的分析 8158181.4本章小结 810165第二章系统的软件设计 9309122.1软件的设计基础 9130942.1.1Keil51编程软件的介绍 9116662.1.2Proteus仿真软件的介绍 10273702.1.3烧写程序软件介绍 11288582.2程序的主要流程图 1268332.2.1主流程图 12193992.2.2思路介绍 1339882.3初始化子程序 1410352.3.1初始化init()的流程图 1413432.3.2思路介绍 14259292.4AD574启动和读数据子程序 14235322.4.1主要子程序的流程图 14119502.4.2编程的注意点 1665772.5单片机传送并处理数据的子程序 17183162.5.1数据处理的算法 1785842.5.2数据处理流程图 17248992.6显示模块的子程序 19206602.7中断服务子程序 22314712.8本章小结 223760第三章系统的调试 23102463.1软件调试中的硬件检查 23313343.1.1单片机能正常工作 2350023.1.2OP07输出有误差 24288873.2软件的调试 25101883.2.1函数中变量的定义问题 2587263.2.2编译时出现不可打印的错误提示 2667633.3仿真调试中的的结果及数据分析 27280983.3.1输入可调的模拟信号 27104783.3.2输入是锯齿波的信号 29228523.3.3输入是正弦信号 3065573.4系统的调试结果及数据分析 3265573.5本章小结 328541第四章系统的应用及展望 33210474.1系统的应用 33189574.2系统的展望 3323372结论 3513694致谢 3621643参考文献 3710283附录1 3811746附录2 3911746附录3 40东华理工大学毕业设计(论文)绪论1PAGE45绪论0.1数据采集的应用背景0.1.1A/D模数转换器发展背景谈到数据采集就马上想到A/D转换器,显然A/D转换器的种类很多.分类方法也很多。从A/D转换器的工艺结构来看,早期采用分立元件或某些集成电路单元组装的组件型A/D转换器已经被混合集成型或单片集成型A/D转换器所取代。单片型A/D转换器按照内部所采用的有源器件——晶体管的结构类型的不同,又分为双极型、MOS型(主要是CM0S型)和双极—MOS相容型三个类别。双极型ADC的优点是具有低噪声、大电流和电压兼容性,实践证明,有良好的稳定性。MOS型的优点是低成本,低功耗,与微处理机、存储器等兼容,存在较大的技术潜力[1]。从A/D转换器的工作原理来看,积分型ADC的主要特点是:精度较高,电路较简单,对元器件精度要求较低,易于集成,成本低,噪声小,温漂也较小,这种ADC速度都比较低,适用于一般控制用仪器仪表,便于实现十进制数字输出。反馈比较型A/D转换器内含一个由D/A转换器构成的反馈回路,在实际应用时,转换器的输入端应连接采样,保持电路,转换速率较快,一般属于中速转换器。无反馈比较型A/D转换器转换速率最高,高速ADC几乎都是无反馈比较型A/D转换器,这类转换器线路结构复杂,难以实现较高的位数[2]。∑-△型入A/D转换器是近年来出现的新型A/D转换器。它采用总和—增量调制原理,并与现代数字信号处理技术相结合,实现了高精度的模数转换。如地震数据采集系统中已普遍采用∑-△型24位A/D转换器,实现了高精度的数据采集[1]。正是有这样的一个不同时期的发展情况,使得数据采集有了不断的发展,应用的前景也相当的广泛,如:神五,神六,神七的发射,显示我国在数据采集方面已达先进水平,因此,我们要充分运用这样的优势来为社会创造更有用的价值。0.1.2本设计基于双A/D转换器研究意义和任务(1)本设计用到的双12位AD574模数转换的研究意义我们选用的是高速型的AD574芯片,该芯片几十个us时间就可实现据转换,精度也非常的高,缺点是价格有点贵,不过能有好的实验效果还是可以理解的,另外,该设计用的AD574是一种逐次逼近式的模数转换的器件,应用相当的广泛。因为该芯片的精度达到1/4096,可见比其他8位,10位的AD芯片精度高了很多。转换的时间也很快,大致25us时间进行转换,我们团队就是利用AD574有这样的优点,进行设计一个基于双AD574的数据采集板,这篇论文主要侧重于软件的设计及一些在调试过程中遇到的问题并加以分析和讨论。当然,这块采集板应用很广,可以采集温度的值,步进电机的转数值及一些物理上的应用,比如:磁滞回线试验中的磁感应强度B和激励磁场强度H的值。本设计的任务我们之所以喜欢这个题目是因为数据采集是一个很实际的问题,可以同时采集多个变量,如:采集温度,流量,液面高度等,这些足以让学生有去做这个课题的想法。下面谈谈我们设计的主要任务是设计一个数据采集板,具体要求如下:①实现多个不同的变量的数据采集,处理并显示具体的值。②输入的模拟信号能有很大范围0V~200V。③硬件上要性能稳定,尤其是在电源部分。软件上要能以好的程序实现数据采集的功能。④整体系统上要美观,小巧,使用方便,易于携带。0.2数据采集的发展的趋势0.2.1现代数据采集系统具有如下主要特点[3](1)现代数据采集系统一般都由计算机控制,使得数据采集的质量和效率等大为提高,也节省了硬件投资。(2)软件在数据采集系统的作用越来越大,这增加了系统设计的灵活性。(3)数据采集与数据处理相互结合得日益紧密,形成数据采集与处理系统采集、处理到控制的全部工作。(4)数据采集过程一般都具有“实时”特性,实时的标准是能满足实际需要;对于通用数据采集系统一船希望有尽可能高的速度,以满足更多的应用环境。(5)随着微电子技术的发展,电路集成度的提高,数据采集系统的体积越来越小,可取性越来越高,甚至出现了单片数据采集系统。(6)总线在数据采集系统中有着广泛的应用,总线技术它对数据采集系统结构的发展起着重要作用。0.2.2未来发展的数据采集特点除了继承以往的特点,未来数据采集将是在A/D转换器的位数,精度,速度。预测是A/D转换位数是24位以上,采集数据的速度几个ns时间,而且基本上都是集成在一个芯片上,只要加上电源和输入模拟值便可得到具体的数字值,然后经上位机的控制进行处理显示及存储起来,这种发展的趋势必能使数据采集更加快而且精确度更高,使用更方便。东华理工大学毕业设计(论文)硬件系统的分析第一章硬件系统的分析在本章主要涉及到的是硬件系统的分析,即在软件编程中要用到的一些控制信号需要硬件的支持,比如:AD574的时序问题,这个是非常关键的一点,往往决定是否正确的实现数据采集的功能,因此,下面将介绍一下主要的模块。1.1硬件的整体框图这个硬件整体设计大致的思路是:单片机控制两个AD574的启动和转换,并读取数据显示,存储。也就是如下图1-1所示的:显示模块和存储模块。输入信号先要经过运算放大器来切换不同的量程,即可以实现从0到200V的电压的变化,显然,这是可以实现的,只是按上一个跳线帽即可实现不同量程的切换,其电路图见附录1。模模拟输入端1模拟输入端2运算放大器1运算放大器2AD574AD574STC89C52显示模块存储模块DBDB控制控制图1-1整体框图1.2核心硬件模块的思路梳理1.2.1单片机与AD574接口电路AD574关键的引脚控制思路A0是字节地址短周期控制端,与12/端用来控制启动转换的方式和数据输出格式。须注意的是,12/端TTL电平不能直接+5V或0V连接,否则调板就有问题[16]。表1-1AD574控制信号表CER/12/A0工作状态0****不工作*****不工作10**0启动12位转换10**1启动8位转换111接+5V*并行输出12位数字111接地0并行输出8位数字111接地1并行输出4位数字我们来说说AD574的CE、和A0对其工作状态的控制过程,这些在软件编程中非常的重要。在CE=1,=0同时满足时,AD574才会正常工作,在AD574处于工作状态时,当R/=0时A/D转换,当R/=1是进行数据读出。12/和A0端用来控制启动转换的方式和数据输出格式。A0=0时,启动的是按完整12位数据方式进行的,当A0=1时,按8位A/D转换方式进行。当R/=1,也即当AD574处于数据状态时,A0和12/控制数据输出状态的格式。当A0=1时,数据以12位并行输出,当A0=0时,数据以8位分两次输出。而当A0=0时,输出转换数据的高8位,A0=1时输出A/D转换数据的低4位,这四位占一个字节的高半字节,低半字节补零。其控制逻辑真值表[4]见上表1-1。AD574的时序图的理解从图中可以看出启动的可要先初始化一下,即让控制位CE=0,=1,然后在开启,使CE=1,=0,A0=0,R/=0启动12位的A/D转换,特别注意:=0,CE=1同时满足时,AD574才处于工作状态,否则工作被禁止。编程时严格按照这种时序图来编写,当然,往往是用一位来控制开启,也就是说,可以让其他先满足,就等一个控制位成立即可。典型的方法是让CE=1,作为控制开启AD574的位。正如下图1-2所示的启动AD574的时序图。图1-2AD574启动时序图在读取数据的时候,编程关键是控制R/,A0,因为我们是输出两个8位的数据,然后进行处理数据,得到一个12位的二进制值。显然在读的状态也要保证CE=1,=0同时成立,否则也不会执行读取数据。下图1-3是读取数据的时序图图1-3读取数据时序图单片机与双AD574的接口电路系统分析:在编软件中我必须对硬件的控制信号有一个相应理解。正如下图1-5所示的图,可以看到,我们知道是通过单片机来控制双AD574的,需要注意的一点是我们硬件设计的时候用的是锁存来控制位使AD574工作,大部分资料是一种方法即用地址来控制位来锁存,通过这种方法可以说是非常的迅速,但我们编程使用的为控制的方法来实现,同样可以达到一样的目的。图1-4单片机与AD574接口电路1.2.2显示模块电路这部分是采用一个独立模块,只要4根线即可,TXD,RXD,地和VCC。对编程来说也是非常的简单,即控制SCON、TI(传送中断标志位),这个模块基本可以实现显示的问题。移位寄存器74LS164芯片74LS164是一个8位移位寄存器,当清除端(CLEAR)为低电平时,输出端(QA-QH)均为低电平。串行数据输入端(A,B)可控制数据。当A、B任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下Q0为低电平。当A、B有一个为高电平,则另一个就允许输入数据,并在CLOCK上升沿决定输出的状态。CLOCK时钟输入CLEAR同步清除输入端(低电平有效)A,B串行数据输入端QA-QH输出端[5],下图1-5是其时序图。图1-574LS164传输数据时序图74LS164硬件电路图图1-6显示数据硬件电路图谈到这里就得谈谈单片机是怎么控制的。即串行口的工作方式,编程使用方式0,SCON=0x00,串行移位寄存器方式,数据由RXD来发送和接收如图1-6,一帧信息由8位数据组成低位在前,波特率固定fosc/12,因为每个机器周期从RXD上发送一个数据。同步移位脉冲是由TXD引脚上输出的。另外想说的是传送中断标志位TI是由硬件置1,软件清0,在编程时要注意。要说明的一点是:由于硬件原计划是用串口显示,但实际只有4个数码管,我们打算用51板上的8个数码管显示,两种方法都编过程序,而且都试验过均可行。因此,不管哪种显示都是大同小异的。1.3其他硬件电路模块的分析(1)运算放大器模块主要思想是OP07运算放大器使输入从不同的量程0~200V,输入到AD574中,我们是通过两个OP07和经过电阻分压的方式的到不同的范围,分别是0.5V,10V,20V,100V,200V,这些都可以实现。(2)稳压电源模块主要思想是用7805来产生5V的电压,在1脚和3脚接一个0.33u的极性电容,在2脚和3脚接一个0.1u的无极性电容。(3)存储模块主要的目的是利用HY62256芯片的外部存储器,通过地址把数据发到地址线上,可以拓展到32K的空间因为是15根地址线,所以是32K的储存空间。(4)小结这部分主要是大致讲一下思想,可以让我在软件编程中掌握相关调试可能出现的问题,以便早点解决碰到的问题。1.4本章小结在本章中主要是从系统的硬件控制信号出发,分别讲述几个主要的核心部件,当然我主要是从事写软件的,硬件也进行了相应的分析,确实发现了不少的问题,比如:单片机为什么烧不进程序等一些问题。软件方面我也有许多不足的地方,在四月份调试板的时候,一直出现AD574没有工作,我想:软件的编程是最大的原因没调出,即是时序为真正的理解,导致花了好长时间来调试板,这些将会在软件的硬件调试中谈谈自己想法。另外,在显示模块中,还用了一般的显示方法进行了仿真,即是用位和段控制的方法进行编程,效果同样是不错的。东华理工大学毕业设计(论文)系统的调试第二章系统的软件设计该系统用的双AD574进行的数据采集,即实现的目的是:能够同时进行数据转换,显然这是能够达到的。但处理和显示则需要分开来工作,用的是外部中断0,1的数据处理方法,分时进行处理和显示,具体的软件程序见附录3。2.1软件的设计基础2.1.1Keil51编程软件的介绍[6]KeiluVision是德国Keil公司开发的基于Windows平台的单片机开发软件,在全球广泛使用,它是一种基于SPICE仿真引擎的混合电路仿真软件。它不仅能仿真模拟、数字电路,以及模数混合电路,更具特色的是它能够仿真基于单片机的电子系统.它完全支持MCS-51及其派生系列单片机的设计系统。

uVision支持8051的所有Keil工具,包括C编译器、宏汇编器、链接器/定位器和目标文件至HEX格式的转换器,其中KeilC51是一种专门为单片机设计的高效率C语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储器空间极小,完全可以与汇编语言媲美。KeiluVision2是目前使用广泛的单片机开发软件,它集成了源程序编辑和程序调试于一体,支持汇编、C、PL/M语言。在这里我们简单的介绍一下他的应用方法如下:首先从菜单的“工程”中“新建工程...”如下图2-1,建立我们将要做的工程项目,新建的工程要起个与工程项目意义一致的名字,可以是中文名;我们这里用Test,并将Test工程“保存”到C:\Keil下:图2-1软件编写平台(2)Keil环境要求我们为Test工程选择一个单片机型号,我们选择Atmel公司的89C52[17],“确定”后工程项目就算建立了。(3)点击“文件”中的“新建”,新建一个空白文档,这个空白文档就是让我们编写单片机程序的场所。在这里你可以进行编辑、修改等操作。(4)写完后再检查一下,并保存文件,保存文件时,其文件名最好与前建立的工程名相同(当然这里为Test),其扩展名必须为.C(特别注意)“文件名”中一定要写全,如:Test.C。(5)鼠标右键点击“SourceGroup1”,在弹出的菜单中选“增加文件到组SourceGroup1”,向工程添加了源文件后,鼠标右键点击“TarGet1”,在弹出的菜单中选“目标Target1属性”在打开的话框中,选择“输出”选项卡,在这个选项卡中,“E生成HEX文件”选项前要打勾,按“确定”退出。(6)最后,从菜单的“工程”中执行“R重新构造所有目标”,在工程文件的目录下就会生成与工程名相同的一些文件,其中大部分文件我们并不必关心,而生成的hex文件是我们需要的,还会出现程序是否有问题,改到没有问题为止。总之,我们用Keil这个软件进行编译,编译后可以显示出错的地方,同时可以双击下面对应的信息可以得到你出错的地方,然后再对应去修改程序,直到修改成功为止,并转为HEX文件,方便烧写程序,实用性很强。2.1.2Proteus仿真软件的介绍Proteus(海神)的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统[7],具体的软件界面如下图2-2。图2-2软件仿真平台该软件的特点[7]:①全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。②具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS-232动态仿真、C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。③目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。④支持大量的存储器和外围芯片。总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大,可仿真51、AVR、PIC。另外,Proteus组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。此系统受益于多年来的持续开发,被《电子世界》在其对PCB设计系统的比较文章中评为最好产品—“TheRoutetoPCBCAD”。Proteus产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。其功能模块:—个易用而又功能强大的ISIS原理布图工具,PROSPICE混合模型SPICE仿真,ARESPCB设计,PROSPICE仿真器的一个扩展PROTEUSVSM,便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LED甚至LCD显示,CPU模型,支持许多通用的微控制器,如PIC,***R,HC11以及8051交互的装置模型,包括:LED和LCD显示,RS232终端,通用键盘,强大的调试工具,包括寄存器和存储器,断点和单步模式,KeiluVision2等开发工具的源层调试,应用特殊模型的D提供有关元件库的全部文件。2.1.3烧写程序软件介绍我们用的是典型的烧写软件[8],通过串口来把程序传送给单片机,这种软件提供了几种烧写不进的方法,也可说是解决的办法。一是换一根串口线;二可以停止烧写,重新下载烧程序,同时单片机也要再次上电;三是可能要使P1.0或P1.1置一下低电平,在重新烧写程序;四是我们外部晶振未接好,单片机没有工作。下图是烧写程序的软件界面(如图2-3):图2-3烧写程序平台从上图可以知道,我们仅仅只用到烧写的一部分,还有串口的调试助手栏,设置波特率等问题,当然是考虑到广大的用户而设计的软件,使用更加方便。2.2程序的主要流程图2.2.1主流程图该程序设计主要有以下几个函数:voidinit();//初始化控制信号和开中断voidstart();//启动AD574voidDelay(uint);//延时函数voidData_Handle(uint);//处理并显示AD574的数据voidDisplay(uchar);//显示不带点的函数voidDisplayD(uchar);//显示带点的函数uintAd574_1();//读第一个AD574的数据uintAd574_2();//读第二个AD574的数据设计的流程图如下图2-4:开始初始化子程序init()启动AD574子程序start()flag0==1?flag1==1?读取第一个AD574的数据,并返回数据dat1=AD574_1()第二个AD574的数据处理Data_Handle(dat2)第一个AD574的数据处理Data_Handle(dat1)读取第二个AD574的数据,并返回数据dat2=AD574_2()NYYN 图2-4主流程图2.2.2思路介绍本程序主要设计的思路是用两个中断来控制是否转换完成,即我们用的是标志位来判断,在中断中让标志位置1,在主函数中进行判断,如果是有标志位为1,说明转换已经完成,可以开始读数据了,接下来,我们便可以进行数据的处理和显示,经过仿真达到预期的效果。该流程整体的思路很清晰,简而言之是将AD574转换得到的数据用数码管显示,同时,若有必要的话可将其存入存储器中,中断的作用是就可以自动的判断,因为我们将其标志位进行了处理,可以达到其效果。2.3初始化子程序2.3.1初始化init()的流程图如图2-5初始化流程图初始化子程序init()AD574的控制位CE=0,CS=1AD574的控制位CE=0,CS=1开总中断及外部中断0,1IT0=1,IT1=1表示下降沿触发返回图2-5初始化流程图2.3.2思路介绍初始化程序主要是使开中断,AD574的控制引脚CE=0,=1,使其没有在工作状态,同时采用下降沿触发的方式,即让IT0=1,IT1=1。2.4AD574启动和读数据子程序2.4.1主要子程序的流程图(1)启动子程序流程图启动的方法是“同时”启动的,这里的“同时”是指相差几个us时间,若真的要完全同时启动也可,即可已让两个AD574的控制引脚接在一起,然后通过控制位的方法来使单片机来工作,实际上,我们忘记考虑一个东西,我们的读的数据是在同一个口数据,极易发生数据冲突的问题,所以我们还是分时启动,但是有一点:我们可以实现一个AD574在工作,另外一个也在工作,可以认为是在同时采集数据,读数据的时候我们是根据中断的标志位来处理数据。其流程图(如图2-6)如下:启动两个AD574start()第一个AD574控制引脚CS=0,A0=0,R/=0,CE=1第一个AD574控制引脚CS=0,A0=0,R/=0,CE=1第二个AD574控制引脚CS=0,A0=0,R/=0,CE=1返回图2-6两个AD574启动流程图在编启动的程序时特别注意是延时的问题,一般来说,必须使CE和同时有效,而且要求R/为低电平,如果R/为高电平,会立即执行读操作,可能导致总线冲突。我们通常用CE做为启动信号,400ns过后,STS会变高,在经25us时间,STS的电平会变低。(2)读数据子程序流程图以第一个AD574为例,由中断服务子程序使标志位置1,在主函数便进行出数据的读取和处理,核心在于如何将两个8位的数值编程为12位二进制的数值,显然我们还是用简单的方法便可求出,从流程图中可以发现可以发现具体的方法,在这里我得介绍一下这个函数#include<intrins.h>常用的函数有:_nop_(uint),_cror_(uchar,uchar),_crol_(uchar,uchar)[6]。我们在用的是第二个函数,即:右移位。本质上相当直接除以2的多少次方,有异曲同工之妙。读取数据模块的流程图如下图2-7:flag1=1,表示AD574数据已经转换完成控制CE=1,A0=0,=0,flag1=1,表示AD574数据已经转换完成控制CE=1,A0=0,=0,R/=1,读取高8位数据并放在datah_1中A0=1,读取低4位数据,并放到datal_1=P0将两个数据合成一个数据Dat=datah_1*16+_cror_(datal_1,4)return(dat),返回数据图2-7读取数据模块流程图2.4.2编程的注意点我们在编这个启动和读数据最好可以放在一个程序中,但我们在这用的是中断,在标志位中判断是哪个AD574转换完成,在读的过程中必须要有CE和同时有效,而且R/为高电平时开始进行读的操作,注意:R/必须在CE和同时有效前至少提前150ns的时间变高电平。之后便是处理由两个8位数据来得到12位的数据,我们分别对高8位乘以16,低8位可以右移4位即可,然后加起来便可得到最后的值。这里写程序有两种方法来写控制信号。一种是用地址来读写控制信号的数据[6],比如:#defineadstsxdata[0xfff];另外一种是将其每一个控制信号用相应的符号来表示,并且通过锁存器来锁存[6],比如:sbitcs1cs,即可用cs1=0来控制。两种方法都可以,前者有地址重复的现象,只要写其中的某一个即可,后者是每条语句的编写,更好理解,因为涉及的控制信号大多数是一条。2.5单片机传送并处理数据的子程序2.5.1数据处理的算法该部分程序主要是单片机处理数据以便显示,其思路是:我们要使数码管显示具体的电压值,可实际上是一个具体的二进制的数,因此必须要有一个软件的处理方法使其得到最终的目12位的AD574,最小是0,最大是4095,有4095份,量程是10V,故每一份对应的电压值应该是:10/4095v=0.002442002442v,显然四舍五入取0.002442v,因为我们显示只有4个数码管故是我要把它编程一个4位的整数,只是要加点和不带点的问题,这就好办多了。因此,我们将得到的二进制数乘以0.002442即可,殊不知我们单片机控制的显示只知道整型,不会处理这样的多个小数点啊!那该怎么办呢?我们的方法是将其值变整型,然后还原。即每一份0.002是我们的目标,注意,其每个0也看成整型,2就更不用说了,显然是整型。我们不妨用DATA表示从AD574中得到的二进制的值,M表示是送到显示的值,让其显示具体的电压值。公式:M=(DATA*2442)/1000验证:DATA=0X0FFF=4095(12位的AD574最大值)M=(DATA*2442)/1000=(4095*2442)/1000=9999990/1000=9999.990可见这种方法的准确度不是非常高,若高的话应该在9999.999999V,因为最大便是10.000000V啊!我们这种算法最大可到9999.990,实际单片机只知道是9999,后面的小数忽略掉了,但我们别忘了,我们还要还原成电压值。即:得到9.999V才是我们真正的目的,这个问题的方法是用带点的显示和不带点的显示即可,问题便迎刃而解。2.5.2数据处理流程图数据处理流程图(如图2-8)主要的目的是:为显示服务。说白了,如不要显示这部分可以不用,但是我们的目的是面向用户,不仅仅能实现对应得功能,更应该是与用户的一个交流情况,让用户更加直观的知道我们仪器的实际测试的效果。数据处理子程序将返回的值乘以2442,然后除以1000得到整型值用data_qian=m/1000,data_bai=m%1000/100,data_shi=m%100/10,data_ge=m%10,分别得到将返回的值乘以2442,然后除以1000得到整型值用data_qian=m/1000,data_bai=m%1000/100,data_shi=m%100/10,data_ge=m%10,分别得到个,十,百,千位的值Display(wei)返回图2-8数据处理流程图说明的几点问题:(1)Dispiay()处理的数据要调用其4次,即有Dispiay(data_qian),Dispiay(data_bai),Dispiay(data_shi),Dispiay(data_ge)。(2)具体的程序如下:voidData_Handle(uintn) //数据处理{ uintdata_ge,data_bai,data_shi,data_qian;ulongm;mm=(m*2442)/1000;//这样算是便于显示结果,且单位为vdata_qian=data_1/1000; data_bai=data_1%1000/100;data_shi=data_1%100/10;data_ge=data_1%10;Display(data_shi);Display(data_ge);SCON=0x00;SBUF=table_2[data_qian]; while(TI==0); TI=0; Display(data_bai); }(3)以上是原计划根据软件编程写的串口显示,实际中我们考虑到串口显示只有4个数码管,所以用了51板上的8个数码管。思路上没有太大变化,只是在编程的时候用段和位来控制,这一切都可实现。单片机处理的数据用的是P0口的来控制和传送数据,要有上拉电阻[8],这样才能有输出的控制信号正常的,即属于TTL高电平,我们团队当时因时间的关系未考虑全面,在制作板的时候未加上拉电阻,导致没有正常的结果。另外用了锁存器来控制信号,使其保持一段的时间,当需要另外的控制信号时,可以开锁存器,即是直通的方式,然后在锁存。2.6显示模块的子程序(1)流程图该子程序目的即是实现数据显示,SCON=0表示是用同步移位的方式,因为SM0,SM1均为0,表示是方式0,另外,TI=0,发送中断标志位,该位在方式0中,串行发送完第8位数据后,由硬件置位,但必须软件清0,这是任何方式都需要的。单片机复位时,SCON中的所有位均清0[9]。其对应的查表如下:ucharcodetable_1[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//不带点0~9ucharcodetable_2[]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//带点的0~9下图2-9是其具体的流程图:串行口显示子程序使串行口控制寄存器使串行口控制寄存器SCON=0从table_1[wei]中取出对应的数据从table_1[wei]中取出对应的数据TI==0?YTI==0?YNN软件清0,使TI=0软件清0,使TI=0返回返回图2-9显示字程序流程图其程序如下:voidDisplay(uintwei)//显示程序{SCON=0x00; SBUF=table_1[wei]; while(TI==0); TI=0; } (2)说明几个问题显示的方式由很多,如LCD液晶显示,编程比上面的程序就难了些,我们这只要几条语句就可。另外一点是,C51的编程的优点也就体现出来了,简单、方便,易于理解。(3)值得说明的是在仿真的时候,我们用的是数码管显示,一些控制引脚也用变化,主要是考虑能实现对应的功能即可。其查表如下:ucharcodeData_duan1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3e};//共阴极,显示0~9和UucharcodeData_duan2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带点的0~9ucharcodeData_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制本质上来说都是一个,串行显示是通过发送一个8位的数据来显示,而在仿真的时候用的是位和段的控制,采用动态的显示方法,定时的对显示器器件扫描,这种方法分时工作,每次只能显示一个,但人眼有视觉暂留现象,所以,只要扫描频率足够快,仍然感觉所有的器件都在显示,显然,这种方法也是相当不错的。(4)正如上所述,我觉得在51板上的显示也比较简单,思路如下:先送段的数据,再送位的数据,在第六,七个数码管显示是第几个AD574显示的值,有一个判断方法是,在读数据前有一个标志位使其k=1表示是第一个AD574数据,在显示的时候可以用此标志未来判段,下图(不带点数字流程图一样,只是查表不同)是显示带点数字的流程图(如图2-10)。DisplayD(uint)P0=0duan=1使锁存器P0=0duan=1使锁存器直通P0=Data_duan2[shu2]duan=0P0=0xff返回图2-10带点的显示流程图这里我在说明一下,串口显示与数码管显示思路虽有所不同,但核心未变,都是控制位和段。显示模块总体来说是用的串口来传数据,即单片机的TXD(31脚),RXD(30引脚),控制方式SCON=0X00,说明是同步移位的工作方式,在用的C51程序我们用的显示很简单,用74LS164串行输入转并行输出的方式到数码管中,其具体的数据表是一个是不带点的,另外是带点的显示。程序中只要查表即可找到对应的显示值。2.7中断服务子程序我们用的是外部中断0,1来处理两个AD574的数据采集问题,中断开启后,中断没来之前,该中断不占据单片机运行时间,提高利用率[10]。即是用两个标志位来判断下面我将其流程图(以外部中断0为例,如图2-11)叙述如下:中断服务子程序flag0=1中断返回flag0=1中断返回图2-11中断服务流程图中断只实现标志位的置位,然后在主函数中的判断该标志位是否为1,若是,则开始读数据即可,若不是,则执行下一个程序,切记:在主函数中别忘记把标志位清零,否则,可能会出现问题。2.8本章小结本章重要是从软件设计的思路上来叙述,通过各个子程序的流程图的介绍,同时说明这样设计的目的和原因,在这编程的过程中,我觉得最好的模块是数据处理和中断的处理模块,原因是所用的算法有点技巧,尤其是中断部分,我编程是双AD574的数据处理,要知道,这种是很容易造成数据冲突的,都是用P0口,更何况在控制信号中又有P0口的控制,所以我用一个标志位来判断,即来了一个中断便让标志位置1,主程序中便检查该标志位是否为1,若是则执行读的操作,若不是,则判断下一个AD574的标志位是否为1,若是,则执行对应读的程序,若不是,返回,继续初始化程序,从而不断的进行数据采集和显示,达到我们的最终目的。第三章系统的调试3.1软件调试中的硬件检查3.1.1单片机能正常工作刚开始我在调试这块板的时候便碰到这个问题,当时想有以下几个原因造成这种情况。晶振没工作,或者是并联的电容未起到起振的作用,即电容烧坏了;复位电路未起作用,这个也是关键的一点;MAX232芯片出问题及其对应的外围电路(比如电容的极性)接错;单片机的管脚的电平被其他的芯片拉高或变低;从各个可能出的问题来看,晶振不起振的可能性不大,(1)这种情况排除。复位电路的检查果然发现有问题有一端的线没接上导致复位电路没起做用,图3-1如下:图3-1单片机复位电路如上图所示:1,2两个标注的地方的线当时因画板的时间的原因导致复位电路没画好,结果使复位电路的电压没达到指定的值,另一方面,复位的时间大致是时钟周期的24倍才可以,往往这些细节很难考虑到的,不忽视即可。之后,用万用表测量发现复位电路正常,但此时依然烧不了程序,可能还有其他的问题没解决。接下来便是MAX232的芯片及其外部电路是否有问题,结果发现问题没有,电容的极性都正确,这个情况排除。最后便是单片机的问题,即可能是芯片坏了,但发现在其他的地方(51板)能正常工作,那就没办法了,电路都正确了,那还有什么问题呢?在这个问题上大致发了几个星期的时间最终才解决出来了。出问题的原因是单片机的控制脚31/VDD接地了,我们可从上图中看出(当时是考虑到外部的存储问题,将31脚接地)其实是要接+5V的电压。该引脚可以说是片外程序存储器,当为低电平时只选用片外程序存储器,否则计算机复位或上电后先选用片内程序存储器[2]。3.1.2OP07输出有误差该部分我测试的是调零工作。其出现的情况是:输入2,3脚均是0V,4、7脚按说明书上分别正确接-15V,+15V,结果输出结果是-13V左右,当时其他的同学也有类似的问题,其原因何在呢?1、8脚是调零的端,可接上可调电阻使之输出为零,可问题是,输出值太大了,想调零也几乎不大能啊!下图是当时接的电路图3-2,简化如下:图3-2op07电路图如上图,我用Ui=0V,输出是很大的值,经查阅相关的资料,这是一种过零比较器[11],集成运放工作在开环状态,其输出电压为+Uom或-Uom,当输入电压Ui<0V时,Uo=+Uom;当输入电压Ui>0V时,Uo=-Uom;因此得到的值将近为上述的-13V的值,其输出特性如图3-3所示。图3-3开环的输出特性图可见,在上图中知道:其输出的电压值必定是很大的值,即要引入反馈才能达到具体的效果。图3-4射极跟随器图实际的电路图设计的射极跟随器如上图3-4所示,经测试可以达到预期的效果。其实,现在来想想这些问题,觉得是一般的问题,并不是涉及很深奥的东西,我想这些都是些基础的知识点,只是我们平时不怎么加以重视而造成的,因此,不管是多么简单的知识要经常地看看,俗话说:温故而知新。只有把基础的东西把握好,更难的问题也能够更好的解决。3.2软件的调试这部分主要使涉及到在编程过程中碰到的问题,下面一一叙述如下。3.2.1函数中变量的定义问题voidData_Handle(ulongdata_1) //数据处理{ EX1=0;//关中断 uchardata_ge,data_bai,data_shi,data_qian;data_1=data_1*2442/1000;//这样算是便于显示结果,且单位为vdata_qian=data_1/1000; data_bai=data_1%1000/100;data_shi=data_1%100/10;data_ge=data_1%10;Display(data_shi);Display(data_ge);SCON=0x00;SBUF=table_2[data_qian];while(TI==0);TI=0;Display(data_bai); }我们调试该程序发现如下错误:compilingAD574第一个测试程序.c...AD574第一个测试程序.C(41):errorC141:syntaxerrornear'unsigned'AD574第一个测试程序.C(41):errorC202:'data_ge':undefinedidentifierAD574第一个测试程序.C(44):errorC202:'data_qian':undefinedidentifierAD574第一个测试程序.C(45):errorC202:'data_bai':undefinedidentifierAD574第一个测试程序.C(46):errorC202:'data_shi':undefinedidentifierAD574第一个测试程序.C(47):errorC202:'data_ge':undefinedidentifierAD574第一个测试程序.C(48):errorC202:'data_ge':undefinedidentifierAD574第一个测试程序.C(49):errorC202:'data_shi':undefinedidentifierAD574第一个测试程序.C(50):errorC202:'data_bai':undefinedidentifierAD574第一个测试程序.C(52):errorC202:'data_qian':undefinedidentifierAD574第一个测试程序.c-10Error(s),0Warning(s).申明的一点是uchardata_ge,data_bai,data_shi,data_qian;已经完全定义好了,显然是毋庸质疑,那为什么会有这钟编译结果呢?错误原因是:第一条语句的EX1=0应该写在uchar的后面才行,处理的语句不应该写在定义变量的前面[12],因此会造成这样的结果。3.2.2编译时出现不可打印的错误提示编译后电脑出现的显示(如图3-5)是:图3-5调试出错图我们编程当时用的是查询的方式来进行,而我们编程时出现这种unprintable,造成原因是我们在编程时用的中英文切换不对,特别是在用注释的时候,更要注意,另外一点是我们要养成良好的编程习惯,要有明晰的层次感。3.3仿真调试中的的结果及数据分析3.3.1输入可调的模拟信号模拟信号是输入一个可变的电压值,然后再进行数据采集的。仿真调试的图见附录2中的图1,数据(表3-1)如下:次数12345678910U1(V)0.593371.078882.032563.055544.000485.14446.118087.02328.180129.29515显示值0.5931.0792.0313.0574.0045.1456.1177.0238.189.94表3-1输入可调电压U1模拟信号从上面的数据可以看很出:误差最大为:(2.03256—2031)/2.03256*100%=0.00156/2.03256*100%=7.675e-4=0.07675%,误差是很小的。在用EXCEL生成了的一个图如下:图3-6输入模拟信号的图像显然,这两组数据是基本上重合,看图基本上分辨不出,可见,在仿真的数据是非常准确的。仿真U2的电压也是模拟输入,其得到的电压值如下:表3-2输入可调电压U2模拟信号次数12345678910U2(V)0.6911.07882.0323.9085.04845.29216.928.0729.0579.94显示值0.6911.0792.0313.9095.0475.2916.928.0739.0579.94在EXCEL工作表中得到的波形是:图3-7输入模拟信号实际的图像从上图中看出:这里有一个数据误差较大,分析如下:在软件仿真的时候本身就有误差,毕竟不可能整除完,我们可以稍微算一下,因为10/4095=0.002442002442……是个无限循环小数,我取的值是0.002442,显然,没有原来值那么大的,那么,我们来看看误差最大的是多大。第六个点误差最大,从图中一眼可以看出误差是:(5.2921-5.291)/5.2921*100%=0.0207%误差比上一个采集的数据误差大,但总体来说还是可以理解的。即:本质上要提高系统的精度措施。实际上,在硬件电路上误差是更大的,本身在模拟部分可以说是以被“污染”[2],原因如下:信号调整电路中的非线性由于对ADC前信号调整电路的非线性估计不足所致,实际上对ADC前的运算放大器,测量放大器仔细分析之后,可以发现它们很容易构成0.01%或更大的误差。动态响应引起的误差由于没有注意动态响应引起的问题。许多ADC输入阻抗在转变过程中是变化的,这样会影响提供的输入信号。为此可以在ADC前加一级具有单位增益的缓冲器来改善ADC受动态响应的影响。接地与去耦的不当由于接地去耦不当而降低了输入信号的精度。就AD574来说就有两个地,一个是模拟地,一个是数字地。处理好接地的问题对保证A/D的转换精度有重要的意义。3.3.2输入是锯齿波的信号其类似图见附录2中的图1,然后再进行数据采集的。记录的数据(表3-3)如下:表3-3输入是锯齿波的信号次数12345678910电压值8.5888.1927.7977.4017.0036.2125.8165.4214.633.838次数11121314151617181920电压值2.6491.8581.0640.6690.2739.8888.9798.5837.7896.998次数21222324252627282930电压值5.8944.6223.8312.6421.4521.4521.0570.6610.2660输入是标准的锯齿波信号,实际仿真是0-1V的,我们经过OP07放大10倍,得到0-10V的电压,如下图3-8,纵坐标是电压值(v):图3-8输入锯齿波信号的图像注明:这里横坐标写次数是不很准确的,应该写时间才更为妥当,只是便于与实际上图形对比,所以,在横坐标上写次数。另外,如果是1HZ测的数据是不非常准确的,是经过验证,即:要把频率小于0.1HZ,才可有很好的效果,因为采样的频率必须大于输入信号频率的两倍以上,最后便是。在输入为锯齿波情况下,经EXCEL可得到如下图3-9:图3-9输入锯齿波信号实际的图像数据的分析如下:从两个图形来看误差是很大的,但大致的变化趋势可以一眼看出是正确的,出现有误差的原因是:采集的数据不是很全,毕竟我们手工记录的数据才30个,往往这种是要记录上百个的,然后分析该数据是不是该剔除,我在这一方面并没有过大的考虑,因为我这是用仿真的效果,所以默认是较为准确,若出现大的误差,那只能是说软件的问题,当然,我编程人员也要多考虑这个问题,使我们的整个硬件和软件达到最佳的效果。3.3.3输入是正弦信号这个仿真图与锯齿波一样,可参考附录2的图1电压值是从0-1V,经过运算放大器放大10倍,可以得到0-10V的电压值,具体记录的数值如下(表3-4):表3

温馨提示

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

评论

0/150

提交评论