Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Ещё две константы:
#define LC_ADC_STEPS 8000
#define LC_ADC_VOLTAGE_RANGE 5.00
Добрый день!
Поиск и чтение доков и исходных текстов ничего не даёт, и я надеюсь, что на форуме мне помогут правильно задать поправочные (они же калибровочные) коэффициенты.
Драйвер работает, прочитать АЦП удалось (в программе созданы два потока, семафоры через «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) Как их применить, чтобы получить значение в вольтах? Что с чем сложить и что на что домножить. Примеры уже посмотрел...
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск