Esempio n. 1
0
from nidaqmx.task import Task
from nidaqmx import constants
import numpy as np
import matplotlib.pylab as plt

samp_rate = 1000000
sample_num = 1000000
duration = 1
time = np.linspace(0,duration,sample_num)

test_task = Task('ai_test')
test_task.ai_channels.add_ai_voltage_chan(physical_channel = '/Dev1/ai1',
                terminal_config = constants.TerminalConfiguration.DIFFERENTIAL)
test_task.timing.cfg_samp_clk_timing(rate =samp_rate,
                 #source = '/Dev1/ai/SampleClock', \
                 samps_per_chan = sample_num, 
                 sample_mode=constants.AcquisitionType.FINITE)
test_task.start()
ai_data = test_task.read(number_of_samples_per_channel  = sample_num)
plt.plot(time,ai_data)
test_task.wait_until_done()
test_task.stop()
test_task.close()
class read_writer():
    def __init__(self, freq, write_data, sample_rate, number_of_samples):
        """Function to read and write with the MyDAQ. Write data should be array with length equal to number_of_samples
       Make sure array does not exceed limits of MyDAQ as no safeguards are built into this function"""
        #if len(write_data) != number_of_samples:
        #    print("Wrong number of samples passed. Breaking now")
        #    return 0
        self.freq = freq
        self.__define_tasks__(write_data, sample_rate, number_of_samples)
        self.Nsamples = number_of_samples
        self.rate = sample_rate

    def __define_tasks__(self, write_data, sample_rate, number_of_samples):
        """Here we define the read and write tasks, including their timing"""
        self.readTask = Task()
        # Set channel to read from
        self.readTask.ai_channels.add_ai_voltage_chan(
            physical_channel='myDAQ1/ai0')
        self.readTask.ai_channels.add_ai_voltage_chan(
            physical_channel='myDAQ1/ai1')

        # Configure timing
        self.readTask.timing.cfg_samp_clk_timing(
            rate=sample_rate,
            samps_per_chan=number_of_samples,
            sample_mode=constants.AcquisitionType.FINITE)

        # We define and configure the write task
        self.writeTask = Task()
        # Set channel
        self.writeTask.ao_channels.add_ao_voltage_chan('myDAQ1/ao0')
        self.writeTask.ao_channels.add_ao_voltage_chan('myDAQ1/ao1')
        # Set timing
        self.writeTask.timing.cfg_samp_clk_timing(
            rate=sample_rate,
            samps_per_chan=number_of_samples,
            sample_mode=constants.AcquisitionType.FINITE)

        self.xarr_fit = np.linspace(0, number_of_samples / sample_rate,
                                    number_of_samples)
        self.yarr_fit = np.sin(2 * np.pi * self.freq * self.xarr_fit)
        #self.fitfreq = (number_of_samples / sample_rate)/5.
        #self.fit_data = 3*np.sin(2*np.pi*self.fitfreq*self.xarr_fit)
        self.writeTask.write([list(self.yarr_fit), list(write_data)])

    def __start__(self):
        """Here we start the writing and reading. We wait until reading is finished and then read the buffer from the DAQ"""
        self.readTask.start()
        self.writeTask.start()

        self.readTask.wait_until_done()
        self.writeTask.wait_until_done()
        # Acquire data
        self.__acquire__()
        self.__close__()
        self.__find_phi__()

    def __close__(self):
        """Here we shut the tasks explicitly. This function is called from the __start__ function"""
        # Close connection
        self.readTask.close()
        self.writeTask.close()

    def __acquire__(self):
        """Read the buffer into attribute self.data"""
        # Retrieve data
        self.input = self.readTask.read(
            number_of_samples_per_channel=self.Nsamples)

        self.data = self.input[1]
        self.fit_in = self.input[0]

    def __fit_call__(self, x, t0):
        return np.sin(2 * np.pi * self.freq * (x - t0))

    def __find_phi__(self):
        popt, pcov = curve_fit(self.__fit_call__,
                               self.xarr_fit[1000:],
                               self.fit_in[1000:],
                               p0=0,
                               maxfev=int(1e6))
        self.t0 = popt[0]

    def __output__(self):
        """Return a time array and the data"""
        # Prepare return data
        #time_arr = np.linspace(0, self.Nsamples/self.rate, self.Nsamples)
        t_arr = np.linspace(0, self.Nsamples / self.rate,
                            self.Nsamples) - self.t0
        return t_arr, np.array(self.data), self.t0

    freqarr = np.logspace(0, 3, 10)