在数据采集和处理过程中,有些模拟信号的幅值和频率变化的速度是非常快的,如何将这些高速变化的模拟信号采集到计算机里进行处理便是一个需要解决的实际问题。由于数字数据传输速率等系统瓶颈的影响,使用常规的技术方法往往不能理想地解决上述实际问题。以PCI总线为代表的高性能局部总线的推出,为计算机的模拟输入通道采样频率的大幅度提高提供了坚实的技术基础。
PCI-1711数据采集卡
PCI-1711是12位的低损耗多功能采集卡卡,具有独特的电路设计和完善的数据采集与控制功能,支持即插即用,具有FIFO的高速缓存,可灵活设定输入类型和范围,具有16通道单端模/数输入、16通道数字I/O和2通道数模输出,采集速率可达100kHz,可编程的计数/计时器可作为A/D转换的速度触发,同时具有通道自动搜索功能。内部结构主要有单端模拟输入通道、模拟输出通道和触发源连接三部分。
库函数及其应用
厂家为用户提供了PCI-1711采集卡的库函数和不同语言的例程,使用户具有良好的Windows开发环境。厂家主要为可编程的DAS卡提供DDL、ActiveDAQ和GeniDAQ等驱动文件,同时还提供了在Visual Basic、Visual C++、C++ Builder和Delphi等开发环境下的例程,这些都方便了用户根据自己的实际情况完成数据采集的编程工作。在Visual C++开发环境下,其原文件要包含库函数“driver.h”。
结合Visual C++ 软件开发环境,PCI-1711采集卡的软件编程需要以下几个步骤。
(1)采集卡的注册。可以放在.cpp文件的开始位置,或者直接包含注册的库函数。
(2)采集卡的配置。在配置文件里,可以设置通道号和通道增益模式。
(3)采集卡的数据采集。这里要根据设置的通道号和采集模式来采集数据,同时选择触发模式和电压补偿。触发模式中,0为内触发模式,1为外触发模式。
(4)数据处理。用户可根据自己的需要将采集来的电压值进行处理,同时可在Visual C++的环境下,将采集处理后的数据通过友好的人机界面显示出来。
(5)释放采集卡。在Visual C++开发环境下,可用库函数提供的DRV_DeviceClose()函数将采集卡关闭。
应用中的注意事项
PCI-1711采集卡的信号线要尽可能远离电源线、发电机和具有电磁干扰的场所,也要远离视频监视系统,因为它会对数据采集系统产生很大的影响。在现场试验中,如果信号线和电源线必须并行(比如在同一个电缆沟里),则两者之间必须保持适当的安全距离,同时最好用屏蔽电缆,以确保信号安全准确地传输。
采集卡的每个通道的模拟量采集都有一个输入电压范围,超过了这一范围会造成采集卡A/D转换部分的烧毁,所以在采集模拟信号时,要保证被采集的信号在设定的量程范围内。
应用实例
下面是在Visual C++的环境下实现PCI-1711数据采集的一段程序。采样频率可以通过SetTimer()函数设定,采用内部触发方式。采集卡使用的五个步骤中,第一步在OnCtrStart()函数中实现,第五步在OnCtrStop(),第二步和第三步在Adinput()函数中实现,第四步为数据处理,根据用户不同的需要进行相应的处理,这里从略。
void CStable2View::OnCtrStart()
{
// TODO: 添加命令句柄代码
// Step 1:注册设备
if(ErrCde =DRV_DeviceOpen(DeviceList[gwDevice].dwDeviceNum,
(LONG far *)&DriverHandle)!=0)
return ;
else
timeId=SetTimer(nIDE, 100, NULL);
}
ADinput(unsigned char chan) /* chan是通道号*/
{
float fVoltage;
//Step 2:配置设备
ptAIConfig.DasChan = chan;
ptAIConfig.DasGain = 1;
if(ErrCde = DRV_AIConfig(DriverHandle,(LPT_AIConfig)&ptAIConfig)!=0)
return 0;
// Step 3:采集数据
ptAIVoltageIn.chan = chan; // 输入通道
ptAIVoltageIn.gain = 1; // 增益代码,可参考手册的电压范围
ptAIVoltageIn.TrigMode = 0; // 0: 内触发器,1: 外触发器
ptAIVoltageIn.voltage = &fVoltage; // 返回的电压
if(ErrCde = DRV_AIVoltageIn(DriverHandle, &ptAIVoltageIn)!=0)
return 0;
return (fVoltage);
}
//step 4:处理数据(发送)
void CStable2View::OnCtrStop()
{
// TODO:添加命令句柄代码
timeId=0;
KillTimer(timeId);
// Step 5:释放设备
DRV_DeviceClose(&DriverHandle);
}