提起LABVIEW,就不能不涉及到数据采集和控制。
曾经在网上辩论过LV是不是通用编程语言,NI的创始人的一篇文章的标题就是“LV是通用语言吗”,这的确很难说,说它是通用语言,因为它的确具备了通用语言的基本能力,但是只能说是基本的,但是对很多VC容易实现的东西,在LV中却是个问题,尤其是系统相关的一些操作,所以,我个人更愿意认为,LABVIEW是倾向于测量和控制的硬件工程师的语言,它是语言,而不是一般意义上的专用软件,所以,LABVIEW逐渐成为工科院校学生的基本课程。
数据采集是LV最擅长的领域,对于开发过单片机的人来说,数据采集是再熟悉不过的了,如果想真正了解数据采集,就必须从AD,DA,COUNTER等转换芯片开始,数据采集卡不过是集合了各种AD,DA,COUNTER等芯片,结合专门的微处理器和总线通讯在一起,使板卡具有了综合采集功能。
数据采集卡都有AD转换精度,速度和通道数的指标。可以说AD是数据采集卡的基本功能。
A--ANOLOG 模拟量,D--DIGITAL 数字量 AD很多时候称做ADC,这里的C是CONVERTER,转换器。ADC--就是模拟量转换成数字量。数据采集卡最基本的ADC是电压转换成数字量,所以先从最经典的8位模数转换芯片0809谈起。
对ADC0809主要信号引脚的功能说明如下:
IN7~IN0——模拟量输入通道
ALE——地址锁存允许信号。对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。
START——转换启动信号。START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持 低电平。本信号有时简写为ST.
A、B、C——地址线。 通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。其地址状态与通道对应关系见表9-1。
CLK——时钟信号。ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。通常使用频率为500KHz的时钟信号
EOC——转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。
D7~D0——数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。D0为最低位,D7为最高
OE——输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。
VCC—— +5V电源。
Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5V(Vref(+)=+5V, Vref(-)=-5V).
可以看出ADC0809四个关键部分组成,译码器、多路开关、AD转换器和三态门电路组成。
首先通过译码器,指定通道,然后多路开关打开,(好的AD有采样保持电路),外部电压进入ADC0809。
START信号有高到抵,在脉冲的下降沿ADC0809开始转换,同时状态管脚EOC自动变低,表示转换正在进行,每个时钟CLK的脉冲转换一位。
转换完成后,EOC自动变高。
如果在START端外部也加一个时钟,这样ADC0809就可以自动不断地采集数据。START每个时钟的下降沿,都会采集一个数据,如果需要采集1000个数据,START端只需要有1000个脉冲就可以了。
对于一般的数据采集板卡,都支持单点、多定点和连续采集三种方式。
所谓单点,就是通过软件给定START一个下降沿信号,产生一次数据采集结果。
所谓多顶点,就是给定START端一个固定次数的脉冲,产生固定次数的数据采集结果。
所谓连续采集,就是给定START端一个持续不断地脉冲。
对于连续采集,一般都要设定两个参数,SAMPLE RATE 采样频率和samples per channel(每通道采样数),针对0809,采样频率对应START端脉冲的频率。而每通道采样数则是另外一个问题。
连续采样的结果是在计算机中还是在板卡上那,答案是在计算机的内存缓冲区中。
容易混淆的概念是板卡上也有也有一个先入先出的BUFFER,板卡采集的数据首先被放入到这个BUFFER中,然后板卡一次性把多个数据通过DMA(直接内存访问)转送到内存缓冲区中.
数据采集程序经常遇到的问题是提示错误,数据被覆盖的错误,这是如何产生的那?
一般板卡的数据缓冲区是分成两个区域,一个是准备好的数据供计算机读取,
另一个区域是板卡不断地把硬件FIFO的数据通过DMA传送到计算机内存缓冲区,当这部分区域满的时候,如果另一部分的数据已经被计算机读取空闲,则把这部分的数据转移到空闲区域.如果上一次的数据未被计算机读取,则会发生数据覆盖错误.
假如SAMPLE RATE=10000,SAMPLES PER CHANNEL=1000,表示计算机每次读1000个数据,则每秒需要循环的次数=10000/1000=10,也就是必须保证100MS读一次,如果在读取数据后需要处理或者写文件等操作超过100MS,则导致下一次的数据未来得急读取,因此发生覆盖错误.
通过ADC0809我们了解了模数转换的基本知识,后续的文章中将通过DAC0832介绍DA,8254介绍计数器,8255介绍数字IO,只有深入了解了这些基本原理,才能真正理解板卡是如何采集的