Согласно документации о поддерживаемом оборудовании , версия 2.8 или выше Data Acquisition Toolbox необходима для поддержки устройства Measurement Computing USB-1024HLS. Предполагая, что у вас версия 2.8 или новее, следующее решение должно приблизиться к вам ...
Первым шагом будет получение идентификатора оборудования для устройства. Функция DAQHWINFO должна помочь с этим:
deviceInfo = daqhwinfo('mcc');
Идентификатор оборудования, полученный из структуры deviceInfo , затем можно использовать для создания объекта цифрового ввода-вывода (DIO) с помощью функции DIGITALIO :
dio = digitalio('mcc',hardwareID);
Далее необходимо добавить две выходные строки (для тактового сигнала и сигнала широтно-импульсной модуляции (ШИМ)), используя ADDLINE :
addline(dio,0:1,'out');
Затем вам нужно установить несколько свойств DIO.
set(dio,'TimerPeriod',0.000002); % i.e. 500 kHz
set(dio,'TimerFcn',@update_outputs);
Функция update_outputs вызывается один раз в каждый период таймера и должна устанавливать выходные выводы на соответствующие значения. Тактовый сигнал просто будет переключаться между 0 и 1 каждый период таймера. Сигнал PWM , вероятно, будет также чередоваться между 0 и 1, но он не будет меняться каждый период таймера, оставаясь в каждом состоянии в течение заданного промежутка времени, в зависимости от типа широтно-импульсной модуляции, которую вы хотите. Вот как может выглядеть ваша update_outputs функция:
function update_outputs(obj,event)
currentValues = getvalue(obj);
clockValue = ~currentValues(1);
pwmValue = pwm_compute();
putvalue(obj,[clockValue pwmValue]);
end
Обратите внимание, что здесь используются PUTVALUE и GETVALUE для установки / получения значений выходных контактов. Вам нужно будет написать функцию pwm_compute так, чтобы она вычисляла новое значение ШИМ для каждого периода времени. Поскольку pwm_compute , вероятно, придется знать, сколько значений уже было выведено (т. Е. Сколько раз оно уже было вызвано), вы можете отследить это, используя постоянную переменную :
function newValue = pwm_compute
persistent nValues;
if isempty(nValues)
nValues = 0;
else
nValues = nValues+1;
end
...
% Compute the new value for the (nValues+1) time period
...
end
Это только одно из возможных решений. Вы можете предварительно вычислить сигнал ШИМ и извлечь значение для каждого периода таймера из вектора или файла данных, или вы можете использовать событие структура данных , переданная в update_outputs чтобы получить время события таймера (я полагаю, относительно запуска таймера DIO).
Наконец, вам нужно запустить DIO:
start(dio);
... и, как только вы закончите использовать его, удалите его и очистите его из памяти:
delete(dio);
clear dio;
Один потенциальный камень преткновения ...
Генерация сигнала 500 кГц может быть затруднена. Это такая высокая частота, что вы можете столкнуться с проблемами, особенно с 'TimerFcn', который вызывается один раз каждый период таймера. Если для запуска TimerFcn требуется более 0,000002 секунды, некоторые события таймера могут не обрабатываться , что приводит к выходу, который на самом деле имеет более низкую частоту. У меня такое чувство, что вам, возможно, придется использовать более низкую частоту сигнала, чтобы все работало должным образом, но я могу ошибаться. =)