Генерация ШИМ / тактового сигнала с платы USB-1024HLS DAQ - PullRequest
2 голосов
/ 29 мая 2009

Есть ли вызов функции API для этой платы, который позволил бы мне генерировать тактовый сигнал на выходе с частотой 500 кГц при выполнении какого-либо другого кода на плате? Заранее спасибо за советы.

Ответы [ 2 ]

2 голосов
/ 20 июня 2009

Согласно документации о поддерживаемом оборудовании , версия 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 секунды, некоторые события таймера могут не обрабатываться , что приводит к выходу, который на самом деле имеет более низкую частоту. У меня такое чувство, что вам, возможно, придется использовать более низкую частоту сигнала, чтобы все работало должным образом, но я могу ошибаться. =)

1 голос
/ 19 июня 2009

Я нашел Пример: генерация событий таймера в документации панели инструментов сбора данных.

dio = digitalio('nidaq','Dev1');
addline(dio,0:7,'in');
set(dio,'TimerFcn',@daqcallback)
set(dio,'TimerPeriod',5.0)
start(dio)
pause(11)
delete(dio)
clear dio
...