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


E14-140-M Как считать кадр с ан. синхронизацией

Вы не вошли.

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

Кир
24.10.2012 01:41:03
#1

Гость

E14-140-M Как считать кадр с ан. синхронизацией

Имеется карта вышеозначенная, без DAC. Необходимо реализовать ступеньку раз в N мс, подать ее на установку и в этот момент считать фиксированное количество отсчетов с максимальной частотой дискретизации.
Решил пустить на первый канал АЦП сигнал считываемый, на второй — выход TTL. Выход TTL работает, ступеньку подаю, криво, не всегда точно, но работает.
Получается что бы считать данные мне нужно настроить синхронизацию по аналоговому сигналу, задать порог и режим, это понятно, а как считать? Т.е. для масштаба: интервал около 1 сек, замеряю 300 мс. Подал на TTL ступеньку, запись пошла и теперь я получаю массив.
Ситуацию осложняет то, что все это встраивается в готовую программу на C# и я использую обертку с этого форума, а там как я понял реализован только асинхронный режим, который, как я понял, мне не подходит. Но это ничего, хотелось бы пример с синхронизацией похожий на мой на C++ хотя бы.

29.10.2012 11:54:11
#2

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E14-140-M Как считать кадр с ан. синхронизацией

Как считать - в смысле "как прочитать данные" или "как рассчитать параметры"? smile
Чтение данных во всех *потоковых* режимах ввода (независимо от синхронизации) делается функцией ReadData (lusbapi) или прямо ReadFile (WinAPI) из хендла модуля. См. примеры к библиотеке, также было здесь на форуме:
http://www.lcard.ru/forumthreads/13009
http://www.lcard.ru/forumthreads/9977
http://www.google.com/search?q=readfile … e:lcard.ru

От режима синхронизации зависят только значения параметров, передаваемых в SET_ADC_PARS, и то, в какое физическое время будут собираться данные. Программе просто надо их читать, как из файла.

Что касается синхронизации, то можно применить два режима:
- синхронизация пуска по аналоговому сигналу или по заднему фронту (т.е. спаду) TTL-совместимого сигнала на входе INT;
- покадровую синхронизацию по заднему фронту TTL-совместимого сигнала на входе INT.

Синхронизация пуска - это значит, что программа настраивает и запускает сбор данных, но модуль не начинает собирать данные до тех пор, пока не будет выполнено условие пуска.
То есть делаете SET_ADC_PARS, START_ADC как обычно, сразу запускаете запрос на чтение (асинхронный, OVERLAPPED) и ждете поступления данных. Первый отчет будет привязан к синхроимпульсу, далее - с заданной частотой дискретизации и межкадровой задержкой (если есть) до программного останова по STOP_ADC.

Т.е. процедура получается полуавтоматическая: подготовили АЦП, START_ADC, TTL_OUT, собрали данные, STOP_ADC и все сначала.

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

Я думаю, что в Вашем случае достаточно синхронизации пуска, потому что TTL_OUT все равно придется делать асинхронно, там же можно вставить и STOP/START ADC.
Вся эта процедура займет несколько десятков мс, так что частота повторения измерений выйдет где-то порядка десятков циклов в секунду.

Если надо быстрее - можно а) формировать синхроимпульсы внешней схемой или б) докупить ЦАП и сделать параллельный синтез управляющего сигнала произвольной формы.