1、第十一章 数字,IO,11.1,数字,I/O,的基本概念,11.2,立即型,DI/O11.3,定时型,DI/O11.4,缓冲型,DI/O 11.5,计数器基础知识,11.6 Easy I/O Counter VI11.7,其它有用的,Counter VI,第十一章 数字,I/O,11.1,数字,I/O,的基本概念,一般数据采集卡上都有,DI/O,功能,用来实现数据采集的触发、控制及计数等功能。,DI/O,按,TTL,逻辑电平设计,其逻辑低电平在,0,到,0.7V,之间,高电平在,3.4,到,5.0V,之间。数采板上多路,(Line),数字,I/O,组成一组后被称为端口(,Port,)大部分端口
2、由,4,路或,8,路数字,I/O,组成。许多数据采集卡要求一个端口是单向的,即要么是输入线,要么是输出线;也有一些卡一个端口的数字线可以是双向的。数字,I/O,分为两类:立即型(非锁存型)和定时型(锁存型)。,LabVIEW,中关于,DI/O,的,VI,也分为低、中、高三个等级。易用,VI(Easy,DI/O VI),用于较简单应用中的。在,Digital I/O,的第一层。高级,VI(Advanced,DI/O VI),用于作为创建其他数字,VI,的基本模块。在,Digital I/O,子模板的右下角。这些高级数字量,VI,可用于立即型,DI/O,和定时型,DI/O,。,中级,VI,用于需要
3、时间或握手线方面的数字信号应用,除易用,VI,和高级,VI,外的其余子模板。,11.2,立即型,DI/O,11.2.1 Easy,立即,DI/O,立即型,DI/O,是用得最普遍的一种数字输入输出方式。在这种方式下,使用,Easy I/O digital VI,,可以立刻输入或输出某一路的数字量。,Write to Digital Line,设置某一端口中某一路,DI/O,为逻辑高或者逻辑低状态。,Device,:是数采板的设备号,(device number),;,Port number,:是该路,DI/O,所在的端口号;,Line,:准备要写的该路,DI/O,的通道号;,Line state
4、是指准备要写的该路,DI/O,的状态:开,(true),、关,(false),;,Port width,:要访问的数字端口共有几位;,Iteration,:循环数。连接到一个,while,循环的循环数端口,当,Iteration,0,时对硬件进行设置,以后就使用已有的设置,优化程序性能。,Read from Digital Line,读取某路,DI/O,的状态。参数说明同,Write to Digital Line,。,Write to Digital Port,向某一指定的端口写一数字量,从而同时设定某一端口所有路,DI/O,通道的状态。其中,Pattern,是该端口要写的二进制或等同的
5、十进制数字量。其它参数说明同,Write to Digital Line,。,Read from Digital Port,读取某一指定端口所有路的,DI/O,通道的状态。,Pattern,是返回从该端口读取的数字量(十进制形式)。其它参数说明同,Write to Digital Line,。,注意:当你只调用一个,Easy I/O digital VI,实例读或写某个通道或端口时,程序是不会出错的。但是当再次调用函数时会通过改变移位寄存器的状态来重新改变,DI/O,的设置,故你不能调用多个,VI,实例来控制多个端口。在这种情况下你可以通过使用下面将讨论的高级,VI,来达到该目的。,11.2.
6、2 Advance,立即,DI/O,使用高级,DI/O VI,也可以执行立即型,DI/O,。(实际上,,Easy I/O VI,是由多个高级,VI,所组成的)。使用高级,VI,你可以更高效的执行数字,I/O,的读写工作,因为当你调用高级,VI,时,它不会象使用,Easy I/O VI,那样每次运行时都需要去改变数采板的设置。高级,VI,允许你使用通道屏蔽技术更新某一端口中数个,DI/O,通道,而无须更新整个端口。根据高级,VI,提供的错误信息你可以用来开发出自己错误处理程序。这些高级,VI,可用于所有带有数字量输入输出的,NI,数采板。,DIO Port,Config,设置某个端口为写或读状态
7、Device,和,port number,设置板卡的设备号与端口号;,Line direction map,设置端口为输入或输出状态;,task ID out,的输出将用于下一,VI,函数做为创建了一任务的唯一标识。,DIO Port Write,根据已创建任务的标识,taskID,立即更新端口的,DI/O,通道状态。,pattern,输入的是一十进制数,当其换算为二进制时代表的是要更新的各路,DI/O,通道的状态。举个例子来说:若设,pattern,为,1,(二进制,0001,)那么将仅只设通道,0,为高电位,若设,pattern,为,15,(二进制,1111,)那将设通道,0,,,1,
8、2,,,3,为高电位。,使用,line mask,输入,你可以仅只改变你指定的,D/IO,通道状态。,line mask,输入的是一十进制数字,该数字的值决定了那一个,DI/O,通道的状态被更新。举个例子来说:若,line mask,设为,1,(二进制,0001,)那么只有通道,0,被更新,若,line mask,设为,15,(二进制,1111,)那么通道,0,,,1,,,2,,,3,状态将被更新。未被包含在,line mask,中的通道其状态将不会被改变。下图显示的两个例子就是使用,line mask,来控制端口中那路,DI/O,通道状态会被更新。你可以使用,Scale By Power
9、 of 2,函数来选择单路通道或输入一十进制数直接选择多路通道。,在图,a,中,,pattern,值设为,8,(二进制,1000,)时,通道,3,将会被更新。在图,b,中,,pattern,值设为,6,(二进制,0110,)时,通道,1,,,2,将会被更新。假如你已设定该端口为输入状态,那么,error out,将会返回一个错误代码。,DIO Port Read,根据已创建任务的标识,taskID,来获得端口的,DI/O,通道状态。,pattern,返回的是一十进制数,当其换算为二进制时代表的是各路,DI/O,通道的状态。使用通道屏蔽技术你可以返回指定的通道状态,未被包含在,line mask
10、中的通道其状态将在,pattern,的返回值中被设为逻辑低(也就是,0,)。,11.2.3,立即,DI/O,应用,立即型,DI/O,主要应用于:控制或监测继电器,作为计数器,Gate,口的输入或者用于其他,TTL,设备。例,11.2.1,用,Easy I/O VI Read from Digital Line,来监测一外部开关的状态,关闭该开关后即初始化,LabVIEW,测试程序。其硬件配置如下图:,在如下程序框图中,,Read from Digital Line,连续不停的读取端口,0,的第,0,路通道的状态直到该通道状态为,TTL,逻辑低(当开关关闭时),该,VI,退出,While,循环
11、然后运行下一测试子,VI,。,Read from Digital Line,设置端口为输入状态。,11.3,定时型,DI/O,定时型,DI/O,也叫做锁存型,I/O,,用来使用外部信号控制或作为握手信号的数据传输。握手信号确保了在操作之前数采板或仪器已准备好了传输数据。下面是使用握手线传输数字量的高级,VI,:,Digital Group,Config,VI,设置使用的,device,和端口。,port list,组成一组端口。,task ID out,用来作为识别任务的标号。,group,是指已有一组端口,那么新设置将会替代已有的的设置。,group direction,指定了组中的端口的
12、方向。当该组支持握手线时,handshaking,返回值为,1,,否则为,0,。,Group Write VI,根据,task ID,任务标识执行数字量的输出。,Opcode,:设定传输是否使用握手线。,Pattern list,:一准备被输出的一维数组。,time limit,:设置传输时所分配的最大的时间。假如数据传输未在一定的时间内完成,函数将返回一个警告信息。,patterns written,:输出将返回更新组,(Group),后的组数。,Group,Read VI,根据,task ID,任务标识执行组内端口的数字量读取。,Opcode,:,输入端确定数据传输是否使用握手线。,Num
13、ber to read,确定是那一组输入被执行。其它参数设置同,Digital Single Write VI,。,例,10.3.1 PC-PC,数据传输 在两台装有,DIO-32F,数采板的计算机来完成,PC-to-PC,的数据传输。,REQ,与,ACK,线分别用于输入与输出的握手线信号。当,REQ,线上接受到信号后,数采板就会执行一次数据传输。当执行完传输后数采板会在,ACK,线上发出一个脉冲。这样就可以保证数采板间数据传输的同步性。,LabVIEW,框图,(,输出数采板、输入数采板,),11.4,缓冲型,DI/O VI,Digital Single Read,与,Digital Sing
14、le Write VI,的执行是同步的;当它们被调用后直到完成期间,其他,LabVIEW,过程是不会被执行的。这种方式对于短急信息的传输来说是非常有效的,但是当你想传输长数据流时就有可能长时间的占用计算机的资源。,因此,在需要大数量的数据传输,通常使用非同步中断驱动式传输。这样不至于在传输数据时占用计算机的资源。使用这种方式传输数据时,计算机内存缓冲被分配为后台线程输入或输出缓冲中。,中级,DI/O,模板中包含了用于建立数字量信号发生的,VI,。下表给出了缓冲式数字,IO,程序设计的顺序。,DIO,Config,:设置端口为输入或输出模式;创立数据缓冲,产生任务唯一标识符供后面的,DIO,函数
15、使用。,DIO Start,:启动缓冲式,DIO,操作。设定更新或读取的点数,当输入,0,时将连续操作。指定握手信号源:内部时钟用于信号发生,,IO,连接端口,或,RSTI,连接端口。当执行信号发生时,也可以输入握手线信号的频率。,DIO Read,:返回从数字量缓冲中扫描的数据;返回缓冲中的数据剩余量;返回在一定时限中操作的初始化是否成功信息。,DIO Write,:用于输出操作中更新缓冲中的数据。当等侯的握手信号发生时,端口将被新的缓冲数据更新。假如在一定时限内握手信号没有出现,将返回一错误信息。,DIO Wait,:等待与任务标识符,task ID.,相关任务的数字量输入或输出操作的完成
16、DIO Clears,:停止操作,同时清除与,task ID,任务相关的缓冲。,注意:,当使用这些,VI,时,数采板必须支持握手信号。,例,10.4.1,缓冲式握手数字,IO VI,的例子。,DIO,Config,VI,:设置端口,1,为一组输出组,同时为分配数据缓冲。,DIO Write VI,:将一个一维整形量数组存于缓冲中。,FOR,循环使用自动索引输出方式创建了该数组。,DIO Start VI,:设置,I/O,接线端口为握手信号源,并启动输出操作。,DIO Wait VI,:等待缓冲式输出操作完成。,DIO Clear VI.,清除输出操作任务。,11.5,计数器基础知识,计数器
17、为数据采集系统提供了高精度的计数和定时功能,数据采集卡上的计数,/,定时电路有些用于数据采集的定时控制,有些则用于通用的计数,/,定时功能,如产生脉冲序列、测试脉冲宽度和频率、进行事件计数和定时、进行精确的频率细分等。不同的数据采集卡具有不同的计数器。,NI,公司的数据采集卡主要使用,4,种计数芯片,,660X,系列的卡用高性能的,TIO,ASIC,芯片,,E,系列卡使用,DAQ,STC,芯片,较早期的卡使用,Am9513,芯片,低价位的,Lab1200,系列使用,8253/54,芯片。,11.5.1,计数器信号 计数器可以接收或输出,TTL,兼容信号。一个能被计数器测得的信号,其脉冲宽度、上
18、升时间和下降时间应不低于该计数器能识别的最小值,请看下图,:,11.5.2,计数器操作 基本的计数器模型如下图所示。一个,SOURCE,输入口、一个,GATE,输入口、一个,OUT,输出口,以及一个计数寄存器。数采板上分别对应的端口为:,SOURCE n,GATE n,,以及,OUT n,(,n,是指计数器的序号)。,一个输入的,TTL,信号在源信号输入端,SOURCE,计数。计数寄存器预置一个值,然后对,TTL,信号的每一次计数边缘加,1,或减,1,。门信号输入端,GATE,控制计数发生的时间,计数可以在门信号的上升沿、下降沿开始,或者是在门信号的高电平、低电平进行,也可以用软件触发计数。输
19、出端,OUT,可以产生各种,TTL,脉冲波形。,11.5.3,LabVIEW,计数器,VI,LabVIEW,计数器,VI,被分为了以下三个类型的模板:,Easy I/O,VIs,:较简单经常使用的计数器,VI,。用于常用的定时计数操作:事件定时,/,计数,产生单个脉冲,产生脉冲序列,测量脉冲宽度或周期以及频率测量。,Intermediate,VIs,:主要用于设置和控制计数器的操作,这些,VI,比,Easy I/O VI,更灵活。,Advanced,VIs,:高级计数器,VI,主要用于作为创建其他数字,VI,的基本模块。这些,VI,是最灵活也是最复杂的。,11.6 Easy I/O Count
20、er VI,11.6.1,事件定时,/,计数,(Count Events or Time),用于事件定时,/,计数,如,SOURE,输入口信号上升或下降沿出现的次数。,device,和,counter,输入端指定了是那一块数采板的那一个计数器端口将接收事件。,Source edge,确定该事件是上升沿还是下降沿。,event source/,timebase,的输入端值小于或等于零时,计数器将对,SOURE,口输入的信号进行计数。当,event source/,timebase,被设置为有效的内部时钟频率时,计数器将对,SOURE,口输入的内部时钟信号进行计数,如使用,DAQ-STC,芯片的数
21、采板其内部有效时钟频率可为,20MHz,和,100KHz,。,Counter size,输入设置了最大计数容量,当超过该值后计数器将会溢出并重新清零。,DAQ-STC,芯片上,24,位的计数器在溢出前其最大计数容量为,16M,。,start/restart,输入端控制计数器启动,/,停止操作。,count,输出端返回的是当前计数器寄存器的值。,seconds since start,返回自计数器启动后的时间值。,seconds since last call,返回自计数器寄存器被读取后的时间值。只有当,event source/,timebase,输入端为有效内部时钟时,seconds sin
22、ce start,与,seconds since last call,的返回值才有实际意义。,例,11.6.1,对已知时钟信号的上升沿进行计数。,这个计数器是对频率为,100 KHz,的内部时钟的上升沿进行计数的。,Status,输出指示了计数器当前是否在运行。,Count Events or Time,输出全部都显示在前面板上。,程序框图如下:,当按下,Start Counter,按扭后,即看到,Status,输出为,Counter is counting,。同时,,Counter Register Value,的显示应为每隔一秒递增,100,000,。,Time Since Start,显
23、示你启动计数器后的时间;,Time Since Last Call,显示上次计数器寄存器被读取后的时间,因为,While,循环是每隔一秒运行一次故该值应始终为,1,。当按下,Stop Counter,后即停止计数器的运行,此时,Status,显示为,Counter is waiting,。,11.6.2,发生脉冲 发生脉冲是计数器另一较常用的功能。可以在,OUT,口输出一个或一串脉冲。使用,Generate Delayed Pulse VI,发生一单个脉冲;,Generate Pulse Train VI,发生一脉冲序列。使用这两个,VI,需要设定以下参数:脉冲极性,延迟,幅宽(延迟和幅宽之和
24、为脉冲宽度)以及占空比。脉冲极性(如下图)决定了脉冲为高还是低。,发生单个脉冲:,Generate Delayed Pulse VI,输出一由,pulse polarity,pulse delay,和,pulse width,参数决定的单个脉冲。,gate mode,设置了计数器工作的门限模式。,Timebase,source,决定了那一时钟用于延迟和幅宽(内部或外部时钟)。使用外部时钟,外部的时基信号连接到计数器的,SOURCE,端口上。,发生脉冲序列:用,Generate Pulse Train VI,可输出一系列由,pulse polarity,frequency,和,duty cycl
25、e,输入参数决定的脉冲序列。,number of pulses,设定了脉冲序列的长度。假如你把,number of pulses,设为零,那么该,VI,将发生连续的脉冲序列。,例,11.6.2,使用计数器发生一个脉冲。,前面板:,程序框图:,例,11.6.3,使用计数器发生一个脉冲序列。,前面板:,程序框图:,11.6.3,脉冲宽度测量 可用,Measure Pulse Width or Period VI,来测量连接到计数器,GATE,口信号整个脉冲的宽度或幅宽。该,VI,都用到了计数器的门限计数功能。,将被测的脉冲信号,Tpw,连接到计数器的,GATE,口;,SOURCE,口用的是内部时钟
26、当,GATE,信号为高时开始计数,为低时停止计数。用计数值乘以,SOURCE,口信号的周期即可算出被测信号的脉冲宽度。,Measure Pulse Width or Period VI,如下图:,device,和,counter,决定了是那一块数采板的那一个计数器用于测量脉冲信号的参数。,Type of measurement,输入参数决定了你是想测量整个脉冲的宽度还是仅测量脉冲的高电位部分或脉冲的低电位部分的宽度。,timebase,决定了用于被计数的内部时钟。若计数操作未在,time limit,时间限制内完成,,timeout,输出为,TRUE,。,Pulse width/period
27、返回测量的宽度或周期,count,返回计数器寄存器的值。,counter overflow?,返回值为,TRUE,,这是有计数器溢出造成,此时你应当降低,timebase,内部时钟的频率。,valid?,输出显示了是否有足够的内部时钟计数确保测量的脉冲宽度或周期值正确。,例,11.6.3,用计数器测量脉冲宽度或周期,。,前面板:,程序框图:,11.6.4,频率测量,计数器也可用于测量脉冲序列的频率。通过对给定的已知时间内的脉冲串个数进行计数,即可计算出被测信号的频率。,GATE,口接已知幅宽的脉冲信号。用已知信号幅宽除以计数值即可算出被测信号的频率。使用,Measure Frequency
28、VI,时,数采板上第二计数器接到,GATE,口提供门限脉冲,将被测信号接到第一个计数器的,SOURCE,口上。,可用,Measure Frequency VI,来测量频率较高的脉冲序列信号的频率。,device,和,counter,决定了是那一块数采板的那一个计数器用于测量脉冲信号的参数。,Gate width,设置了由第二个计数器,(counter-1),所发脉冲的幅宽。,Counter size,设置了计数器对一未知信号能进行的最大计数值。,例,11.6.4,用计数器测量未知信号的频率,。,把一方波信号接到,Counter 1,的,SOURCE,口上。,把,Counter 0,的,OUT,
29、口输出连接到,Counter 1,的,GATE,口输入上。,11.7,其它有用的,Counter VI,11.7.1,计数器的分频设置,Down Counter or Divider,Config,VI,是一当预设事件次数出现后发生脉冲的,VI,。例如:把,timebase/timebase,divisor,设为,100Hz/50,,那么计数器将每隔,50,个时基脉冲在,OUT,发出一个脉冲或切换电位状态,其频率应为,50*100Hz=2s,。当启动该操作时,请将该,VI,的,taskID,输出接到,Counter Start VI,上。,11.7.2 CTR Control The CTR
30、Control VI,用于由,control code,输入参数决定的关于计数器控制方面的所有操作:启动,停止,读取以及重置计数器。,CTR Control VI,也能控制数采板上的,FREQ_OUT,的状态。设,control code,为,7,来启动,FREQ_OUT,输出,(enable FREQ_OUT),;设定,control code,为,8,来停止,FREQ_OUT,输出,(disable FREQ_OUT),。,11.7.3 CTR Group,Config,CTR Group,Config,VI,可将一个或多个计数器合成为一组。,Device,设定数采板的设备号,,group,是根据,counter list,数组设给该组计数器的唯一组号。,task ID,返回值是标识该任务的标识符;,error in,和,error out,包含有错误信息。,11.7.4 CTR Mode,Config,CTR Mode,Config,VI,根据,task ID,,,config,mode,,,source,timebase,signal,gate parameters,output type,和,output polarity,参数来对计数器进行设置。,error in,和,error out,包含有错误信息。,






