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


E-154 Диапазоны напряжения

Вы не вошли.

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

Uu_670042
12.10.2011 06:49:06
#1

Гость

E-154 Диапазоны напряжения

Как задать в Е-154 диапазон напряжения, как я понял существует несколько способов? с помощью констант, через ControlTable, через калибров.коэфф.

Uu_670042
13.10.2011 08:39:35
#2

Гость

Re: E-154 Диапазоны напряжения

Если в Е14-440 коды АЦП от -8000 до +8000, а в Е-154 от -2000 до +2000, то можно в программе своей просто добавить множитель 4? А какой по умолчанию стоит диапазон напряжения в Е-154?

13.10.2011 10:51:22
#3

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

Диапазон напряжения (иначе говоря, коэффициент усиления) задается через ControlTable, формат описан в руководстве программиста.

Калибровочные коэффициенты предназначены для пересчета кодов АЦП в физические величины. Для каждого диапазона, как правило, свои калибровочные коэффициенты, они определяются с учетом характеристики входных цепей конкретного экземпляра устройства. Формула пересчета в руководстве, обычно это U(x) = a(x + b), где a,b - калибровочные коэффициенты, x - отсчет АЦП

Если Вы хотите сделать универсальную программу, работающую с устройствами разной разрядности, то можно либо пересчитывать сразу в вольты и работать с физическими величинами, либо передавать калибровочные коэффициенты на верхний уровень программы, а промежуточную обработку делать в кодах. Умножить на 4 никто не мешает, но надо понимать, что сравнивать в кодах АЦП (а также складывать и вычитать) данные, собранные с разных устройств, некорректно, т.к. у них разные калибровочные коэффициенты - очень сильно потеряете в точности.

Uu_670042
14.10.2011 05:56:16
#4

Гость

Re: E-154 Диапазоны напряжения

Управляющая таблица - это массив логич.каналов, в случае с Е-154 массив из 16 элементов(логических каналов). Логический номер - это 8-битовое поле,первые 3 из которых это номер канала,2 последних - диапазоны,остальные зарезервированы. В руководстве программиста для Е-154 приведены 2 примера: 0х2 - третий канал с диапазоном +/-5В. Как получилось так, ведь 0х2 это 00000010 и должен быть 0-й канал с диапазоном +/-1,6В. Второй пример 0х82 написано 3-й канал с диапазоном +/-0,5В, у меня получается  0101 0010, т.е. 2 канал с диап.+/-1,6В.

14.10.2011 10:46:26
#5

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

Почти все верно, только:
1) Не более 16 элементов, но можно меньше (ChannelsQuantity).
2) Биты нумеруются справа налево, т.е. бит номер n соответствует 2 в степени n.
3) Физические каналы на разъеме нумеруются с 1, а в таблице с 0, т.е. поле MA = номер физического канала - 1.

0x02 = 00000010 = { GS = 0, MA = 2 } = канал 3, 5В.
0x82 = 10000010 = { GS = 2, MA = 2 } = канал 3, 0.5В

14.10.2011 10:49:48
#6

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

ControlTable[i] = (ADC_INPUT_RANGE_xxxx_E154 << 6) | ((PhysicalChannelNumber_1_to_8 - 1) & 7);

Uu_670042
17.10.2011 04:14:28
#7

Гость

Re: E-154 Диапазоны напряжения

Спасибо, но я не понял как из 0х82 получили 10000010, или 82 это в 16 сист.счисления? если в десятичной, то должно быть 1010010. Как мне на шести каналах установить диапазон +/-5В,
00000000 -1канал, диап 5в
00000001 -2канал, диап 5в
00000010 -3канал, диап 5в
00000011 -4канал, диап 5в
00000100 -5канал, диап 5в
00000101 -6канал, диап 5в
А если диапазон 1,6в:
01000000 -1канал диап. 1.6в
01000001 -2канал, диап 1.6в
01000010 -3канал, диап 1.6в
01000011 -4канал, диап 1.6в
01000100 -5канал, диап 1.6в
01000101 -6канал, диап 1.6в
Если все правильно, то как мне теперь все это отправить через контролтейбл?

17.10.2011 10:27:28
#8

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

Разумеется, в нотации языка C префикс 0x означает шестнадцатеричную систему счисления (Pascal - $80, Intel x86 asm - 80h, BASIC - &H80).

Значения правильные. Как заполнить ControlTable - я как раз написал в предыдущем посте smile
Константы ADC_INPUT_RANGE_xxxx_E154 определены в lusbapi.h и равны 0, 1, 2, 3 (это enum); сдвигом на 6 получаем управляющее слово с нужным полем GS, прибавляем номер физ. канала без единицы (поле MA) - элемент ControlTable готов. Осталось не забыть поставить правильное значение ChannelsQuantity, заполнить остальные параметры и сделать SET_ADC_PARS.

Uu_670042
17.10.2011 10:32:07
#9

Гость

