Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
|
||||
|
Синхронизация начала съема с двух АЦП в крейтеЗдравствуйте! Приобрели два АЦП LTR24 в крейте LTR-EU-2-5 и хотим сделать синхронный съем данных по шести каналам. Для этого в программе делаем подключения к крейту (для генерирования синхрометок) и к каждому модулю АЦП в крейте, задаем одинаковую частоту дискретизации(код LTR24_FREQ_58K) для каждого АЦП. В одном из них инициализируем и разрешаем все четыре канала в другом только два. Далее пытаемся в качестве теста запустить съем, послать синхрометку и выбрать стартовые отсчеты в каждом из двух массивов отсчетов, которые помечены синхрометкой. Вот ключевой участок кода (на Delphi):
Сразу оговорюсь код сугубо тестовый без всяких проверок. пытаюсь считать 2048 отсчетов. При этом возникают ситуации когда синхрометка вообще не успевает прийти в один из АЦП или в другом приходит практически после половины принятых отсчетов. Я отслеживаю приход синхрометки по изменению счетчика в массивах tmark и tmark2. С чем это может быть связано ? Действительно настолько долго происходит генерация синхрометки ? Или нужно как то по иному программировать синхронный съем данных ? В принципе в этой задаче я могу обойтись и без синхронного съема, но, в будущем, боюсь без этого будет трудно обойтись. Буду рад любой информации. |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеДобрый день. 2048 отсчетов на частоте 58КГц - это всего 35 мс. В общем для Windows (которая вообще не ОСРВ и не гарантирует задержки) это не такое большое время, и вполне может пройти за время ожидания ответа от запуска первого модуля, обмен команд для запуска второго и передачу команды крейту на генерацию синхрометки, даже при подключении по USB (а по Ethernet могут быть еще свои задержки). В любом случае, более правильно делать цикл с приемом данных от модулей до того, как изменится в каждом значение tmark, а не одиночный прием блока (ну и выход по ошибке приема или в результате превышения заведомо большего времени ожидания). |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеАлексей L Card пишет:
Спасибо большое, Алексей! В принципе по сути текущей задачи съемы данных нужны в определенные моменты времени а не непрерывно. Поэтому изначально была мысль сделать считывание данных между LTR24_Start и LTR24_Stop. Но, помимо необходимости синхронизации потока данных от двух разных АЦП в одном крейте, мы заметили что функция LTR24_Stop занимает довольно продолжительное время. Поэтому скорее склоняемся к мысли сделать непрерывное считывание данных в течение всего цикла работы, а использовать считанные данные в нужные моменты времени. А в процессе начального запуска программы дать команды на старт считывания и, после посылки синхрометки, в цикле ждать изменения счетчиков меток для обоих АЦП, чтобы синхронизировать считываемые потоки. |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеВ Вашем случае такого быть не должно, все же Вы сперва запускаете сбор, а затем уже делаете генерацию метки, когда сбор идет. |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеСпасибо большое, Александр!
Далее уже можно считывать данные побуферно без сдвижек. И вот еще хотел узнать, можно ли вызывать далее функцию LTR24_ProcessData обычным образом, несмотря на то что для первых нескольких вызовов LTR24_Recv во время поиска синхрометки я ее не вызывал? Не будет ли ошибки при ее вызове? Понятно что в дальнейшей обработке я буду вызывать ее для каждого вызова LTR24_Recv. |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеАлексей, извините, назвал Вас Александром. Под вечер уже путаться начинаю |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеИзвините, что сыплю вопросы, но обнаружил еще один непонятный момент. Для теста написал тако |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеИзвините, что сыплю вопросы, но обнаружил еще один непонятный момент. Для теста написал такой вот код
Первые два вызова LTR24rocessData проходят успешно. Ожидал получить ошибку при вызове функций LTR24_ProcessData после двух подряд вызовов LTR24_Recv. Вроде бы нарушается непрерывность потока данных для обработки. Но почему то функции вернули 0. Ошибки не возникло. Это нормальное поведение ? |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеСам алгоритм описан Вами в общем правильно. По поводу нескольких Recv без ProcessData, насколько я вижу, для LTR24 в LTR24_ProcessData проверяется непрерывность данных в самом обрабатываемом блоке, что внутри блока не было разрывов данных, а также что данные выровнены на границу кадра, именно отсутствия разрыва данных между вызовами сейчас не проверяется, т.е. что новый блок, обрабатываемый с ProcessData идет сразу за предыдущем, поэтому ошибку функция не возвращает. Тут не совсем корректно это описано в документации. При этом с точки зрения работы фильтров, все же это не совсем корректно, и если делаете ProcessData после пропуска, то правильно передавать флаг LTR24_PROC_FLAG_NONCONT_DATA. |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеАлексей, спасибо большое! В принципе вся схема обработки понятна. И еще один вопрос возник. Если я в функции LTR24_ProcessData не ставлю флаг перевода в вольты, что за значения я получаю после преобразования? Это знаковые числа в рамках разрядной сетки АЦП? То есть если я ставлю формат 24 бита то это 23 бита со знаком ? Просто мне желательно после съема данных сохранять их в формате wav. И хотелось бы понять как лучше преобразовывать данные после обработки. |
|||
|
||||
|
Re: Синхронизация начала съема с двух АЦП в крейтеУ ProcessData возвращаемый тип всегда double. Если Вы используете калибровку, но отключен перевод в Вольты, и включен режим 24 бита, то у Вас значение 2^23 соответствует значению +диапазон (2 или 10 В, какой выставлен), соответственно -2^23 - минус диапазон. При этом т.к. идет умножение на калибровочные коэф, то у этого числа есть и дробная часть, а также, т.к. разрядная сетка АЦП несколько превышает сам диапазон (т.е., например, в 10В диап. реально есть запас и можно падать чуть выше 10В), то для значений на входе выше диапазона будет возвращен код больше 2^23. Если калибровку не используете, то будет возвращен в чистом виде код АЦП (от -2^23 до 2^23-1 с нулевой дробной частью), но не будет учитываться коэф. передачи входного тракта конкретного модуля, который за счет разбросов элементов может быть разный у разных модулей (для компенсации которого и используются индивидуальные калибровочные коэффициенты). Для 20-битного режима все тоже, но степень не 23 а 19. |
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск