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

E502 - получение аналоговых данных в "родном" формате - т.е. int16

Вы не вошли.

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

05.11.2024 18:55:24
#1

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

E502 - получение аналоговых данных в "родном" формате - т.е. int16

Hi All!

В библиотеке X502 при разборе потока на вход идут данные из буфера в формате int32. На выходе имеем аналоговые данные в формате double.

Вопрос. На какое число библиотека множит "штуки АЦП" чтобы получить вольты? Каково значение младшего разряда?
Из того что я вижу - для диапазона 10 В значение младшего разряда равно 0.4 мВ с достаточно хорошей точностью.
Может есть точные значения младших разрядов в зависимости от установленного диапазона?

Данная проблема весьма критична ибо если писать в формате double файл получается в 4 раза больше чем для формата int16.
Часовой файл с частотой оцифровки 100 кГц весит больше 2.8 ГБ.

Jury

07.11.2024 05:18:57
#2

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

Re: E502 - получение аналоговых данных в "родном" формате - т.е. int16

Для E-502 вначале внутри самого модуля идет применение индивидуальных калибровочных коэффициентов данного экземпляра (которые хранятся в энергонезависимой памяти самого модуля) к коду АЦП и чтобы не потерять точность (дробную часть после умножения кода АЦП на вещественный коэффициент), 16-битный код расширяется до 24 битного сдвигом влево. Соответственно уже 24-битные коды  после калибровки передаются наверх в виде 32-битных слов, которые состоят из 24-битного кода и дополнительной информации (формат есть в главе 5.12 низкоуровнего описания https://www.lcard.ru/download/x502_low_level.pdf), которые и получает Recv перед передачей в ProcessData. Калибровочные коэффициенты определены таким образом, чтобы после их применения, напряжение на входе, соответствующее номинальной границе используемого диапазона измерения, соответствовало коду X502_ADC_SCALE_CODE_MAX  (6000000). Для перевода в Вольты уже библиотека в ProcessData применяет преобразование y = x * range / X502_ADC_SCALE_CODE_MAX, где y - значение в Вольтах, полученное в результате выполнения ProcessData, x - знаковое целое, соответствующее 24-битному коду, полученный от модуля, а range равно 10, 5, 2, 1, 0.5 или 0.2 в зависимости от настроенного диапазона.

Таким образом у Вас есть два варианта:

1. Можно хранить в файле "сырые" 16-битные отсчеты, но с ними хранить и калибровочные коэффициенты данного модуля, и уже вручную выполнять применение калибровочных коэффициентов и переводить в Вольты при чтении, отключив преобразования в модуле и библиотеке. Для этого необходимо:
- считать калибровочные коэффициенты для используемых диапазонов с помощью X502_GetAdcCoef() для сохранения с файлом отсчетов
- установить калибровочные коэффициенты равными k=1 и offs = 0 через X502_SetAdcCoef для используемых диапазонов, чтобы по сути отключить их применение внутри модуля (это не стирает коэффициенты в энергонезависимой памяти и при следующем Open они будут восстановлены).
- Запустить сбор, использовать ProcessData без флага X502_PROC_FLAGS_VOLT, чтобы отключить преобразование в Вольты в библиотеке
- На выходе ProcessData значения double будут соответствовать коду АЦП, сдвинутому вправо на 8 бит (домноженному на 256). Т.е. для получения родного кода нужно сделать преобразование int16_t с = (int16_t)((int32_t)d >> 8)), где d значение на выходе ProcessData типа double, а c - полученный 16-битный исходный код АЦП.

2. Можно сделать обычный прием значений в Вольтах и дальше использовать свое преобразование из Вольт в 16-битный код, считая, что например максимальное значение 16-битного знакового числа (0x7FFF) соответствует максимальному значению диапазона и получить код как c = (d/range)*0x7FFF с проверкой выхода за диапазон и округлением до границ. Тут не будет конечно 1:1 соответствия  разряда кода в файле с разрядом АЦП, но не требует сохранения калибровочных коэффициентов и все позволяет добиться 1/2^15 точности от диапазона измерения.

07.11.2024 17:37:58
#3

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

Re: E502 - получение аналоговых данных в "родном" формате - т.е. int16

Hi!
Спасибо за столь подробный ответ!
Думаю первый вариант оптимальный. Буду пробовать реализовать его.
Еще вопрос.
Коэффициенты из памяти АЦП - они один раз "на заводе" прошиваются? Или внутри есть какой то калибратор и они получаются при каждом включении питания? Просто мы сейчас работаем с логгером ADU-07e от Metronix, так он при каждом включении гонит селфтест в котором в т.ч. эти определяет коэффициенты.
И... Я открыл низкоуровневое описание - там глава 5.1 это прошивка Блэкфин... Где искать алгоритм что на что множить?
Jury

07.11.2024 18:49:11
#4

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

Re: E502 - получение аналоговых данных в "родном" формате - т.е. int16

Для E502 эти коэффициенты записываются при наладке изделия на заводе один раз (если не считать возможной перекалибровки в случае передачи в ремонт и т.п.).
Способ применения коэффициентов описан например в описании функции X502_SetAdcCoef() в руководстве по x502api. Пара коэффициентов (k,offs) идет на каждый диапазон своя, но общая для всех каналов.
Про низкоуровневое описание там глава 5.12 (а не 5.1), где описан формат 32-битного слова. Он идет в главе по BlackFin, т.к. как правило он нужен при написании ручной обработки в нем для разбора слов, но без Blackfin в этом же формате просто слова передаются напрямую и принимаются на верхнем уровне через Recv. В принципе этот формат Вам может быть и не нужен, если используете ProcessData, только если Вы вообще решите не использовать эту функцию, а сразу будете обрабатывать слова из Recv извлекая 24-битный код из 32-битного слова вручную, чтобы не переводить код -> double -> снова код, тогда можно просто проверить правильность информации в типе слова и извлечь нужные 16 бит.

Контакты

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

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

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

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