资源描述
第九章 数字IO和计数器
9.1 基本知识
一般数据采集卡上都有数字端口和计数器,用来实现数据采集的触发、控制及计数等功能。数字端口按TTL逻辑电平设计,其逻辑低电平在0到0.7V之间,高电平在3.4到5.0V之间。
数采板上多路(Line)数字 I/O 组成一组后被称为端口(Port)。一个端口由多少路数字 I/O 组成是依据其数采板而定的,在大多数情况下4或8路数字 I/O 组成一个端口。当读写端口时,你可以在同一时刻设置或获取多路DI/O的状态。MIO E 系列板卡有8路数字 I/O组成了一个端口(DIO0~DIO7),实际使用时这8路可以部分是输入,部分是输出。
除了8个数字I/O引出脚,还有一些其他数字型引出脚,其中包括通用计数器、可编程控制、实时触发等。需要时应当查阅有关板卡的资料。
数字I/O的应用分为两类:立即型(非锁存型)和定时型(锁存型)。在立即型情况下,当调用数字 I/O函数后立即更新或读取数字量某一路或端口的状态。在定时型情况下,可以使用外部信号来控制数字量数据的传输。MIO E 系列板卡没有定时型数字I/O。
LabVIEW 中关于DI/O的VI也分为低、中、高三个等级。我们不准备详细介绍这些内容,下面就结合例子谈几个问题。
9.2 数字I/O简介
立即型DI/O 是最简单而且也是较经常使用的关于数字量方面的应用。它也叫非锁存型的DI/O,所有带有 DI/O 接口的数采板都支持这种DI/O 模式。在这种模式下,当LabVIEW 调用函数后即可立即设置或获取某路DI/O的状态。当某路DI/O被设定为某一状态后,那么该路DI/O 将一直保持这种状态直到其状态被重新设定为止。可以通过软件改变某路DI/O 是输入或是输出方式。
在Easy级有4个模块:Read from Digital Line 、Read from Digital Port 、Write to Digital Line 和Write to Digital Port,分别是按位(线)和口的读和写。以Read from Digital Line为例,它的图标如右所示。各参数含义如下:
port width:端口线(位)数
device:采集卡设备号
digital channel:数字通道名或号
line:欲读的数字线或位
line state:返回的数字线状态
iteration:默认值为0,表示每调用一次数字I/O函数,系统将设置一次采集卡。在循环中重复调用数字I/O函数时,为了避免出现这种情况,可将iteration设为正数。
下面的程序是对MIO-16E-4卡按位和口的读操作,这里多数输入参数采用默认值,没有安排连线。假定事先我们将8位数字口的状态置成了“11000011”。则程序和运行结果如下:
如果你希望对数字端口做更加细致的控制,例如使其部分线做输出,部分线做输入,则可使用中、高级的数字端口函数。
9.3 计数器(Counter I/O)
MIO E系列采集卡硬件配有两套通用计数器(GPCTR general purpose counter),分别标为GPCTR0 和GPCTR1。每套计数器占用2个输入端口和1个输出端口,如下图所示:
对应于GPCTR0,其引出端分别标为:
GPCTR0_GATE 通用计数器闸门信号
GPCTR0_OUT 通用计数器输出信号
GPCTR0_SOURCE 通用计数器时钟信号源
采集卡上提供了20M和100K两个时钟源供使用。典型的计数器应用有:事件定时/计数、产生单个脉冲、产生脉冲系列、测量频率、脉冲宽度、信号周期等。
同样,LabVIEW给出了低、中和高3种类型的计数器函数,我们用最简单的低级函数给出几个例子。
练习9-1 事件定时和计数
Easy I/O VI中的Count Events or Time 用于事件定时/计数(见下图)。
它可以检测输入口信号上升或下降沿出现的次数。各参数的含义是
device:采集卡设备号
counter:计数器号
Source edge:确定是按上升沿还是下降沿计数
event source/timebase(Hz):输入端值等于0.0时,计数器将对SOURE口输入的信号进行计数。当被设置为有效的内部时钟频率时,计数器将对SOURE口输入的内部时钟信号进行计数。使用DAQ-STC芯片的数采板其内部有效时钟频率可为20MHz和100KHz。
counter size: 缺省值为0,表示使用指定的16-bit Am9513 计数器或 24-bit DAQ-STC 计数器。如果设为 1 则使用2个Am9513 计数器作为一个 32-bit 计数器。
start/restart:输入端控制计数器启动/停止操作。
stop: 等于true时停止计数。
count: 返回当前计数器寄存器的值。
seconds since start: 返回自计数器寄存器被启动后的总时间,它不用于事件计数。
seconds since last call:返回自计数器寄存器被读取后的时间。
现在我们来看一个具体的例子。
该VI允许你重复启动或停止Counter 1。这个计数器是对频率为100 KHz的内部时钟的上升沿进行计数的。Status输出指示了计数器当前是否在运行。Count Events or Time输出全部都显示在前面板上。
当按下前面板Start Counter 按扭后即启动计数器对内部时钟信号上升沿进行计数。在每次的While循环中,该VI都读取计数器寄存器的值并计算计数器被启动后的时间和上次被读取后的时间值,假如你按下前面板Stop Counter按扭即停止计数器的运行。
While循环中使用1000ms的延迟函数控制循环的运行速度和每隔1秒监视计数器的状态。Status 局部变量设置前面板的状态字符串来显示计数器是在计数还是在等候。
当你按下Start Counter按扭后,即看到Status输出为Counter is counting。同时,Counter Register Value 的显示应为每隔一秒递增100,000左右。Time Since Start显示你启动计数器后的时间;Time Since Last Call显示上次计数器寄存器被读取后的时间,因为While循环是每隔一秒运行一次故该值应始终为1。当你按下Stop Counter后即停止计数器的运行,此时Status显示为Counter is waiting。
一组移位寄存器保存了相邻两次计数器的计数值,相减得到计数增量X-Y,实际上这个值是有偏差的。
练习 9-1结束.
脉冲发生是计数器另一教常用的功能。可以在OUT口输出一个或一串脉冲。用Generate Delayed Pulse VI可发生一单个脉冲;用Generate Pulse Train VI发生一脉冲序列。使用这两个VI时需要设定以下参数:脉冲极性,延迟,幅宽(延迟和幅宽之和为脉冲宽度)以及占空比。脉冲极性决定了脉冲为高还是低。
占空比定义为:Duty cycle = Width / (Delay + Width).
练习9-2 发生单个脉冲和脉冲系列
这个练习需要准备的环境有:
1. 将GPCTR1_OUT与模入通道0连接,将DGND与模入通道8连接(差分模入方式)。
2. 使用MAX软件的Test Panel来观测模入通道1采集到的单个脉冲和脉冲系列
程序很简单,只有框图,没有前面板。下面的左图是产生占空比为0.5的单个脉冲,右图则产生了一个10Hz的、连续的、占空比为0.5的脉冲系列。
练习9-2 结束
练习9-3 测量一个方波信号的频率
程序面板与框图如上所示。双击频率测量函数可以看到其下一层结构,这个例子中使用了两个计数器,以提高计数精度。其结构示意图如下
在运行这个程序之前要对硬件做一些连接。参阅上图,将待测的方波信号接到GPCTR1的SOURCE端,将GPCTR0的OUT信号连接到GPCTR1的GATE端。
练习9-3 结束
练习9-4 测量脉冲宽度或周期
测量脉冲宽度或周期的VI如下图所示
其中,值得说明的是测量类型(type of measurement),按设计分下图所示的0、1、2、3共4种情况
实际上在6i版本中又增加了对多脉冲的两种情况。
下面是一个较完善的例子。有一些程序设计技巧值得借鉴。
下图左上方是前面板,下方是框图,右上方是框图中case结构的另一种情况。
测量函数的时钟取缺省值100kHz,选计数器1,测量类型有六种情况,0,1,4,5是测量
脉冲宽度,2,3是测量脉冲宽度周期。按这两种情况设定了case结构。为了使非选中情况的前面板控件变灰,增加了显示控件的属性节点如图。
运行该程序时先将外部信号源(TTL电平方波)连接到GPCTR1_GATE端,信号源地与DGND连接。
练习9-4 结束
在LabVIEW提供的例子中还可以看到许多计数器应用的例子,但要注意这些功能与采集卡的型号有关。
数字端口的另一个重要用途是用于采集过程的同步与触发,相关问题在下一章讨论。
展开阅读全文