USB6009的模拟输出使用基于Mac OSX的python和NIDAQmx

时间:2014-01-21 05:19:39

标签: python-2.7 osx-mountain-lion nidaqmx

全部, 我正在尝试使用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

1 个答案:

答案 0 :(得分:1)

您的问题涉及两个问题:

  1. 为什么DAQmxBaseCfgSampClkTiming会返回错误?
  2. 不使用该功能,为什么没有生成任何输出?
  3. 1。硬件与软件时序

      

    rjb3写道:

         
        

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

      

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

      
        

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

      

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

    2。软件定时时没有输出

      

    rjb3写道:

         
        

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

      

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

    1. 尝试使用已安装的 genVoltage.c C示例并确认您可以在ao频道上看到电压。
      • 示例安装在此处:/Applications/National Instruments/NI-DAQmx Base/examples
      • 如果您看到输出,则表明您已确认设备和驱动程序正常工作,并且该错误可能出现在python文件中。
      • 如果您没有看到输出,那么设备或驱动程序就会出现问题,而http://forums.ni.com的NI论坛就是帮助排除故障的最佳位置。
    2. 尝试使用python绑定移植 genVoltage.c 。乍一看,我会尝试:
      • DAQmxBaseStartTask
      • 之前使用DAQmxBaseWriteAnalogF64
      • 将您对autostart的调用中的DAQmxBaseWriteAnalogF64参数设置为true。
    3. 参考

      [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