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


Ввод данных при покадровой синхронизаци Е14-140М

Вы не вошли.

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

Виктор
08.02.2012 18:51:25
#1

Гость

Ввод данных при покадровой синхронизаци Е14-140М

Уважаемые друзья!

Я пытаюсь использовать модуль Е14-140М для ввода аналогового сигнала с покадровой синхронизацией, т.е. синхронизацией ввода отдельных кадров по цифровому входу INT (режим TTL_KADR_SYNC_E140).
Использую библиотеку LUsbApi 3.4.

Чтение собранных данных с помощью функции ReadData возможно только "пачками" по 32 отсчета - это написано в документации. Однако, специфика задачи такова, что количество синхроимпульсов за время измерения неизвестно, не кратно 32 и может быть даже меньше, чем 32.

Прошу вас пролить свет на следующие вопросы:
1. Существует ли способ узнать, какое количество синхроимпульсов поступило на вход синхронизации с момента запуска АЦП (или какое количество отсчетов накоплено в буфере)?
2. Существует ли способ прочитать накопленные данные, если количество отсчетов менее 32? Можно ли прочитать все данные, если количество отсчетов более 32, но не кратно 32?

Пока мои опыты показывают, что функция ReadData:
1. В случае если отсчетов менее 32 и запрашивается 32 отсчета, возвращает ошибку по истечении таймаута, данных не возвращает.
2. В случае если отсчетов более 32, но менее 64, и запрашивается 32 отсчета, возвращает 32 отсчета данных, остаток данных прочитать не удается.

08.02.2012 20:43:06
#2

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

Re: Ввод данных при покадровой синхронизаци Е14-140М

Если позволяют временнЫе параметры Вашей задачи, то можно попробовать задать управляющую таблицу, состоящую из, например, 32 логических каналов. При этом первые N каналов - это Ваши актуальные каналы АЦП, а остальные - фиктивные (не используемые). Тогда на каждый внешний синхроимпульс модуль будет собирать ровно 32 отсчета и проблем с ReadData() не будет.

Виктор
09.02.2012 10:01:20
#3

Гость

Re: Ввод данных при покадровой синхронизаци Е14-140М

Благодарю за ответ,

К сожалению временные параметры задачи несколько уже, чем возможности АЦП в таком режиме.
Насколько я понимаю, максимальная частота следования синхроимпульсов, допускаемая модулем, составит 200 КГц / 32 = 6250 Гц, что маловато, синхроимпульсы могут следовать с частотой до 10 КГц.

Неужели нет других возможностей?

09.02.2012 10:45:39
#4

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

Re: Ввод данных при покадровой синхронизаци Е14-140М

Можно попробовать таблицу из 16 каналов. Тогда на каждые два синхроимпульса будет собираться 32 отсчета. При этом максимальная частота следования синхроимпульсов будет 200кГц / 16 = 12.5кГц, что больше 10кГц.

09.02.2012 11:44:50
#5

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

Re: Ввод данных при покадровой синхронизаци Е14-140М

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

Считать данные из памяти в принципе можно через недокументированную лазейку.
Буфер АЦП занимает первые 28 КБ (short buf[28*512]) памяти, которую можно прочитать через module_ptr->GetArray(buf, len_bytes, 0x8000)
Но, правда, там не будет видно указателей голова/хвост, а буфер кольцевой. После ADC_START он всегда начинает заполняться с начала, так что если общее количество данных укладывается в 28К, то там будет весь эксперимент, но где конец - не очевидно. Хотя его можно найти... данные между пусками не затираются, но Вы можете насильственно затереть буфер перед пуском АЦП через PutArray() по тем же адресам. Например, записать туда 0xDEADBEEF smile
Кстати, это хорошая константа, потому что реальные отсчеты бывают только в диапазоне -8192..8191, т.е. 0xE000..0xFFFF, 0x0000..0x1FFF.
Ну или просто заполнить 0x8000.

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

В общем, как-то так. В принципе можно и добавить что-нибудь в прошивку и выпустить новую версию - можем обсудить.

09.02.2012 11:53:09
#6

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

Re: Ввод данных при покадровой синхронизаци Е14-140М

Да, функции GetArray/PutArray медленные. Они работают через другой USB (control, а не bulk). На моей машине весь 28K массив читается/пишется где-то 3.6 секунды (т.е. примерно 7.6 KB/s)

09.02.2012 11:57:56
#7

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

Re: Ввод данных при покадровой синхронизаци Е14-140М

Но читать можно не весь буфер с 0x8000, а с любого смещения любую длину - например, GetArray(buf, 64, 0x8200) и т.п.

Виктор
09.02.2012 12:05:54
#8

Гость

Re: Ввод данных при покадровой синхронизаци Е14-140М

Благодарю за исчерпывающий ответ. По крайней мере, теперь понятно откуда ноги растут. smile

Попробую выкрутится указанным способом.

Контакты

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

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

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

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