Re: E-154 Диапазоны напряжения

ControlTable[i] = (ADC_INPUT_RANGE_xxxx_E154 << 6) | ((PhysicalChannelNumber_1_to_8 - 1) & 7);
Опишите пожалуйста эту строку подробнее.

17.10.2011 10:54:58
#10

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

Подробнее в каком смысле? Перевести на русский язык синтаксис языка С? Пожалуйста:

ЭЛЕМЕНТУ массива ControlTable, имеющему индекс i (i принимает значения от 0 до ChannelsQuantity - 1, где ChannelsQuantity <= 16), ПРИСВАИВАЕТСЯ значение, равное ПОБИТОВОМУ ИЛИ следующих двух величин:
(а) значение одной из констант ADC_INPUT_RANGE_..._E154 (от 0 до 3), сдвинутое влево на 6 бит, и
(б) номер физического канала (от 1 до 8) за вычетом 1, т.е. число от 0 до 7.

Операцию побитового ИЛИ (|) можно в данном случае заменить сложением (+), поскольку у одного из операндов все младшие биты нулевые.

Побитовое И с константой 7 в члене ((PhysicalChannelNumber - 1) & 7) необязательно, это элемент так называемого защитного программирования (если параметр PhysicalChannelNumber передается в переменной и вдруг окажется неверным, например, 255, то это выражение гарантирует, что не будут испорчены биты других полей управляющего слова).

Кстати, а на каком языке программирования Вы пишете?

17.10.2011 11:02:19
#11

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

Бонус для приверженцев Pascal/Delphi

ControlTable[i] := (ADC_INPUT_RANGE_..._E154 shl 6) or ((PhysicalChannelNumber_1_to_8 - 1) and 7);

Ну и для полноты операция битового сдвига влево на n позиций (x << n, x shl n) эквивалентна умножению на 2 в степени n, т.е. дописыванию n двоичных нулей справа (и отбрасыванию n старших разрядов произведения, которые после сдвига не поместятся в разрядную сетку данного целочисленного типа).

Uu_670042
17.10.2011 11:15:42
#12

Гость

Re: E-154 Диапазоны напряжения

Спасибо за разъяснения, будьте добры поправьте если неправильно.
// формируем управляющую таблицу логических каналов
//Здесь на всех 6 каналах выставляю диапазон +/-5В.
  for(WORD i=0; i < am.ChannelsQuantity-1; i++) am.ControlTable[i] = (WORD)(i)/*усиление 1*/;

//Здесь на всех 6 каналах выставляю диап. +/-1,6В.
for(WORD i=0; i < am.ChannelsQuantity-1; i++) am.ControlTable[i] = (WORD)(64+i)/*усиление*/;

17.10.2011 11:24:00
#13

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

i < am.ChannelsQuantity
или
i <= am.ChannelsQuantity - 1

Uu_670042
18.10.2011 06:32:52
#14

Гость

Re: E-154 Диапазоны напряжения

когда пишу for(WORD i=0; i < am.ChannelsQuantity; i++) am.ControlTable[i] = (WORD)(i+64)
каналы меняются местами:
1 стал 6
2 стал 5
3 стал 4

