微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 测试测量 > 虚拟仪器 > 循环采集波形的疑问?

循环采集波形的疑问?

时间:12-13 整理:3721RD 点击:
石博强的书上强调两个原则:
1)程序从缓存区读取数据的速度不能比数据放进缓存区的速度快
2)程序从缓存区取数据的速度不能太慢
这两点我都同意,由1)我得出读数的速度要小于等于存数的速度
由2)假设读数的速度小于存数的速度,那么总有一个时刻会出现没来得及取数的情况!
所以我认为应该是 读数的速度=存数的速度!
不知道这样的理解对不对?他书上举例正好和我这个推论一样,缓存区容纳4000次扫描
的数据,每秒1000次的采样率向缓存区输入数据,一次读取的数据设置为1000个扫描。
我现在先用VC6编个测试程序测试一下自制的ISA数据采集卡是否工作正常,因为采集卡
是采集的工频信号,每个周波采集32个点,那么1秒钟就有1600个数据。我让显示程序
每次显示160个数据,每100ms刷新一次,理论上正好合适。但是由于SetTimer定时难免
不准,所以有些担心,是否会出现违背以上两个原则的情况。
请大家帮我分析一下方案可行与否?
.68

读buffer的速度=写buffer的速度是个很好理解的事情,
石的书还扯出所谓的两个原则我觉得就是故弄玄虚。
采集的速度小于写buffer的速度的话会buffer溢出,大于写buffer速度的话
buffer里面没那么多点。
你看AI buffer read的例子,每次读N个点的值到buffer,是没有设定具体时间间隔
的。每次循环的时间间隔是靠硬件决定的,采到N个点就执行一次循环,避免了定时
的不准确导致丢点。采集卡实际的fs本来就是离散的,不一定能达到你软件设定
的精度。要循环定时的话,可以每次完全读取buffer数据,不需要指定具体点数。
.178

你的想法是实时显示所有采集到的点,一个点也不希望落下。说一下我对它的理解,和大
家讨论一下。
比如说有一个50Hz的信号,采样频率是1600 Samples/s, 这样每个周期有32个点。
那么你最快的实时显示速度是:
1.采集时间 = 20ms (1600 Samples/s * 20ms = 32 samples)
2.传输时间  (32 Samples * (1 Channel) *(2 Bytes/Sample)/ISA总线的传输速度)
[如果是8位的采集卡就是1Byte/Sample, 如果是12位,16位就是2Bytes/Sample]
3.数据处理及显示时间
4.其它时间 (包括设置采集卡进行下一次的数据采集等以及由于windows非实时特性引起
的延时等)
这样你最快的实时显示速度=1/(采集时间+传输时间+数据处理及显示时间+其它时间

由于你的采样点比较少,传输时间+数据处理及显示时间+其它时间应该小于采集时间(
20ms)。所以应该能达到25Hz的实时显示速度。
就是说一个周期的信号采集,需要下一个周期的时间来进行处理。在理论上可以两者并行
处理,在采集下一个周期信号的同时处理和显示上一个周期的信号,我没有这方面的经验
(是不是取决于采集卡的厂商提供相关功能?),我对此很感兴趣的说,如果哪位大侠有
经验的话欢迎指教。另外你自己做的卡应该有更多的自由度,呵呵
.42

同意.书上那段话定义不严格.其实不是什么写入读出速度.而是采样时间和传输处理时间.
采样时间还应该把采样间隔考虑进去.比如AD也许100微秒就够了,但在1Khz采样率下,采样
时间应该认为是1ms.
你要想连续采样就要求传输和处理的时间小于或等于(这个很难实现,除非卡上和计算机用
完全相同的时钟信号)采样时间.
先考虑没有板上缓存的情况.这个就简单了.看看eaglebear的计算就明白了.
如果有缓存,那么一般的卡是在缓存填满后发出满中断(或者设置一个flag.用中断比较多)
.让计算机来取数据.显然,在采样的时候不需要计算机做什么.可以让计算机干其他的工作
,比如数据处理什么的.这也是中断的好处.等缓存满了以后,计算机去取数据.然后又可以干
其他活了.呵呵比如显示传来的数据...
这种方式的问题在于,**你传整个缓存的时间必须小于>单个点<的采样时间!** 否则.如果
缓存是1000个点.你这1000点是连续的.但1001点就可能丢失.DMA之类的办法可以用来加快
传输,不过你仍然不能保证你不丢点.
比较好的解决办法是半满中断.就是在卡上设置两个中断:不但缓存满的时候发出满中断,而
且当缓存半满的时候也发半满中断.在程序里面开两个缓冲区域.半满中断的时候,把前一半
缓存传入.满中断的时候则把后一半缓存传入另外一个缓冲区.这样速度要求就变成了在采
集一半数据点的时间里面要完成一半数据点的传输...it is too easy for today's comp
uter:) 中断完成后的时间里你就去把缓冲区里面的数据按顺序显示或者存盘.
到目前为止,我用过的卡里面就NI的卡是支持这种半满中断的.他们在说明书里面管编这种
连续采集的方法叫"double buffer".很适合做长时间的连续采集.
连续采集也可以用双端口RAM来做.就是可以一边写一边读的缓存. (半满中断的实质是把普
通缓存变成一半读一半写).如果贴主引用的话是书的作者讨论双端口RAM的时候说的,那倒
是对的.否则就有点可笑了.
.70

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top