LabVIEW编程NI 6602计数器DMA冲突例程与相关资料

简介: LabVIEW编程NI 6602计数器DMA冲突例程与相关资料

LabVIEW编程NI 6602计数器DMA冲突例程与相关资料

PCI‑6602可执行编码器位置测量、事件计数、周期测量、脉冲宽度测量、脉冲生成、脉冲串生成和频率测量。 它具有八个计数器/定时器,数字去抖动滤波器和TTL/CMOS兼容的数字I/O。PCI‑6602可以同时执行三路高速DMA传输。

8eedf05c8ece4604b0c6451eae562759.png 问题: PCI-6601 或者 PCI-6602 最大的输出频率是多少?

解答: 您能获得的最大输出频率依赖于您使用的时基以及您指定的脉冲。首先,我们先来看时基。时基越快,您能得到的输出频率越快。PCI-6601 最大的时基是 20 MHz,PCI-6602 最大时基是 80 MHz。

为了更好的理解时基是如何影响您的输出频率的,您必须首先理解计数器是如何产生脉冲的。计数器有两个加载寄存器(加载寄存器 A 和 B),这两个寄存器确定了脉冲的特性。您决定利用 NI-DAQ 中的 GPCTR_Change 参数或者在 LabVIEW 中使用 Counter Set Attribute.vi 加载哪个值到寄存器中。重要的参数是 "pulse spec 1" (加载寄存器 1)以及 "pulse spec 2" (加载寄存器 2)。当您开始计数时,第一个加载寄存器(加载寄存器 A)加载到计数器中,源端每次上升沿到来,加载寄存器中的数减一。当计数值为零时,计数器执行下列两个中的一个: (1) 输出由低变高 或者 (2) 输出一个等于源信号一个周期的脉冲。第一种模式称为“触发输出”,第二种称为“脉冲输出”。请参考 6601/6602 用户手册的 3-8页以了解触发和脉冲输出的框图。可以在 NI-DAQ 中利用 GPCTR_Change 参数进行设置,或者利用 LabVIEW 中的 Counter Set Attribute.vi 调用“输出模式”。在加载寄存器 A 为零后,加载寄存器 B 开始加载。当加载寄存器 B 为零时,计数器的输出根据输出模式或者触发,或者产生脉冲。

既然我们了解了脉冲是如何产生的,那么我们来谈谈如何影响最大输出频率。您的输出脉冲的特性是源端的倍数。例如,如果您使用 20 MHz 时基,其中 1 周期 = 1 s / (20 x 10^6 周期) = 50 ns,做为您的源,您将 "pulse spec 1" (加载寄存器 A)设置为 5 并且 "pulse spec 2" (加载寄存器 B)设置为 10,您使用了“触发”的输出模式,那么您将得到一个 250 ns (5 x 50 ns)的低电平,500 ns (10 x 50 ns) 高电平的脉冲。每个寄存器可以加载的最小值为 2,因此如果您使用 20 MHz 时基在“触发”的输出模式下,并且每个加载寄存器设置为 2,那么您将得到低电平为 100 ns (2 x 50 ns) 高电平为 100 ns (2 x 50 ns)的脉冲,总的周期为 200 ns。因此您在“触发”输出模式下能输出的最快频率为源时基的 1/4。因此我们得出结论,您的时基越快,您可能输出的频率就越快。

尽管如此,我们有方法可以得到比源端频率 1/4 更快的输出频率,但是是有限制的。让我们不使用“触发”输出模式,而是使用“脉冲”输出模式。这将给我们一个脉冲,在每次加载寄存器为 0 时,该脉冲有我们源端脉冲的一个周期那么快。因此,如果我们将每个加载寄存器设置为 2,并使用 20 MHz 时基,那么我们将得到我们在“触发”输出模式下脉冲频率的两倍的脉冲(2 x 50 ns = 100 ns,其中频率为 10 MHz)。因此我们能得到我们源端频率的 1/2。这种方法只适用于您脉冲的占空比为 50% 的情况。换句话说,"pulse spec 1" 必须等于 "pulse spec 2"。

因此,通过设定 "pulse spec 1" 和 "pulse spec 2" 为 2,我们在“触发”输出模式下能获得最大的输出频率为 5 MHz,或者在“脉冲”输出模式下为 10 MHz (利用 PCI-6601,同时使用 20 MHz 的最大时基)。利用 6602 (最大时基为 80 MHz),我们在“触发”模式下能获得的最大输出频率为 20 MHz,或者在“脉冲”模式下为 40 MHz。(请参看 6601/6602 用户手册 的 4-12 页以获得如何连线以得到 40 MHz输出的信息。)



问题: 我可以在任何顺序的情况下正确使用三个计数器,但是一但我加入了第四个计数器,我立即得到DMA冲突的结果。这是什么问题?

