Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Вот теперь понял. Спасибо большое за терпение, понимание, что помогли разобраться. Просто как-то запутался с 3 значениями сразу от 2 канала, как так?
Ещё раз спасибо огромное, что помогли!
1. В руководстве программиста в п.4.5.1. "Корректировка данных АЦП" достаточно подробно расписано как именно корректируются входные данные с АЦП. Даже приведены конкретные примеры. В каком именно месте не понятна арифметика корректировки?
2. Дополнительный вопрос совсем не понял...
Если в логическом номере канала АЦП индекс коэффициента усиления равен j, то корректировочные коэффициенты этого логического канала могут быть получены следующим об-разом: смещение: Adc.OffsetCalibration[j]; масштаб: Adc.ScaleCalibration[j]. - вот понимаю, что для нашего примера будут корректировочные коэффициенты Adc.OffsetCalibration[0], Adc.ScaleCalibration[0], т.к. коэф. усиления равен 1 согласно таблице 5 в руководстве, программно его индекс равен 0.
В общем виде процедура корректировки отсчѐтов АЦП выполняется по следующей формуле:
Y = (X+A)*B, // формула понятная, не сложная
где:
X – некорректированные данные АЦП [в отсчѐтах АЦП], // полученные значения с выполнения функции ADC_Sample
Y – скорректированные данные АЦП [в отсчѐтах АЦП], // получатся после выполнения всех действий
A – коэффициент смещения нуля [в отсчѐтах АЦП], // не совсем понял как получить, хотя подозреваю, что получить можно после корректировки нуля
B – коэффициент масштаба [безразмерный]. // тоже не совсем понимаю как получается.
Например, пусть со второго канала АЦП, настроенного на входной диапазон ±2.5 В (индекс коэффициента усиления равен 1 или ADC_INPUT_RANGE_2500mV_E140), получены следующие данные: X1 = 1000, X2 = –1000 и X3 = 0. Тогда коэффициенты и скорректированные данные можно представить так: A = Adc.OffsetCalibration[1]; B = Adc.ScaleCalibration[1]; Y1 = (A+1000)*B, Y2 = (A-1000)*B, Y3 = A*B.
Может я глупый, но вводит в ступор Y1, Y2, Y3, как получились данные X1, X2, X3.
Про дополнительный вопрос: на "сырых данных" допустимо ли задать кодовое значение, полученное при опросе АЦП-шкой для одного числа, может не так выразился, программно выглядит так:
if (AdcSample1 > 720 && AdcSample <= 800)
{
voltage = 1;
}
else if (AdcSample > 800 && AdcSample <= 880)
{
voltage = 1.1;
}
else if … И так до 8000. Более точная - это задавать диапазон с шагом 8.
Дополнительно вопрос: можно ли задавать диапазоном значение кодов для одного числа для грубой калибровки, не строгой?
Доброго времени суток, уважаемые сотрудники техподдержки и форумчане, если таковые будут читать в этой ветке мой вопрос.
Столкнулся я со следующей проблемой: не совсем понимаю как корректировать данные, получаемые со входов АЦП. Прочитал в руководстве, что можно использовать штатные или пользовательские, правда не совсем понял как применить, арифметика сбила с толку слегка.
Работаем мы с модулем E14-140-M, напряжение от 5 до 10 В. Получаем данные со входов модуля через ADC_Sample. Большое спасибо, что тогда помогли разобраться как вывести значения, помогли сойти с мёртвой точки. Но продолжу про корректировку и что интересует непосредственно.
Как гласит таблица 1 на 10 странице руководства, если всё правильно задано, тогда должны получиться красивые и нужные значения: для 10 Вольт - [8000] код АЦП, 0 В - [0] код АЦП, -10 В - [-8000] код АЦП. Простая арифметика и 1 Вольт напряжения - код АЦП 800, 0,1 - 80. Но столкнулись с проблемой, что не сходится. Оно и понятно, данные сырые, а как скорректировать - проблема.
Вопрос: как скорректировать данные? Читал, что можно как-то корректировать, но, повторюсь, арифметику не понял.
Сам "недопрограммист", пишу на C++/CLI. Помогите разобраться. Возможно, данный вопрос уже поднимался на форуме, а если нет - тогда буду первым.
Спасибо, помогло.
Доброго времени суток. Столкнулся с такой проблемой на модуле E14-140-M, непосредственно с реализацией функций АЦП. Разрабатываем программу, чтобы записывать измеренные напряжения и токи на сварочных аппаратах, работаем с напряжением до 10 вольт, при попытках повторить реализацию по примерам - не получается получить результаты с АЦП. ADC_SAMPLE() - не работает у нас. Загвоздка следующая: как получать кодовые значения напряжения со входов? Работаем с первыми 3-мя каналами, общая земля, однополярное напряжение. Согласно таблице 5 в руководстве программиста, коды логических каналов получились следующие: 0x20, 0x21, 0x22. В двоичном коде: 00100000 для первого канала, 00100001 для второго канала и 00100010 - для третьего.
Программу пишем в среде MSVS на языке C++.
Параметры взяли из примера.
Возможно, допускаю, наша ошибка в установке параметров работы АЦП
ADC_PARS_E140 ap;
ap.ClkSource = INT_ADC_CLOCK_E140;
ap.EnableClkOutput = ADC_CLOCK_TRANS_DISABLED_E140;
ap.InputMode = NO_SYNC_E140;
ap.ChannelsQuantity = CHANNELS_QUANTITY; - объявили 3, #define CAHNNELS_QUANTITY (0x3)
// формируем управляющую таблицу
for (int count = 0x0; count < ap.ChannelsQuantity; count++)
{
ap.ControlTable[count] = (WORD)count;
}
AdcRate = 100.0;
InterKadrDelay = 0.0;
if (!pModule->SET_ADC_PARS(&ap)) MessageBox::Show("SET_ADC_PARS() --> Bad");
Процедуру опроса реализовали следующим образом:
pModule->ADC_SAMPLE(&AdcSample, (WORD)(0x21));
int amperka = 0;
amperka = prinftf("%D", AdcSample); // для передачи данных форматированных в переменную (в примере консольном работает, у нас - нет )
label1 = amperka.toString(); //для передачи в метку на форме для отображения
Помогите разобраться, как правильно реализовать, чтобы сработало. Понимаю, что хожу очень близко к решению, но не получается.
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск