Генерируйте непрерывные и фоновые сигналы с помощью NI-устройств

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

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

Использование 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

Чтобы динамически сгенерировать выходные данные с помощью функции MATLAB, присвойте функцию ScansRequiredFcn DataAcquisition. Приведенный ниже код функционально эквивалентен 'repeatoutput'

dq.ScanRequiredFunction = (src,evt) write(src, repmat([data0, data1, data2], 5, 1));

start(dq, "continuous")