1

总之,我正在尝试使用 Python 和 DAQmx Base 来记录模拟输入并从我的 USB 6009 设备生成模拟输出。我一直在使用我找到的包装器,并且能够获得 AI,但我在 AO 上苦苦挣扎。有一个基类 NITask 处理任务生成等。我正在调用的类如下。当我尝试配置时钟时,该函数会引发错误。当我不这样做时,没有错误,但输出上也没有产生电压。任何帮助,将不胜感激。

谢谢!

class AOTask(NITask):
    def __init__(self, min=0.0, max=5.0,
                 channels=["Dev1/ao0"],
                 timeout=10.0):
        NITask.__init__(self)

        self.min = min
        self.max = max
        self.channels = channels
        self.timeout = timeout
        self.clockSource ="OnboardClock"
        sampleRate=100
        self.sampleRate = 100
        self.timeout = timeout
        self.samplesPerChan = 1000
        self.numChan = chanNumber(channels)

        if self.numChan is None:
            raise ValueError("Channel specification is invalid")

        chan = ", ".join(self.channels)


        self.CHK(self.nidaq.DAQmxBaseCreateTask("",ctypes.byref(self.taskHandle)))
        self.CHK(self.nidaq.DAQmxBaseCreateAOVoltageChan(self.taskHandle, "Dev1/ao0", "", float64(self.min), float64(self.max), DAQmx_Val_Volts, None))
        self.CHK(self.nidaq.DAQmxBaseCfgSampClkTiming(self.taskHandle, "", float64(self.sampleRate), DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, uInt64(self.samplesPerChan)))

    """Data needs to be of type ndarray"""
    def write(self, data):
        nWritten = int32()
      #  data = numpy.float64(3.25)
        data = data.astype(numpy.float64)
        self.CHK(self.nidaq.DAQmxBaseWriteAnalogF64(self.taskHandle,
            int32(1000), 0,float64(-1),DAQmx_Val_GroupByChannel,
            data.ctypes.data,None,None))
      #  if nWritten.value != self.numChan:
      #  print "Expected to write %d samples!" % self.numChan
4

1 回答 1

1

您的问题涉及两个问题:

  1. 为什么会DAQmxBaseCfgSampClkTiming返回错误?
  2. 如果不使用该功能,为什么不生成任何输出?

1. 硬件与软件时序

rjb3 写道:

当我尝试配置时钟时,该函数会引发错误。当我不这样做时,没有错误,但输出上也没有产生电压。

您的程序收到错误是因为 USB 600x 设备不支持硬件定时模拟输出 [1]:

NI USB-6008/6009 有两个独立的模拟输出通道,可以产生 0 到 5 V 的输出。模拟输出通道的所有更新都是软件定时的。GND 是模拟输出通道的接地参考信号。

DAQmxBaseWriteAnalogF64“软件定时”是指程序在调用时按需编写样本。如果写入样本数组,则该数组一次写入一个。您可以从 DAQmx 帮助 [2] 中了解更多关于 NI 如何定义时序的信息。虽然该文档适用于 DAQmx,但同样的概念也适用于 DAQmx Base,因为行为是由设备而非驱动程序定义的。区别在于驱动程序实现了多少硬件功能——DAQmx 实现了所有功能,而 DAQmx Base 是一个小的选择子集。

2.软件定时无输出

rjb3 写道:

当我不这样做时,没有错误,但输出上也没有产生电压。

我不熟悉 DAQmx Base API 的 Python 绑定,但我可以推荐两件事:

  1. 尝试使用已安装的genVoltage.cC 示例并确认您可以在 ao 通道上看到电压。
  2. 尝试genVoltage.c使用 python 绑定进行移植。乍一看,我会尝试:
    • 使用DAQmxBaseStartTaskDAQmxBaseWriteAnalogF64
    • 或者autostart将调用中的参数设置DAQmxBaseWriteAnalogF64为 true。

参考

[1] NI USB-6008/6009 用户指南和规格 :: 模拟输出(第 16 页)
http://digital.ni.com/manuals.nsf/websearch/CE26701AA052E1F0862579AD0053BE19

[2]时序,硬件与软件
http://zone.ni.com/reference/en-XX/help/370466V-01/TOC11.htm

于 2014-10-05T17:40:37.977 回答