В этом примере показано, как получить команды неблокирования использования данных об аналоговом входе. Это позволяет вам продолжать работать в окне команды MATLAB во время захвата. Это называется фоновым захватом. Используйте приоритетный захват, чтобы заставить MATLAB ожидать целого захвата, чтобы завершиться, прежде чем можно будет выполнить следующую команду.
Используйте daq
создать объект DataAcquisition и addinput
чтобы добавить вход образовывают канал к нему. Этот пример использует модуль NI 9205 в Национальном Instruments® CompactDAQ Chassis NI cDAQ-9178. Это - модуль 1 в шасси.
dq = daq("ni"); addinput(dq, "cDAQ1Mod1", "ai0", "Voltage"); dq.Rate = 2000;
Во время фонового захвата DataAcquisition может обработать полученные данные в заданном способе использовать ScansAvailableFcn
свойство.
dq.ScansAvailableFcn = @(src,evt) plotDataAvailable(src, evt);
По умолчанию ScansAvailableFcn называется 10 раз в секунду. Измените ScansAvailableFcnCount
свойство уменьшить частоту вызова. ScansAvailableFcn будет назван, когда накопленное число точек превысит это значение. Установите ScansAvailableFcnCount на уровень, который приводит к одному вызову ScansAvailableFcn в секунду.
dq.ScansAvailableFcnCount = 2000;
Используйте start
запустить фоновый захват.
start(dq, "Duration", seconds(5))
Нет никаких других вычислений, чтобы выполнить, и захват собирается запуститься в течение целых пяти секунд. Используйте pause
в цикле, чтобы контролировать количество сканов, полученных за длительность захвата.
while dq.Running pause(0.5) fprintf("While loop: Scans acquired = %d\n", dq.NumScansAcquired) end fprintf("Acquisition stopped with %d scans acquired\n", dq.NumScansAcquired);
While loop: Scans acquired = 1000
Получайте постоянно, пока особое условие не соблюдают. В этом примере получите, пока сигнал не равняется или превышает 1 В.
dq.ScansAvailableFcn = @(src,evt) stopWhenEqualsOrExceedsOneV(src, evt);
Сконфигурируйте DataAcquisition, чтобы получать постоянно. Прослушиватель обнаруживает 1-вольтовое событие и вызывает stop
.
start(dq, "continuous");
Используйте pause
в цикле, чтобы контролировать количество сканов, полученных за длительность захвата. Обратите внимание на то, что строка состояния, отображенная ScansAvailableFcn
может появиться перед последней строкой состояния, отображенной циклом с условием продолжения.
while dq.Running pause(0.5) fprintf("While loop: Scans acquired = %d\n", dq.NumScansAcquired) end fprintf("Acquisition has terminated with %d scans acquired\n", dq.NumScansAcquired); dq.ScansAvailableFcn = [];
While loop: Scans acquired = 1000 Detected voltage exceeds 1V: stopping acquisition While loop: Scans acquired = 2000 Acquisition has terminated with 2000 scans acquired
function plotDataAvailable(src, ~) [data, timestamps, ~] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix"); plot(timestamps, data); end function stopWhenEqualsOrExceedsOneV(src, ~) [data, timestamps, ~] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix"); if any(data >= 1.0) disp('Detected voltage exceeds 1V: stopping acquisition') % stop continuous acquisitions explicitly src.stop() plot(timestamps, data) else disp('Continuing to acquire data') end end
While loop: Scans acquired = 2200 While loop: Scans acquired = 3200 While loop: Scans acquired = 4200 While loop: Scans acquired = 5200 While loop: Scans acquired = 6200 While loop: Scans acquired = 7200 While loop: Scans acquired = 8200 While loop: Scans acquired = 9200 While loop: Scans acquired = 10000 Acquisition stopped with 10000 scans acquired