когда пишу (SigParam[i].ChannelNum |
                                  GroundMode |
                                                             (SigParam[1].AmplFactor << 6)

все 6 каналов на своих местах. Но это строчка кода от модуля Е440

Uu_670042
18.10.2011 08:35:33
#15

Гость

Re: E-154 Диапазоны напряжения

Вот скрин программы (Е-154), обратите внимание, что сигнал срезается, доходя до опред.точки
http://saveimg.ru/show-image.php?id=6cc … a711c94728

18.10.2011 10:51:04
#16

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

Что такое GroundMode, SigParam, AmplFactor? В какой библиотеке?

(WORD)(i+64) - это физический канал 1+i (считая от единицы) с усилением, соответствующим GS = 01 (для E154 - 1.6 В).
Если в данных каналы кажутся не в той последовательности, то, вероятно, где-то потерян кусок данных или остался неочищенный буфер от предыдущего пуска. Данные из устройства поступают блоками по 64 байта, и если из-за неудачной организации чтения (например, без двойной буферизации) часть данных теряется, а ChannelsQuantity не есть делитель числа 32, то каналы окажутся не на своих местах.

Этот вопрос недавно всплывал на форуме -
http://www.lcard.ru/forumthreads/10628

>обратите внимание, что сигнал срезается, доходя до опред.точки

Трудно комментировать, не зная, как строится график. На потерю данных не похоже: сигналы характерной формы в кан. 3 и 4 не перескакивают после разрыва на другие графики (ChannelsQuantity равно 6?)
Может быть, как-то не так написана процедура рисования графиков? Например, график строится по массиву, в который уже начато асинхронное чтение новой порции данных? Вот очень похоже.

Про двойную буферизацию и потоки чтения см. в частности темы на этом форуме от человека с ником MOT, ЬЩЕ, УЩЕ, например:
http://www.lcard.ru/forumthreads/9977

Uu_670042
19.10.2011 06:15:52
#17

Гость

Re: E-154 Диапазоны напряжения

WORD CommonGround = 0x20;    // Флаг 32 каналов с общей землей
WORD NoCommonGround = 0x0;   // Флаг 16 дифференциальных каналов
GroundMode = CommonGround;   // режим подключения с общей землей | дифференциальные каналы

SigParam[0..5] это структура типа SigParamRec:
struct SigParamRec
{
  WORD ChannelNum;
  byte AmplFactor;
  COLORREF Color;
  WORD ViewFactor, ViewZeroLine;
  int PrevX, PrevY, CurX, CurY;
  PCHAR Name;
};

Uu_670042
19.10.2011 09:30:53
#18

Гость

Re: E-154 Диапазоны напряжения

также в руков-ве написано следующее: "на сегодняшний день модуль не умеет производить
автоматическую  корректировку  собираемых  с  АЦП  данных.  Это  приводит  к  тому,  что  входные
показания АЦП могут иметь некоторое смешение нуля и неточность в передаче масштаба." Может это и есть причина среза сигнала? у меня калибровка не производится.  "Штатные корректировочные коэффициенты располагаются в полях Adc.OffsetCalibration[] и
Adc.ScaleCalibration[]  структуры  служебной  информации  MODULE_DESCRIPTION_E154". Но в Lusbapi.h в структуре MODULE_DESCRIPTION_E154 всего 6 полей среди них нет Adc.OffsetCalibration[] и
Adc.ScaleCalibration[]  sad

Uu_670042
19.10.2011 12:03:24
#19

Гость

Re: E-154 Диапазоны напряжения

А вот как рисуется график
SigParam[j].CurY = BaseLine * (j + 1) - (Buffer[i * ChannelsQuantity + j] - SigParam[j].ViewZeroLine) / SigParam[j].ViewFactor;
Image3->Canvas->LineTo(SigParam[j].CurX, SigParam[j].CurY);

Описание, что чему равно: BaseLine = Image3->Height / 6.5;
FBuffer = new int[Image3->Width * ChannelsQuantity];
// Коэффициенты экранного масштабирования
  SigParam[0].ViewFactor = 20;
  SigParam[1].ViewFactor = 20;
  SigParam[2].ViewFactor = 20;
  SigParam[3].ViewFactor = 20;
  SigParam[4].ViewFactor = 20;
  SigParam[5].ViewFactor = 20;
// Коэффициенты базовой линии
//.. 238,9878    271,555122    87,13073171    125,7629268    207,5434146    164,1404878
  SigParam[5].ViewZeroLine = 164;
  SigParam[4].ViewZeroLine = 207;
  SigParam[3].ViewZeroLine = 125;
  SigParam[2].ViewZeroLine = 87;
  SigParam[1].ViewZeroLine = 271;
  SigParam[0].ViewZeroLine = 239;

20.10.2011 11:29:52
#20

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E-154 Диапазоны напряжения

1) У E154 всегда common ground, бит 5 (0x20) не должен влиять на работу модуля. В остальном, как Вы понимаете, ChannelNum | (AmplFactor << 6) идентично (i + 64) для i = ChannelNum (0..7) и AmplFactor = 1.

2) >в Lusbapi.h в структуре MODULE_DESCRIPTION_E154 всего 6 полей среди них нет Adc.OffsetCalibration[] и Adc.ScaleCalibration[]
Точка после Adc ни на что не намекает? Поле Adc - это вложенная структура типа ADC_INFO_LUSBAPI, см. LusbapiTypes.h

Калибровочные коэффициенты нужны для того, чтобы учесть индивидуальные характеристики экземпляра прибора, т.е. привести отсчеты АЦП к калиброванным единицам (2000 ед = граница диапазона измерения, В). Они не очень сильно отличаются от 0 и 1 (аддитивный и мультипликативный калибровочный коэффициент соответственно).
ПРИМЕНЕНИЕ КАЛИБРОВОЧНЫХ КОЭФФИЦИЕНТОВ НЕ МЕНЯЕТ РАЗМЕРНОСТЬ ВЕЛИЧИНЫ.

Прочитайте, пожалуйста, главу 4.5.1 Корректировка данных АЦП, там все написано.

Строить на графике можно либо откорректированные отсчеты Y = (X+A)*B, исходя из номинального диапазона (-2000, 2000), либо вольты U = Y * Uгр / 2000, где Uгр - граница выбранного диапазона.

Обращаю внимание, что Y может быть по модулю больше 2000, т.к. технически АЦП выдает коды -2048..2047, плюс калибровочные коэффициенты могут дать смещение, т.е. Ymin = (-2048+A)*B, Ymax = (2047+A)*B. Этот запас можно учесть (добавить при расчете высоты графика), а можно принудительно обрезать - это уже как Вам нравится.