Этот пример показывает, как сгенерировать аналоговые выходные данные с помощью команд, не блокирующих. Это позволяет вам продолжать работу в командном окне 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 формы волны:
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) = [];
При скорости генерации 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, присвойте функцию ScansRequiredFcn
DataAcquisition. Приведенный ниже код функционально эквивалентен 'repeatoutput'
dq.ScanRequiredFunction = (src,evt) write(src, repmat([data0, data1, data2], 5, 1));
start(dq, "continuous")