exponenta event banner

Генерирование непрерывных и фоновых сигналов с помощью устройств NI

В этом примере показано, как генерировать аналоговые выходные данные с помощью неблокирующих команд. Это позволяет продолжить работу в окне команд MATLAB во время генерации. Это называется фоновой генерацией. Используйте генерацию основной системы, чтобы заставить MATLAB дождаться завершения всей генерации данных, прежде чем можно будет выполнить следующую команду.

Создание сбора данных и добавление аналоговых выходных каналов

Использовать daq для создания DataAcquisition. В этом примере используется модуль NI 9263 в National Instruments ® CompactDAQ Chassis NI cDAQ-9178. Это модуль 2 в корпусе. Вывод данных по трем каналам со скоростью 10000 сканирований в секунду.

dq = daq("ni");
dq.Rate = 10000;
addoutput(dq, "cDAQ1Mod2", 0:2, "Voltage");

Создание синхронизированных сигналов

Формирование выходных сигналов путем создания шаблона данных, который многократно записывается в устройство вывода. Данные для каждого канала основаны на столбцах, и выходные сигналы синхронизируются с общим тактовым сигналом.

Создайте 3 формы сигнала:

  • data01 цикл синусоидальной волны

  • data11 цикл синусоидальной волны с 45-градусным фазовым запаздыванием

  • data210 циклов синусоидальной волны

data0 = sin(linspace(0, 2*pi, 1001))';
data1 = sin(linspace(0, 2*pi, 1001) + pi/4)';
data2 = sin(linspace(0, 2*pi*10, 1001))';

Вышеупомянутая форма сигнала содержит sin (0) и sin (2 * pi). Для последовательного повторения формы сигнала опустите конечную точку.

data0(end) = [];
data1(end) = [];
data2(end) = [];

При частоте генерации 10000 сканирований в секунду можно ожидать наблюдения data0 и data1 как 10 Гц синусоидальные волны и data2 в виде синусоидальной волны 100 Гц.

subplot(3,1,1)
plot(data0)
title('data0')
grid on
subplot(3,1,2)
plot(data1)
title('data1')
grid on;
subplot(3,1,3)
plot(data2)
title('data2')
grid on;

Постановка в очередь выходных данных и запуск фоновой генерации

Перед началом непрерывной генерации, preload полсекунды данных. Использовать start немедленно инициировать генерацию и вернуть управление в командную строку, позволяя выполнять другие операции в MATLAB, пока генерация выполняется в фоновом режиме.

preload(dq,repmat([data0, data1, data2], 5, 1));
start(dq, "repeatoutput")

Использовать pause в цикле для контроля количества сканирований, выводимых аппаратными средствами за время генерации.

t = tic;
while toc(t) < 1.0
    pause(0.1)
    fprintf("While loop: scans output by hardware = %d\n", dq.NumScansOutputByHardware)
end

fprintf("Generation has terminated with %d scans output by hardware\n", dq.NumScansAcquired);
While loop: scans output by hardware = 1109
While loop: scans output by hardware = 2089
While loop: scans output by hardware = 3100
While loop: scans output by hardware = 4095
While loop: scans output by hardware = 5093
While loop: scans output by hardware = 6094
While loop: scans output by hardware = 7082
While loop: scans output by hardware = 8082
While loop: scans output by hardware = 9088
While loop: scans output by hardware = 10099
Generation has terminated with 0 scans output by hardware

Остановить непрерывную фоновую генерацию

Фоновая генерация выполняется одновременно с другими операциями в MATLAB. Явный вызов stop для завершения фоновой генерации.

stop(dq)

Динамическая генерация выходных данных с использованием функций MATLAB

Чтобы динамически генерировать выходные данные с помощью функции MATLAB, присвойте функцию ScansRequiredFcn DataAcquisition. Приведенный ниже код функционально эквивалентен 'repeatoutput'

dq.ScanRequiredFunction = (src,evt) write(src, repmat([data0, data1, data2], 5, 1));

start(dq, "continuous")