Этот пример показывает, как сгенерировать команды неблокирования использования данных об аналоговом выходе. Это позволяет вам продолжать работать в окне команды MATLAB во время генерации. Это называется фоновой генерацией. Используйте приоритетную генерацию, чтобы заставить MATLAB ожидать целой генерации данных, чтобы завершиться, прежде чем можно будет выполнить следующую команду. Узнайте больше о приоритетной генерации в, Генерируют Сигналы на устройствах NI то Выходное напряжение.
Используйте daq.getDevices
, чтобы отобразить список устройств, доступных вашей машине и MATLAB®. Поскольку этот пример использует NI-9263 с устройством ID 'cDAQ1Mod2'. Выходные данные на 3 каналах на уровне 10 000 сканирований в секунду.
s = daq.createSession('ni'); addAnalogOutputChannel(s,'cDAQ1Mod2', 0, 'Voltage'); addAnalogOutputChannel(s,'cDAQ1Mod2', 1, 'Voltage'); addAnalogOutputChannel(s,'cDAQ1Mod2', 2, 'Voltage'); s.Rate = 10000;
Сгенерируйте выходные сигналы путем создания шаблона данных, которые неоднократно ставятся в очередь к устройству вывода. Данные для каждого канала являются базирующимся столбцом, и выходные сигналы синхронизируются друг с другом.
Создайте 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))';
Вышеупомянутый код создает 1 001 форму волны точки. Это вызвано тем, что linspace включает конечные точки, у нас будут точка данных для sin (0) и точка данных для sin (2*pi). Чтобы поддержать когерентный сигнал, мы удаляем последнюю точку, чтобы закончиться с 1 000 точек на форму волны.
data0(end) = []; data1(end) = []; data2(end) = [];
Обратите внимание на то, что мы устанавливаем сеанс, чтобы запуститься на уровне 10 000 сканирований в секунду. Поскольку каждый цикл выходных синусоид является 1 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;
Прежде, чем запустить непрерывную генерацию, очередь половина секунды данных к буферу устройства аналогового выхода. Затем вызовите startBackground
. Сеанс ожидает, что выходные данные с очередями будут базирующимся столбцом со столбцом данных для каждого выходного канала, добавленного к вашему сеансу.
Команда startBackground
запускает генерацию и возвращает управление в командную строку сразу, позволяя вам сделать другие операции в MATLAB, в то время как генерация запускается в фоновом режиме.
queueOutputData(s,repmat([data0, data1, data2], 5, 1)); s.startBackground();
Можно запустить другие команды MATLAB, в то время как генерация запускается, или опционально вызовите wait
без аргумента, который значения по умолчанию к бесконечному времени ожидания. Команда wait
возвращается, как только фоновая генерация завершается.
s.wait()
Когда вы генерируете данные в фоновом режиме, можно обеспечить направления сеанса приобретения, чтобы обработать исходящие данные, с помощью прослушивателей и событий. Например, можно постоянно генерировать выходной сигнал путем постановки в очередь выходных данных неоднократно. Событие DataRequired имеет место, указывая, что мы должны поставить больше данных в очередь к устройству. Прослушиватель может ответить на то событие и инициировать заданную функцию.
Используйте addListener, чтобы добавить анонимную функцию в сеанс и присвоить его событию DataRequired. Событие вызывает анонимную функцию неоднократно, чтобы поставить больше данных в очередь к очереди вывода, таким образом создавая непрерывную генерацию сигнала.
Сохраните указатель прослушивателя в переменной lh
, которую вы удалите позже.
lh = addlistener(s,'DataRequired', ... @(src,event) src.queueOutputData([data0, data1, data2]));
Для непрерывной генерации:
Установите сеанс на непрерывный режим
Поставьте выходные данные в очередь
вызовите startBackground
s.IsContinuous = true; queueOutputData(s,repmat([data0, data1, data2], 5, 1)); s.startBackground();
Примечание: В непрерывной генерации, всегда кормите соответствующими данными устройство. Если у выходные данные на уровне намного выше, чем объем данных, который вы ставите в очередь к устройству, устройству, можно закончиться данные, чтобы вывести, приведя к ошибке потери значимости. Обратитесь к документации CompactDAQ для получения дополнительной информации.
Непрерывная генерация запускается параллельно с другими операциями в MATLAB. Явным образом вызовите stop
, чтобы закончить фоновую генерацию. Удалите прослушиватель в конце.
s.stop(); delete(lh);
Чтобы динамически сгенерировать выходные данные с помощью функции MATLAB вместо простой одной анонимной функции строки добавляют обработчик событий прослушивателя.
lh = addlistener(s,'DataRequired', @myFunction); function myFunction(src, event) % Your algorithm to dynamically generate the data % queueOutputData(src,[data0, data1, data2]); end