基于VC++的PCI?6220应用编程设计
   来源:现代电子技术     2021年01月21日 17:59

基于PCI总线的数据转换模块的设计与应用

林立杰 胡志英

摘 要: 对于NI公司的低成本多用途数据采集板卡PCI?6220,给出了一些VC++应用程序设计。首先介绍了该板卡的功能特性,其次对该板卡的测试和应用方法进行了研究,结合该板卡的功能特性,调用API库函数进行编程设计,使其适合于该板卡的应用场合。

关键字: 板卡功能; 数据采集; 采样率; 软件编程

中图分类号: TN911?34 文献标识码: A 文章编号: 1004?373X(2015)01?0147?03

Abstract: Design of some VC++ application programs is given for the low?cost and multi?purpose data acquisition card PCI?6220. The card′s function features are introduced. The card′s test and application methods are researched. In combination with the card′s function features, the functions called from the API Library are used for programming design, make them suitable for application occasions of the card.

Keywords: card function; data acquisition; sample rate; soft programming

0 引 言

NI?DAQmx是NI公司数据采集驱动软件的简称,是用于NI数据采集(DAQ)设备通信、能够为设备配置虚拟通道和测量任务的图形化工具,可基于虚拟通道和任务生成NI?DAQmx代码,提供速度快的单点模拟I/O和多线程设计; 无需连接实际的硬件,方便应用程序的测试和修改等。

NI PCI?6220属于M系列板卡,该系列的板卡都使用NI公司数据采集驱动软件NI?DAQmx。每个驱动都有自己的API函数,包括相应的硬件配置和软件配置。M系列板卡有多达16种编程功能接口信号。M系列设备板卡使用板上振荡器生成一个40 MHz的频率时钟,为板卡提供时钟源。

1 功能特性

1.1 模拟数据采集功能

板卡具有16路分辨率为16位的模拟输入端口,模拟输入接线方式可以按照8路差分方式(AI0~AI7:AI8~AI15),也可以按照16路单端接地方式,设计者可以根据信号抗干扰性要求进行选择。

板卡最大采样率为250 KS/s单通道采样或者按照所有通道总和采样率为250 KS/s进行。实际采样率可以由设计者在相应API函数中按照实际需要进行设置,并不需要设置为最大值。模拟电压输入最大电压能够承受±10 V。

1.2 数字I/O功能

板卡具有24条数字I/O线,8路高速可达1 MHz时钟线,可以通过编程实现数字信号读和数字信号输出功能。

1.3 触发计时功能

板卡具有2个32位80 MHz计时器,可以通过计时触发控制输出0.5 ms级脉冲波形。

2 板卡测试及应用研究

在板卡应用前需要明确以下概念:

(1) 物理通道和虚拟通道

物理通道表示直接在上面测量、产生电压或数字信号的物理管脚或终端。例如物理通道标示为Dev0/ai1,表示设备标识符为Dev0,通道标识符为ai1,为模拟输入通道1。而虚拟通道则与每次测量任务相结合,对应于各物理通道及其设置,包括在端口连接、测量或生成的信号类型、缩放信息。在NI?DAQmx 中,各项测量都不能缺少虚拟通道。通过配置虚拟通道作为任务的一部分或独立于一个任务。

(2) 任务

任务是具有定时、触发或其他特性的一个或多个虚拟通道。理论上,任务就是要执行的测量任务或生成信号任务。可以在任务中设置或者保存所有的配置信息,并且可以将任务用于应用程序。

(3) 采样率

数据采集需要考虑采样类型,PCI?6220板卡采样类型有DAQmx_Val_ContSamps连续采样和DAQmx_Val_FiniteSamps 有限采样两种。连续采样表示在一段时间内不间断对端口读数据,而有限采样表示点击一次即采集一次数据。采样率通常又被称为扫描率(the Scan Rate),采样率越高,采集的信号精度就越高。

2.1 板卡应用前测试

在机器PCI插槽插入NI PCI?6220板卡后,安装驱动程序,需检测板卡功能是否正常。 运行NI公司提供的Measurement &Automation Explorer软件,点击“设备和接口”项目下出现的“NI PCI?6220(68?pin):“Dev1”选项,如图1所示。点击右边栏“自检”,检验设备是否安装自检正常。

2.2 模拟输入采集

模拟输入通常采用单端输入和差分输入方式。单端输入表示信号一端接输入端口,另一端接公共参考地,单端输入连接如图2所示。差分输入表示信号两端分别输入给两个模拟输入端,信号大小为两个模拟输入端电压差,差分输入连接如图3所示。通常建议采用差分输入方式,这种方法抗干扰能力强,能较好抑制共模电压输入影响。

2.3 测量流程图

图4举例描述创建测量电压的模拟输入测量流程,与数字I/O的测量流程类似,只需替换其中的测量函数。

3 应用编程设计[1?2]

