Этот пример показывает, как получить аналоговые входные данные с помощью команд, не блокирующих. Это позволяет вам продолжать работу в командном окне MATLAB во время сбора. Это называется фоновым приобретением. Используйте приобретение переднего плана, чтобы MATLAB ждал завершения всего сбора, прежде чем можно будет выполнить следующую команду.
Использование daq
для создания объекта DataAcquisition и addinput
чтобы добавить к нему входа канал. Этот пример использует модуль NI 9205 в National 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 для непрерывного получения. Прослушиватель обнаруживает событие 1V и вызывает stop
.
start(dq, "continuous");
Использование pause
в цикле, чтобы контролировать количество сканов, полученных на время сбора. Обратите внимание, что строка состояния, отображаемая ScansAvailableFcn
может находиться перед последней строкой состояния, отображаемой циклом while.
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