写这篇博客的主要问题是: 以前写了关于数据采集----为何使用数字输入端口不存在分频现象,而使用模拟输入端口采集数据时,编程
存在分频现象? 遗憾的是,如今找不到了!数组
------------------------------------------------------------------------------缓存
1. 数据采集的时候会不会丢失?spa
若是软件上读取数据的循环运行得不够快时,好比100K采样率的时候,软件循环确定没有这么快,数据是否是就丢失了?blog
首先,咱们要清楚的是,数据采集功能是由数据采集卡来完成的,软件知识将采集到的数据收到电脑上面来,数据采集卡有自身的办法内存
来解决硬件采集速度快过于软件读取速度的问题。博客
这须要对数据采集过程当中的数据的传输做一个介绍:外部的信号进入数据采集卡后,通过各类处理转换,先进入数据采集卡自身的it
缓冲区里面,缓冲区是先进先出(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点
的时候关闭任务再从新开启,让数据采集卡与计算机从新对时。