Сгенерируйте непрерывный и фоновые сигналы Используя устройства NI

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

Создайте DataAcquisition и добавьте каналы аналогового выхода

Используйте daq создать DataAcquisition. Этот пример использует модуль NI 9263 в Национальном Instruments® CompactDAQ Chassis NI cDAQ-9178. Это - модуль 2 в шасси. Выходные данные на трех каналах на уровне 10 000 сканов в секунду.

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

Создайте синхронизируемые сигналы

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

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

  • data0: 1 цикл синусоиды

  • data1: 1 цикл синусоиды с 45 задержками фазы степени

  • data2: 10 циклов синусоиды

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) = [];

На скорости генерации 10 000 сканов в секунду, можно ожидать наблюдать 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")