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

Форум

Вы не вошли.

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

#2 Техническая поддержка » L-780, поправочные коэффициенты » 21.02.2021 01:23:39

nnee_prigodilsaaa
Ответов: 2

Добрый день!

Поиск и чтение доков и исходных текстов ничего не даёт, и я надеюсь, что на форуме мне помогут правильно задать поправочные (они же калибровочные) коэффициенты.

Драйвер работает, прочитать АЦП удалось (в программе созданы два потока, семафоры через «compare and exchange» и так далее), вот так это всё выглядит, но значение в вольтах, полученное от карты, не совпадает со значением от генератора, и сейчас я его умножаю и складываю с двумя коэффициентами, задаваемыми вручную.

Карта L-780 присылает две пары по четыре коэффициента:

    PLATA_DESCR_U Description = {0};
    Device->ReadPlataDescr (&Description);

    printf (".......... SerNum       %s\n", Description.t1.SerNum);
    printf (".......... BrdName      %s\n", Description.t1.BrdName);
    printf (".......... IsDacPresent %d\n", Description.t1.IsDacPresent);
    printf (".......... Quartz       %d\n", Description.t1.Quartz);

    printf (".......... KoefADC,     %f %f %f %f\n", (FLOAT) Description.t1.KoefADC[0] / 65535,
                                                     (FLOAT) Description.t1.KoefADC[1] / 65535,
                                                     (FLOAT) Description.t1.KoefADC[2] / 65535,
                                                     (FLOAT) Description.t1.KoefADC[3] / 65535);
    printf (".......... KoefADC,     %f %f %f %f\n", (FLOAT) Description.t1.KoefADC[4] / 65535,
                                                     (FLOAT) Description.t1.KoefADC[5] / 65535,
                                                     (FLOAT) Description.t1.KoefADC[6] / 65535,
                                                     (FLOAT) Description.t1.KoefADC[7] / 65535);

Программа переносит их во внутреннюю структуру данных:

    struct _ADC_RATIOS
    {
      FLOAT Shift_from_zero[LC_MAX_ADC_RATIO_FACTORS];
      FLOAT Scale[LC_MAX_ADC_RATIO_FACTORS];
    } ADC_ratios = {0};

И при этом они делятся на 65535, чтобы получить числа с точкой:

    for (ULONG Counter = 0; Counter < LC_MAX_ADC_RATIO_FACTORS; Counter ++)
    {
      ADC_ratios.Shift_from_zero[Counter] = (FLOAT) Description.t1.KoefADC[Counter] / 65535;
      ADC_ratios.Scale[Counter] = (FLOAT) Description.t1.KoefADC[Counter + 4] / 65535;
    }

А затем она умножает и складывает первые два из них с каждым значением с АЦП, вот так:

    FLOAT CorrectValue (LC_QUEUE_RECORD_VALUE_TYPE Value, ULONG Channel_number)
    {
      ULONG Index = 0;

      FLOAT Scale = ADC_ratios.Scale[Index] * 2;
      FLOAT Shift_from_zero = ADC_ratios.Shift_from_zero[Index];

      FLOAT Corrected_value = (Value + Shift_from_zero) * Scale;

      FLOAT Voltage = (Corrected_value * LC_ADC_VOLTAGE_RANGE) / LC_ADC_STEPS;

      return Voltage;
    }

Так получается значение в вольтах, близкое к тому, что идёт от генератора, но мне приходится добавлять к нему ещё 0.20, чтобы получить более-менее точное значение.

Вопросов два:
1) Почему поправочных коэффициентов четыре, когда каналов АЦП в 4 и 8 раз больше (в дифф. режиме и с общей землёй),
2) Как их применить, чтобы получить значение в вольтах? Что с чем сложить и что на что домножить. Примеры уже посмотрел...

Контакты

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

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

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

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