Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Генерация вывода цифровых сигналов на E502

Вы не вошли.

 Поиск | Регистрация | Вход 

26.04.2021 06:24:28
#1

Участник
Здесь с 06.09.2020
Сообщений: 5

Генерация вывода цифровых сигналов на E502

Добрый день!

Я сдаюсь. Уже с месяц читаю мануал https://www.lcard.ru/download/x502_low_level.pdf вкупе с https://www.lcard.ru/download/x502api.pdf, поскольку на него то и дело отсылки, но не вижу даже, с чего начать, чтобы выдать цифровой сигнал. Есть команды 0x26, 0x27, 0x28, 0x29, но ни одна из них не говорит, как рассказать устройству, что за сигнал мне нужен. Раз это цифровой вывод, то в каком формате подавать его значения и куда (предполагаю, что посылать надо на 11115 порт)? Чувствую себя совершенно безграмотным, но даже не понимаю, как согласовать (синхронизировать) цифровой вывод со входом АЦП.

Ткните, пожалуйста, на нужное место инструкции.

04.05.2021 21:35:40
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,291

Re: Генерация вывода цифровых сигналов на E502

По поводу формата вывода. Как и с вводом, формат слов на вывод описан в разделе 5.12 в x502_low_level. В случае вывода на цифровые линии в каждом слове  у Вас старшие два байта должны быть нули, а младшие два байта задают состояние 16 цифровых выходов (про биты e там не указано, что 0 это разрешение, а 1 - запрет, т.е. они должны быть в 0). Каждому выходу соответствует свой бит, DO1 - младший бит, DO16 - старший. Т.е. если Вы хотите, чтобы на DO1 и DO6 был уровень логической 1, а на остальных - нуля, то Вы должны записать битовое слово  0 ... 0 00100001 или 0x00000021 в 16-ой системе.
Каждое слово у Вас соответствует состоянию всех выходов в один момент времени (в отличие от АЦП/ЦАП в цифровых линиях Вы в одном слове задаете состояние всех линий одновременно, выборочно задать нельзя).
Дальше, если у Вас загружено несколько слов, то каждое у Вас соответствует состоянию выходов в свое время и время смены состояний определяется частотой вывода, которая по умолчанию в два раза меньше опорной частоты, т.е. 1 МГц при опорной частоте 2 МГц, т.е. каждое слово определяет состояние выходов на время в 1 мкс. Для увеличения времени можно либо установить делитель частоты вывода (аналогично частоте АЦП, но свой делитель, общий на DOUT и ЦАП) или также Вы можете этого добиться повторяя слова на вывод.

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

Далее, чтобы сопоставить ввод с АЦП и вывод, Вам нужно, чтобы генерация вывода и ввод АЦП начались одновременно (ну или точнее с известными задержками друг от друга, которые описаны в UserManual, но далее для упрощения буду считать, что одновременно). Для этого на момент запуска сбора (запись 1 в GO) у Вас уже должен быть весь (в случае циклического) или часть (в случае потокового) сигнала загружены в модуль, чтобы он смог вывести первое слово одновременно с вводом.
Общую последовательность настройки и запуска ввода-вывода описана в пункте 3.4.4 x502_low_level.

В случае циклического вывода (т.к. Вы из него привели команды) с одновременным вводом, последовательность будет следующая (подразумевается, что соединения по TCP для команд и данных установлены):

1. Настройки модулей записью в регистры (для Вас новое - это делитель частоты вывода в IO_MODE - вообще на сайте указано поле DAC_FREQ 1 бит, но оно было расширено, посмотрю, возможно была обновленная версия документа)
2. Разрешение потоков на ввода (как было для АЦП)
3. Разрешение передачи потоковых данных с помощью команды 0x12 как на ввод, так и на вывод. Т.е. у Вас тут должен быть две команды, одна с параметром 0x00000000, вторая с 0x00010000.
4. Далее Вам нужно загрузить Ваш циклический сигнал, для чего:
   - передаете команду 0x26 с указанием количества точек в сигнале (длительность периода * 1/частота вывода  + 1)
   - загружаете по каналу данных указанное на предыдущем этапе количество 32-битных слов, каждое задает состояние выходов в определенный момент времени с шагом 1/частота вывода.
   - передаете команду 0x27 для указания, что сигнал может быть выставлен (т.к. GO еще 0 то это не приведет к выводу, но укажет модулю, что сигнал можно выводить по GO=1)
   - с помощью команды 0x29 дожидаетесь, когда сигнал реально установится (т.к. у Вас могут отсчеты еще идти до модуля по каналу данных, то что вы их записали в TCP-сокет не значит, что они дошли).
   - запись 1 в бит OUT_SWAP регистра OUTSWAP_BFCTL для подготовки первого отсчета к выводу
5. Далее как уже ранее делали двойная запись в PRELOAD_ADC
6. Запись  1 в GO_SYNC_IO. По этому моменту начинается одновременная (если не учитывать задержки из UserManual) выдача первого записанного отсчета на вывод и ввод первого отсчета АЦП. Т.к. Вы знаете частоту вывода и частоту ввода и знаете точные задержки во времени первого отсчета вывода относительно первого отсчета ввода с АЦП, то вы можете точно вычислить время для любого отсчета ввода и вывода относительно старта, таким образом точно их сопоставив.

Останов выполняется аналогично тому как и при вводе, только после установки GO в 0 нужно подать команду 0x28 и 0x13 сделать как для ввода, так и для вывода.

Так же во время сбора Вы можете повторить действия из 4 пункта без записи OUT_SWAP для смены одного циклического сигнала на другой без останова генерации.

В потоковом режиме все аналогично, но Вам не нужны команды 0x26-0x29. По сути в 4-ом пункте остается только загрузка данных на определенное время (например 2 с) и запись в OUT_SWAP, а после старта (GO=1) вы должны периодически подгружать новые отсчеты. Для моментов времени можно использовать данные ввода, т.е. как пришла первая секунда данных АЦП вывели 3-ю секунду данных на DOUT, далее ждете вторую секунду данных АЦП, выводите 4-ую секунду на DOUT и т.д. В этом случае у Вас есть запас в 1 с на задержку передачи данных и задержку реакции ПО, чтобы поток сохранял непрерывность.

В общем постарался описать общую суть. Если остались вопросы, то пишите, но постарайтесь уже более конкретно сформулировать их.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск