Одновременно Получите и Сгенерируйте Произвольные Периодические Формы волны с помощью Digilent® Analog Discovery™

В этом примере показано, как использовать функциональный преобразователь, чтобы сгенерировать произвольную функцию формы волны на уровне 1 кГц и данных записи одновременно, с помощью канала аналогового входа. Область значений выходного напряжения исходящего сигнала-5.0 к +5.0 вольтам. Этот пример использует основанный на сеансе интерфейс с Аналоговым оборудованием Открытия Digilent.

Узнайте устройства Digilent

Узнайте устройства Digilent, соединенные к вашей системе с помощью daq.getDevices

daq.getDevices()
ans = 

Data acquisition devices:

index   Vendor    Device ID                            Description                           
----- ----------- --------- -----------------------------------------------------------------
1     digilent    AD1       Digilent Inc. Analog Discovery Kit Rev. C
2     directsound Audio0    DirectSound Primary Sound Capture Driver
3     directsound Audio1    DirectSound Primary Sound Driver

Создайте сеанс

s = daq.createSession('digilent')
s = 

Data acquisition session using Digilent Inc. hardware:
   Will run for 1 second (10000 scans) at 10000 scans/second.
   No channels have been added.
   

Добавьте канал функционального преобразователя

Добавьте канал функционального преобразователя с ID устройства AD1 и ID канала 1. Установите тип формы волны на Arbitrary.

fgenCh = addFunctionGeneratorChannel(s, 'AD1', 1, 'Arbitrary')
fgenCh = 

Data acquisition arbitrary waveform generator '1' on device 'AD1':

       WaveformData: [4096x1 double]
              Range: -5.0 to +5.0 Volts
     TerminalConfig: SingleEnded
               Gain: 1
             Offset: 0
          Frequency: 4096
       WaveformType: Arbitrary
     FrequencyLimit: [0.0001 25000000.0]
               Name: ''
                 ID: '1'
             Device: [1x1 daq.di.DeviceInfo]
    MeasurementType: 'Voltage'


Задайте функцию формы волны, чтобы быть суммой синусоид

Функциональный преобразователь производит периодические выходные параметры путем повторной генерации содержимого его буфера (4 096 точек). Форма волны создается, чтобы заполнить этот буфер без повторения.

buffersize = 4096;
len = buffersize + 1;

f0 = 1;
f1 = 1 * f0;
f2 = 2 * f0;
f3 = 3 * f0;

waveform  = sin(linspace(0, 2*pi*f1, len)) + ...
            sin(linspace(0, 2*pi*f2, len)) + ...
            sin(linspace(0, 2*pi*f3, len));

A = 5;
waveform = A*waveform./max(abs(waveform));
waveform(end) = [];

Установите данные о форме волны канала

fgenCh.WaveformData = waveform;

Установите частоту канала к 1 KHz

frate = 1000;
fgenCh.Frequency = frate;

Добавьте канал аналогового входа

Добавьте канал аналогового входа с ID устройства AD1 и ID канала 1. Установите тип измерения на Voltage.

aiCh = addAnalogInputChannel(s, 'AD1', 1, 'Voltage')
aiCh = 

Data acquisition analog input voltage channel '1' on device 'AD1':

       Coupling: DC
 TerminalConfig: Differential
          Range: -25 to +25 Volts
           Name: ''
             ID: '1'
         Device: [1x1 daq.di.DeviceInfo]
MeasurementType: 'Voltage'


Задайте уровень приобретения для сеанса

Получите данные на более высоком уровне, чем самая высокая частота в сгенерированной форме волны (сверхдискретизируйте фактором 50),

oversamplingratio = 50;
nyquistrate = 2 * frate;
s.Rate = oversamplingratio * nyquistrate;

Задайте длительность приобретения/генерации для сеанса

s.DurationInSeconds = 3;

Сгенерируйте периодическую функцию формы волны и вход записи одновременно

[data, timestamps] = startForeground(s);

Постройте функцию формы волны, которая будет сгенерирована функциональным преобразователем

% Plot parameters
k = 5;
period = 1/frate;
numperiods = k * period;

% Desired waveform
wavedesired = repmat(waveform', k, 1);
tsamples = linspace(0, numperiods, k * buffersize)';

fig = figure;
subplot(311)
plot(tsamples, wavedesired);
xlabel('Time (seconds)'); ylabel('Voltage (Volts)');
title('Desired Waveform: sin(2\pi*1000t) + sin(2\pi*2000t) + sin(2\pi*3000t)');
axis([0 numperiods -A A])

% Acquired waveform
subplot(312)
plot(timestamps, data);
xlabel('Time (seconds)'); ylabel('Voltage (Volts)');
title('Acquired Waveform');
axis([0 numperiods -A A])

% Frequency-Domain Plot (using fft)

L = 2 * oversamplingratio * buffersize;
Fs = s.Rate;
NFFT = 2^nextpow2(L);
Y = fft(data, NFFT)/L;
f0 = (Fs/2) * linspace(0, 1, NFFT/2 + 1);

plotScaleFactor = 12;
plotRange = NFFT / 2; % Plot is symmetric about n/2
plotRange = floor(plotRange / plotScaleFactor);

Yplot = Y(1:plotRange);
fplot = f0(1:plotRange);

% Plot single-sided amplitude spectrum.
subplot(313)
stem(fplot, 2*abs(Yplot));
title('Single-Sided Amplitude Spectrum of Waveform')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
axis tight

Для просмотра документации необходимо авторизоваться на сайте