解答:

和我们的大多数E系列板卡一样,PCI-6602只有三个DMA通道。这意味着如果想成功地运用多于三个通道,前三个通道以后的每一个通道必须被设置成使用中断。你可以利用Set_DAQ_Device_Info DAQ函数,将infoType 设置成要利用的计数器,将infoValue设置成 ND_INTERRUPTS。关于Set_DAQ_Device_Info函数的文档在Start » Programs » National Instruments » NI-DAQ » NI-DAQ Help 中可以找到。在LabVIEW中你可以利用Set DAQ Device Information.vi。

注意:DMA冲突的错误只在NI-DAQ的老的版本中出现。现在的NI-DAQ版本-6.9.3,在DMA通道不可用的情况下会自动将模式设置成中断。因此,每一个前三个之后被利用的通道不需要再被设置为中断模式。如果你需要三个特定的计数器来运用DMA通道,你仍然可以按照上面的顺序将这些计数器设置为利用DMA通道。其余的计数器将自动利用中断方式,所以你将不会再得到DMA冲突的错误。

问题: 我在使用PCI-6602的两个计数器,不过看起来只有一个在工作,请问该如何解决这个问题?

解答: 产生这个问题可能是因为你在设置计数器的时候没有指定计数器组(counter group)。E系列的数据采集卡和基于NI-TIO的板卡(例如PCI-6602)不支持多个计数器的组,因此,你需要设置每个计数器为一个单独的组。如果你不为每个计数器设置单独的组,那么,当你为下一个计数器调用Counter Group Config,vi,你就会覆盖前面一个计数器的信息。

例如:

你想设置两个计数器(0和1),你用Counter Group Config.vi 来配置计数器0,但是,你没有配置计数器组,因为这是个选用的输入。正因为你没有设置计数器组,所有计数器0被默认放置在0组。

如果你要调用Counter Group Config.vi再来配置计数器1,并且你也没有配置计数器组。你不能在同一个计数器组中有多于一个计数器,因此当计时器1默认配置为计时器组0,这样将替换掉计数器0的信息。因此,虽然你配置了计数器0和计数器1,你只能使用计数器1。

解决方法是给“counter group”输入端指定值,给每个计数器分配不同的计数器组(从0开始,按1递增)。


程序的部分截图如下所示。

程序如下附件所示。

 

相关资料说明,如下所示。

LabVIEW、LabVIEW开发、LabVIEW编程、LabVIEW程序

文字内容均在附件Word中,同时上文中提到的例子和资料,均在word中的附件里,可点击下载。登录www.bjcyck.com可以查看更多详细信息。这里只是简略的介绍,有任何关于LabVIEW、LabVIEW开发、LabVIEW编程、LabVIEW程序相关问题,请与我们联系。

相关文章
8086 汇编笔记(十):标志寄存器
8086 汇编笔记(十):标志寄存器
|
7月前
|
传感器 异构计算
LabVIEW编程LabVIEW开发NI 7851R同步到背板时钟 例程与相关资料
LabVIEW编程LabVIEW开发NI 7851R同步到背板时钟 例程与相关资料
49 10
|
7月前
|
数据采集 传感器 人工智能
LabVIEW编程LabVIEW开发NI PCI-6255消除鬼影 例程与相关资料
LabVIEW编程LabVIEW开发NI PCI-6255消除鬼影 例程与相关资料
59 7
|
7月前
LabVIEW为什么NI 6602的两个计数器中只能有1个工作
LabVIEW为什么NI 6602的两个计数器中只能有1个工作
53 4
|
7月前
|
数据采集 人工智能
LabVIEW编程设置NI6251DAQmx物理通道例程与相关资料
LabVIEW编程设置NI6251DAQmx物理通道例程与相关资料
88 2
|
7月前
|
数据采集 人工智能 监控
LabVIEW编程LabVIEW控制NI USB-6210例程与相关资料
LabVIEW编程LabVIEW控制NI USB-6210例程与相关资料
86 0
|
存储
TM4C123库函数学习(3)---串口中断
TM4C123库函数学习(3)---串口中断
223 0
|
NoSQL Shell C语言
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
|
定位技术 芯片
ARM架构与编程(基于I.MX6ULL): 串口UART编程(七)(上)
ARM架构与编程(基于I.MX6ULL): 串口UART编程(七)
288 1
ARM架构与编程(基于I.MX6ULL): 串口UART编程(七)(上)
|
芯片 数据格式
ARM架构与编程(基于I.MX6ULL): 串口UART编程(七)(下)
ARM架构与编程(基于I.MX6ULL): 串口UART编程(七)
320 1
ARM架构与编程(基于I.MX6ULL): 串口UART编程(七)(下)