为使用NI DAQmx API函数,需要在VC++ 6.0的“project?>Settings?>Link”下链接库文件NIDAQmx.lib,同时在程序中引用头文件NIDAQmx.h。

3.1 模拟输入编程[3?4]

如果需要读取通道第0~5和第15通道的单端连续电压,其测量范围为0~10 V。如2.3节所示,测量前需要创建通道,生成测量任务DAQmxCreateTask("",&*phTaskHandle);申明DAQmxCreateAIVoltageChan(*phTaskHandle,"Dev1/ai0:5,Dev1/ai15","",DAQmx_Val_RSE,0,10.0,DAQmx_Val_Volts,NULL);然后开启任务DAQmxStartTask(*phTaskHandle);最后调用函数DAQmxReadAnalogF64(hTaskHandle,?1,1,DAQmx_Val_GroupByChannel ,fReadData,7,&nReadVal,NULL);将7个数据不间断地读取到fReadData中。在WindowsXP操作系统下,为了提高实时性,可以调用硬件定时精度函数QueryPerformanceCounter进行计时,可精确到1 ms。

3.2 数字I/O输入编程[5]

如果需要读取PORT1的数字I/O通道数据,测量前也需要创建通道,生成测量任务DAQmxCreateTask("",&*phTaskHandle);然后调用申明虚拟通道的函数DAQmxCreateDIChan(*phTaskHandle,"Dev1/port1/line0:7","",DAQmx_Val_ChanForAllLines));开启任务DAQmxStartTask(*phTaskHandle);再调用读所有通道数据的函数DAQmxReadDigitalLines(hTaskHandle,1,10.0,DAQmx_Val_GroupByChannel,nReadData,8,&nReadNum,&nBytesPerSamp,NULL),读取8个数据。

3.3 数字I/O输出波形编程[6]

通过数字I/O通道输出数字波形相对于前面两种编程模式要复杂,需要用到计时触发功能。特别是如果要输出两路有关联性的脉冲波形,需要算出两路脉冲波形之间的最小计时波形精度。这里给出通过计时器CTRO计时、PORT0的0和1端口输出关联脉冲精度的编程方法。首先创建计时任务DAQmxCreateTask("",&*phTaskHandle),其中phTaskHandle为计时任务句柄指针;调用DAQmxCreateCOPulseChanFreq(*phTaskHandle,"Dev1/ctr0","",DAQmx_Val_Hz,DAQmx_Val_Low,0.0,UpdateRate,0.50)函数生成0.5 ms精度的计时脉冲频率,其中UpdateRate约束为1/0.5 ms;调用函数DAQmxCreateTask("",wdTaskHandle)创建输出脉冲波形任务,其中wdTaskHandle表示脉冲输出任务指针;接着调用DAQmxCreateDOChan(*wdTaskHandle,"Dev1/port0/line0:1","",DAQmx_Val_ChanPerLine )函数申明虚拟任务通道;再调用DAQmxCfgSampClkTiming(*wdTaskHandle,"/Dev1/Ctr0InternalOutput",UpdateRate,DAQmx_Val_Falling,DAQmx_Val_FiniteSamps,nBufLength)函数表示CTR0内部输出计时属性为下降沿、有限采样;接着调用函数DAQmxWriteDigitalLines (*wdTaskHandle, nBufLength, 0, 10.0, DAQmx_Val_GroupByChannel, uDataBuf, NULL, NULL)申明写数据线方式输出uDataBuf内包含的数据,连续启动计时任务和波形输出任务后开始执行波形输出任务。

4 结 论

在PCI?6220板卡模拟输入试验中,要充分注意到差分方式和单端方式采集电压的不同,信号接地方式将会影响到电压采集的真实性,如果通道数目足够,尽量采样差分方式采集模拟信号。

波形输出编程需要精确考虑计时触发的时间精度,尤其对于输出关联脉冲波形来说,需要计算在计时精度条件下波形编码方式,即0、1信号的数量,以此确定输出数据缓冲区的大小和长度。

上述编程方式经过一定实验验证,表明该采集板卡对慢变信号、高速信号等模拟输入信号以及数字I/O信号都能够很好地完成数据采集任务。脉冲波形输出的编程流程更复杂化,需要考虑的方面更多,本文在这里提供参考。

参考文献

[1] LRINRVKRT R C. Visual C++ Bible[M].北京:电子工业出版,1999.

[2] 徐晓刚,高兆法,王秀娟.Visual c 6.0入门与提高[M].北京:清华大学出版社,1999.

[3] 崔常府.基于NI的计算机控制程序开发[D].青岛:中国石油大学(华东),2009.

[4] 李净,杨俊武,钱旭.用多媒体定时器精确控制采样频率[J].计算机应用,2000(12):67?68.

[5] 陈银辉,张银鸿.LabView 8.20程序设计从入门到精通[M].北京:清华大学出版社,2007.

[6] 黄松岭.虚拟仪器设计基础教程[M].北京:清华大学出版社,2008.

文章 板卡 通道