图3 确定缓冲区大小
不过单单将这个缓冲区设置成10倍,并不一定能保证缓冲区不会溢出,因为缓冲区的存储的数据量不但跟它的输入速度(采样率)有关,还跟它的输出速度有关,它的输出速度就是采集程序从它里面读取的速度,所以一般在使用循环中调用DAQmx Read.vi的时候,一般是选择多态VI中的多采样而不是单采样。
同时将它的每通道采样数设置为-1,表示每次调用DAQmx Read.vi的时候都是将内存中的所有数据读取进来。在一些特殊情况下才将这个输入设置为其它整数,但就得保证循环能尽快的执行,以免缓冲区溢出。如果设置为100的话,表示每次从缓冲区中读取100个数据回来,如果缓冲区的数据不足100个,那么就会等到够了100个后才读进来并输出,程序会在这里等待缓冲区的数据够100个才往后执行,跟串口设置读取缓冲区字节数一样。设置为-1则不会出现等待的情况,有就读,没有就返回空数组。
所以,总结一下,为了保证数据不会失丢,要设置好内存缓冲区的大小,还要保证读取缓冲区的程序(DAQmx Read.vi)循环得尽量快,每一次读取的数据尽量多。
2
数据采集的时间问题
数据采集中时间相关的问题主要是二方面,一个是每一个数据点的时间,在NI的数据采集中是通过T0和dt来确定的,T0就是开始数据采集的初始时间,是任务开始时数据采集卡读取的计算机时间,dt二个数据点之间间隔的时间,是采样率的倒数,比如1K采样率,dt就是1/1000=0.001秒=1毫秒。在使用DAQmx Read.vi的时候要选择波形输出而不是选择DBL输出,波形输出就带有这些信息,而DBL就只是有数据而没有时间信息了。见图4。
问题: 我设置采集的采样速率为500,001 Hz。我想知道我的设备所用的实际采样率。如果我在
labview中用NI-DAQmx编成,如何确定实际采样率?
解答: 您可以用DAQmx定时属性节点来获得此信息。
SamplClk.Timebase.Rate属性提供了产生实际采样率的时基频率(timebase frequency)。大多数DAQ设备有两个时基频率:20 MHz和100 kHz。
SamplClk.TimebaseDiv属性提供分频系数,用于从时基频率分频下来到您所希望的实际采样时钟频率。所以当您设置您的采样速率为500,001 Hz,设备利用20 MHz时基和分频系数39来获得实际的采样速率20 MHz/39 = 512,820.51 Hz 分频系数永远是一个整数,该整数的大小取决于您的数据采集板卡的型号。举个例子:假设分频系数是一个16位的整数,这样20 MHz时基允许您使用的所有频率均大于305.18 Hz,因为一个16位整数对应的最大分频系数为65,535。100 kHz时基用于低于该频率的采样速率。进而,如果您指定的频率不能准确得到,驱动将采用最接近于您指定的采样率且高于您所指定的采样率
对E系列:
AI采样时钟分频系数 = 24位
AI转换时钟分频系数= 16位
AO采样时钟分频系数 = 24位
对M系列:
AI 采样时钟分频系数 = 32位
AI转换时钟分频系数 = 32位
AO采样时钟分频系数 = 32位
问题:
我设置采集的采样速率为500,001 Hz。如果我在LabVIEW中用NI-DAQmx编成,如何确定实际采样率?
解答:
您可以用DAQmx定时属性节点来获得此信息。SamplClk.Timebase.Rate属性提供了产生实际采样率的时基频率(timebase frequency)。大多数DAQ设备有两个时基频率:20 MHz和100 kHz。SamplClk.TimebaseDiv属性提供分频系数,用于从时基频率分频下来到您所希望的实际采样时钟频率。所以当您设置您的采样速率为500,001 Hz,设备利用20 MHz时基和分频系数39来获得实际的采样速率20 MHz/39 = 512,820.51 Hz 分频系数永远是一个整数,该整数的大小取决于您的数据采集板卡的型号。举个例子:假设分频系数是一个16位的整数,这样20 MHz时基允许您使用的所有频率均大于305.18 Hz,因为一个16位整数对应的最大分频系数为65,535。100 kHz时基用于低于该频率的采样速率。进而,如果您指定的频率不能准确得到,驱动将采用最接近于您指定的采样率且高于您所指定的采样率
另外,如果确实需要指定的采样率,也可以用外部的时钟源作为采样脉冲来进行数据采集。
其实更深入一点的话,在连续采集的应用程序中,数据采集时钟源的准确性问题就会显示出来,假设时钟源的误差是50ppm(百万分之五十),即二万分之一,而一天有86400秒,如果连续运行一天的话数据采集的时钟误差最多就会有4秒多,所以到了24小时后就会出现波形图上的时间与计算机时间差了大概4秒左右的现象,时间越长这个误差就可能越大,如果这个误差不能接受的话就需要想其它办法解决。其中一个方法是换一个更高精度的时钟源,但长时间运行的话始终还是会有误差的,之前用过的方法是到了0点的时候关闭任务再重新开启,让数据采集卡与计算机重新对时。