使用 PyUL 进行数据采集

日期2018-12-12(最后修改),2006-11-06(创建)

简介

此页面说明了如何使用价格低廉(约 190 美元)的 PMD USB-1208FS 数据采集设备,该设备来自 Measurement Computing。它利用了 PyUniversalLibrary,这是一个 Measurement Computing 的 通用库 的开源包装器。

另请参阅 使用 Ni-DAQmx 进行数据采集

以下示例使用 PyUL Release 20050624 制作。此版本的 预编译的 win32 二进制文件Enthought Edition of Python 2.4(Release 1.0.0,2006-08-02 12:20)兼容,这些示例就是使用它运行的。

示例 1 - 简单模拟输入

第一个示例说明了如何使用无缓冲模拟输入

在 [ ]
# example1.py
import UniversalLibrary as UL
import time

BoardNum = 0
Gain = UL.BIP5VOLTS
Chan = 0

tstart = time.time()
data = []
times = []
while 1:
    DataValue = UL.cbAIn(BoardNum, Chan, Gain)
    data.append( DataValue )
    times.append( time.time()-tstart )
    if times[-1] > 1.0:
        break

import pylab
pylab.plot(times,data,'o-')
pylab.xlabel('time (sec)')
pylab.ylabel('ADC units')
pylab.show()

当我运行它时,我有一个函数发生器,它生成一个正弦波,连接到设备的引脚 1 和 2。这应该生成如下所示的图形

示例 2 - 获取电压而不是任意单位

示例 1 中记录的值是“ADC 单位”,即模拟到数字硬件直接记录的值。实际上,该设备具有一个 12 位 A 到 D 转换器,但这些值存储为 16 位有符号整数。为了将这些值转换为伏特,我们使用 Measurement Computing 的函数。在这里,我们对每条数据都执行此操作,并绘制结果。

在 [ ]
#example2.py
import UniversalLibrary as UL
import time

BoardNum = 0
Gain = UL.BIP5VOLTS
Chan = 0

tstart = time.time()
data = []
times = []
while 1:
    DataValue = UL.cbAIn(BoardNum, Chan, Gain)
    EngUnits = UL.cbToEngUnits(BoardNum, Gain, DataValue)
    data.append( EngUnits )
    times.append( time.time()-tstart )
    if times[-1] > 1.0:
        break

import pylab
pylab.plot(times,data,'o-')
pylab.xlabel('time (sec)')
pylab.ylabel('Volts')
#pylab.savefig('example2.png',dpi=72)
pylab.show()

现在输出值以伏特为单位。

示例 3 - 缓冲输入

如您所见,上面的图不是非常“纯净”的正弦波。这无疑是由于我们采样数据的方式。我们不是依靠稳定的时钟来进行采集,而是尽可能快地轮询设备(以及操作系统)。有一个更好的方法 - 我们可以使用测量计算设备上的时钟来获取以均匀间隔采样的数据缓冲区。

在 [ ]
#example3.py
import UniversalLibrary as UL
import Numeric
import pylab

BoardNum = 0
Gain = UL.BIP5VOLTS

LowChan = 0
HighChan = 0

Count = 2000
Rate = 3125

Options = UL.CONVERTDATA
ADData = Numeric.zeros((Count,), Numeric.Int16)

ActualRate = UL.cbAInScan(BoardNum, LowChan, HighChan, Count,
                      Rate, Gain, ADData, Options)

# convert to Volts
data_in_volts = [ UL.cbToEngUnits(BoardNum, Gain, y) for y in ADData]

time = Numeric.arange( ADData.shape[0] )*1.0/ActualRate

pylab.plot(time, data_in_volts, 'o-')
pylab.xlabel('time (sec)')
pylab.ylabel('Volts')
pylab.savefig('example3.png',dpi=72)
pylab.show()

输出看起来好多了:

示例 4 - 计算功率谱

现在我们可以使用 pylab(matplotlib 的一部分)中的函数来计算功率谱密度。

在 [ ]
#example4.py
import UniversalLibrary as UL
import Numeric
import pylab

BoardNum = 0
Gain = UL.BIP5VOLTS

LowChan = 0
HighChan = 0

Count = 2000
Rate = 10000

Options = UL.CONVERTDATA
ADData = Numeric.zeros((Count,), Numeric.Int16)

ActualRate = UL.cbAInScan(BoardNum, LowChan, HighChan, Count,
                      Rate, Gain, ADData, Options)
time = Numeric.arange( ADData.shape[0] )*1.0/ActualRate

# convert to Volts
data_in_volts = [ UL.cbToEngUnits(BoardNum, Gain, y) for y in ADData]
data_in_volts = Numeric.array(data_in_volts) # convert to Numeric array

pxx, freqs = pylab.psd( data_in_volts, Fs=ActualRate )
decibels = 10*Numeric.log10(pxx)
pylab.subplot(2,1,1)
pylab.plot(time[100:200],data_in_volts[100:200],'o-') # plot a few samples
pylab.xlabel('time (sec)')
pylab.ylabel('Volts')
pylab.subplot(2,1,2)
pylab.plot(freqs, decibels, 'o-')
pylab.xlabel('frequency')
pylab.ylabel('Power (decibels)')
pylab.savefig('example4.png',dpi=72)
pylab.show()

在这个例子中,我已经将函数发生器的频率提高到 480 Hz。您可以看到,psd() 函数确实告诉了我们这一点。

章节作者:AndrewStraw,Chris Waigl

附件