1. 数据采集基础问题
写这篇博客的主要问题是: 之前写了关于数据采集----为什么使用数字输入端口不存在分频现象,而使用模拟输入端口采集数据时,
存在分频现象? 遗憾的是,现在找不到了!
------------------------------------------------------------------------------
1. 数据采集的时候会不会丢失?
如果软件上读取数据的循环运行得不够快时,比如100K采样率的时候,软件循环肯定没有这么快,数据是不是就丢失了?
首先,我们要清楚的是,数据采集功能是由数据采集卡来完成的,软件知识将采集到的数据收到电脑上面来,数据采集卡有自身的办法
来解决硬件采集速度快过于软件读取速度的问题。
这需要对数据采集过程中的数据的传输作一个介绍:外部的信号进入数据采集卡后,经过各种处理转换,先进入数据采集卡自身的
缓冲区里面,缓冲区是先进先出(FIFO)的,NI采集卡应该都有板载的缓冲区,区别在于缓冲区的大小而已。然后当板载缓冲区中的数
据量到了一定的条件时,数据采集卡将缓冲区的数据上传到计算机内存中,一般以DMA(直接内存访问)方式传入的,但也可以设置为
其它方式,比如中断等。 上传数据的方式和时机可以通过DAQmx的属性节点进行设置或查看,DAQmx中默认的是使用DMA传输方式
(前提: 板载内存非空)。
数据传输方式包括:直接内存访问(DMA),中断请求(IRQ)和可编程I/O。DMA是一种DAQ板卡和PC内存间直接通讯的传输
方式,不再需要处理器的干预。 IRQ传输通常很低,只有150Kb/s,而DMA可以高达20Mb/s。IRQ传输速率与使用的系统设备相关,
如处理器速度等。
数据到了内存后,再由程序中的DAQmx Read.vi从内存中读入到计算机中去。这里计算机的内存要和板载缓冲区区分来,板载缓
冲区是厂商固定死的,改变不了,不会出现溢出的情况,它的空间可以很小,比如1Kbit以下, 但计算机为数据采集开辟的内存
建议是采样率的10倍左右,即是说及时DAQmx Read.vi在10秒钟都没有执行一次的话,那么就会出现内存不足以存放采集到的数据的
问题,导致数据丢失,DAQmx Read.vi就会报错。 内存中的大小可以再DAQmx Timing(Sampleclock).vi的每通道采样输入端进
行设置。但是DAQmx会默认设置一个最小值,如果你在每通道采样输入端设置的值小于这个值的话,DAQmx会忽略你输入的这个值而
使用默认最小值。
不过单单将这个缓冲区设置成10倍,并不一定能保证缓冲区不会溢出,因为缓冲区的存储的数据量不但跟它的输入速度(采样率)有关
,还跟它的输出速度有关,它的输出速度就是采集程序从它里面读取的速度,所以一般在使用循环中调用DAQmxRead.vi的时候,一般
是选择多态VI中的多采样而不是单采样。
同时将它的每通道采样数设置为-1,表示每次调用DAQmxRead.vi的时候都是将内存中的所有数据读取进来。在一些特殊情况下才将这
个输入设置为其它整数,但就得保证循环能尽快的执行,以免缓冲区溢出。如果设置为100的话,表示每次从缓冲区中读取100个数据回
来,如果缓冲区的数据不足100个,那么就会等到够了100个后才读进来并输出,程序会在这里等待缓冲区的数据够100个才往后执行,
跟串口设置读取缓冲区字节数一样。设置为-1则不会出现等待的情况,有就读,没有就返回空数组。
所以,总结一下,为了保证数据不会失丢,要设置好内存缓冲区的大小,还要保证读取缓冲区的程序(DAQmxRead.vi)循环得尽量快
,每一次读取的数据尽量多。
*****************************************************
总结: 1) 数据传输到电脑内存中
2) 数据不丢失 设置缓存区的大小,读取缓存区的程序DAQmx Read.vi循环的尽可能快。
-----------------------------------------------
2. 数据采集时间问题
数据采集时间问题主要两方面。 一是每一个数据点的时间,在NI的数据采集中是通过T0和dt来确定的,T0就是开始数据采集的初始
时间,是任务开始时,数据次啊及卡读取的计算机时间,dt二个数据点之间间隔的时间,是采样率的倒数,比如1K采样率,dt就是
1/1000=0.001=1毫秒。 在施工DAQmxRead.vi的时候要选择波形输出而不是DBL输出,波形输出就带有这些信息,而DBL就只有
数据而没有时间信息了。
另一个就是采样率设置的问题。数据采集卡的采样脉冲一般是由它的内部时钟源进行分频后得到的,所以采样率是不是非常准确,得
看时钟源是否能被整数倍地分频到指定的采样率。
问题:我设置采集的采样速率为500,001Hz。如果我在Labview中用NI-DAQmx编成,如何确定实际采样率?
答:您可以用DAQmx定时属性节点来获得此信息。SamPLClk.Timebase.Rate属性提供了产生实际采样率的时基频率
(timebasefrequency)。大多数DAQ设备有两个时基频率:20MHz和100kHz。SamplClk.TimebaseDiv属性提供分频系数,用于从
时基频率分频下来到您所希望的实际采样时钟频率。所以当您设置您的采样速率为500,001Hz,设备利用20MHz时基和分频系数39来
获得实际的采样速率20MHz/39=512,820.51Hz分频系数永远是一个整数,该整数的大小取决于您的数据采集板卡的型号。举个例
子:假设分频系数是一个16位的整数,这样20MHz时基允许您使用的所有频率均大于305.18Hz,因为一个16位整数对应的最大分频
系数为65,535。100kHz时基用于低于该频率的采样速率。进而,如果您指定的频率不能准确得到,驱动将采用最接近于您指定的采
样率且高于您所指定的采样率。
另外,如果确实需要指定的采样率,也可以用外部的时钟源作为采样脉冲来进行数据采集。
其实更深入一点的话,在连续采集的应用程序中,数据采集时钟源的准确性问题就会显示出来,假设时钟源的误差是50ppm
(百万分之五十),即二万分之一,而一天有86400秒,如果连续运行一天的话数据采集的时钟误差最多就会有4秒多,所以到了24
小时后就会出现波形图上的时间与计算机时间差了大概4秒左右的现象,时间越长这个误差就可能越大,如果这个误差不能接受的话就
需要想其它办法解决。其中一个方法是换一个更高精度的时钟源,但长时间运行的话始终还是会有误差的,之前用过的方法是到了0点
的时候关闭任务再重新开启,让数据采集卡与计算机重新对时。