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


Обращение к каналам АЦП E14-140-MD

Вы не вошли.

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

Алексей
16.02.2014 12:22:31
#1

Гость

Обращение к каналам АЦП E14-140-MD

Добрый день. При написании программы возникло недопонимание при обращении к каналам АЦП. Для проверки была взята исходная программа ReadData, и вот что было обнаружено. Если в исходном коде
if not pModule.ADC_SAMPLE(@AdcSample0, 0 or (0 shl 4) or (InputRangeIndex shl 6)) then begin WriteLn(#10#13/' ADC_SAMPLE(0, ) -> Bad!/'); break; end
else if not pModule.ADC_SAMPLE(@AdcSample1, 1 or (1 shl 4) or (InputRangeIndex shl 6)) then begin WriteLn(#10#13/' ADC_SAMPLE(0, ) -> Bad!/'); break; end
убрать вторую строчку, т.е. снимать данные только с первого канала, то программа перестает работать и выдавать данные с первого канала. Вопрос: что принципиально изменилось?

17.02.2014 13:23:06
#2

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

Re: Обращение к каналам АЦП E14-140-MD

ReadData - потоковый пример, однократный ввод в программе AdcSample.
>убрать вторую строчку, т.е. снимать данные только с первого канала, то программа перестает работать
Не должна - модулю все равно в этом режиме, сколько каналов Вы опрашиваете.
(А Вам нужен именно такой однократный режим?)

Алексей, а Вы пробовали перекомпилировать изначальный исходник (с опросом двух каналов) своим компилятором и запускать? Может быть, дело не в каналах, а в том, что неправильно собирается программа сама по себе?

Трудности с компиляцией под Дельфи бывают нередко, т.к. там в разных версиях, бывает, различаются типы данных или выравнивание, и иногда треубется подпилить исходники sad

17.02.2014 15:06:12
#3

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

Re: Обращение к каналам АЦП E14-140-MD

1. Какая версия библиотеки Lusbapi? Какая версия Delphi?
2. У меня подправленный пример AdcSample из библиотеки Lusbapi 3.4, собранный под Delphi 6.0, отработал нормально. Могу выслать исходники.

Алексей
17.02.2014 15:09:47
#4

Гость

Re: Обращение к каналам АЦП E14-140-MD

Исходник компилируется нормально. При комментировании второй строчки на первом канале выдает -8192. (Проверяю на генераторе прямоугольных импульсов, амплитуда 1 В).

Мне нужен конечно потоковый ввод данных, но поскольку он не заработал, решил проверить более простой вариант. Плата исправна, проверял в программе L-Graph. Пишу в Delphi 7.0,Lusbapi 3.4

Алексей
17.02.2014 15:27:03
#5

Гость

Re: Обращение к каналам АЦП E14-140-MD

Сергей, буду признателен, если вышлите. Вдруг будет работать лучше, хотя хочется разобраться, потому что в итоге программу надо писать самому.

17.02.2014 15:45:56
#6

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

Re: Обращение к каналам АЦП E14-140-MD

Пример отправил почтой.

17.02.2014 15:46:58
#7

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Обращение к каналам АЦП E14-140-MD

А входы соответствующего канала АЦП подключены к источнику сигнала или к "земле"? Если нет, то АЦП может выдавать всё, что угодно, в том числе и -8192.

17.02.2014 15:47:38
#8

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Обращение к каналам АЦП E14-140-MD

Алексей
17.02.2014 16:05:36
#9

Гость

Re: Обращение к каналам АЦП E14-140-MD

Сергей, спасибо!

Александр, подключено по схеме 1.1 к генератору. В исходном виде программа работает нормально, на 1 канале виден подаваемый сигнал, на втором 0. При комментировании строчки опроса второго канала, выдает как я писал выше.

Алексей
17.02.2014 16:10:11
#10

Гость

Re: Обращение к каналам АЦП E14-140-MD

Я правильно понял, что в этом примере данные с 1 канала снимаются в общем режиме, а со 2 канала - в дифференциальном?

17.02.2014 16:54:34
#11

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

Re: Обращение к каналам АЦП E14-140-MD

Бит 4 там установлен, это измерение собственного нуля.
При InputRangeIndex = 1:
канал 0 (ctl_word = 0x40) в дифференциальном режиме, 2.5V
канал 1 (ctl_word = 0x51) измерение собственного нуля, 2.5V

Так что схема подключения не соответствует.

Алексей
17.02.2014 17:05:52
#12

Гость

Re: Обращение к каналам АЦП E14-140-MD

Тогда подскажите пожалуйста пример, как должен выглядеть логический номер канала для получения данных, например, с первого канала в режиме "с общей землей" и диапазоном измерения +-10 В. А то я, видимо, запутался в этом вопросе.

17.02.2014 19:13:30
#13

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

Re: Обращение к каналам АЦП E14-140-MD

1. Подробнее о формате логического номера канала АЦП можно прочитать в п.3.2.3."Логический номер канала АЦП" руководства программиста:
http://www.lcard.ru/download/e14_140_pr … _guide.pdf
Для подключения канала в режиме "с общей землей" необходимо в логическом канале АЦП установить 5-ый бит в /'1/'.
2. Выслал консольный пример, доработанный под Ваш тип подключения.

Алексей
19.02.2014 12:40:20
#14

Гость

Re: Обращение к каналам АЦП E14-140-MD

Спасибо, присланный пример заработал. Проблема была в правильности обращения к каналам.

Николай
10.12.2014 01:02:05
#15

Гость

Re: Обращение к каналам АЦП E14-140-MD

Здравствуйте. У меня ситуация аналогичная как и у Алексея. Нет четкого понимания п.3.2.3."Логический номер канала АЦП" руководства программиста.    
Я понимаю, что входной диапазон  5V ADC_INPUT_RANGE_5000mV_E154, а что такое 0x6? Подключено 4 канала АЦП с 1-4 по схеме 1.1.  Если изменить ap.ChannelsQuantity = 0x1; на выходе ничего нет. В общем запутался. Спасибо.

P.S. Выдержку из тестового примера привести не могу вот это сообщение просто достало:
Обнаружен парный тег без соответствующего закрывающего тега

11.12.2014 13:44:38
#16

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

Re: Обращение к каналам АЦП E14-140-MD

Николай пишет:

Здравствуйте. У меня ситуация аналогичная как и у Алексея. Нет четкого понимания п.3.2.3."Логический номер канала АЦП" руководства программиста.     
Я понимаю, что входной диапазон  5V ADC_INPUT_RANGE_5000mV_E154, а что такое 0x6? Подключено 4 канала АЦП с 1-4 по схеме 1.1.  Если изменить ap.ChannelsQuantity = 0x1; на выходе ничего нет.

Николай, Вы прочитали этот пункт руководства? Там расписан каждый бит.
0x6 = двоичное 0000 0110, т.е. в соответствии с таблицей из руководства это номер физического канала (MA2 = 1, MA1 = 1, MA0 = 0), т.к. каналы нумеруются с нуля, это физический седьмой канал из восьми (на E154).
Соответствие двоичной и шестнадцатеричной систем счисления не вызывает у Вас трудностей?
Что касается ChannelsQuantity, то это просто количество логических каналов в кадре, т.е. сколько элементов ControlTable используется. Если Вы заполняете в ControlTable элементы с 0-го по (N-1)-й, то N это и есть ChannelsQuantity.

Николай пишет:

P.S. Выдержку из тестового примера привести не могу вот это сообщение просто достало:
Обнаружен парный тег без соответствующего закрывающего тега

smile А Вы обратили внимание, что в Вашем сообщении эта часть текста получилась курсивом (italic) - вместо "парный тег [­i­] без соответствующего закрывающего тега [­/i­]"?
Для кода есть специальный инструмент.
Используйте кнопочку "блок кода" в редакторе сообщения или BB-коды [­code­]...[­/code­]:

x[i]
Николай
12.12.2014 01:29:09
#17

Гость

Re: Обращение к каналам АЦП E14-140-MD

Спасибо большое за ответ. Для проверки самого себя smile. Допустим у меня есть 8 каналов X1-X8 (неиспользуемые X9-X16, Y1-Y16 заземлены, тоесть подключены к GND32 и AGND).
Схема подключения 1.1. Режим "32 с общей землей".
Пусть индекс коэффициента усиления равен 4. Получаем  такую настройку:

Каналы | 1   2   3   4   5   6   7   8
______________________________________
МА0    | 0   1   0   1   0   1   0   1
МА1    | 0   0   1   1   0   0   1   1
МА2    | 0   0   0   0   1   1   1   1
МА3    | 0   0   0   0   0   0   0   0
МА4    | 0   0   0   0   0   0   0   0
МА5    | 1   1   1   1   1   1   1   1
GS0    | 1   1   1   1   1   1   1   1
GS1    | 0   0   0   0   0   0   0   0
______________________________________
Запись |0х96 97  98  99 100 101  102 103

Чтобы не заморачиваться с настройкой каждого канала в отдельности делаем так:

................................................
ap.ChannelsQuantity = 0x8;					// имеем восемь активных каналов
	// формируем управляющую таблицу
	for(i = 0x0; i < ap.ChannelsQuantity; i++)
		ap.ControlTable[i] = (WORD)(i | ((ADC_INPUT_RANGE_2500mV_E440<<0x6) | 0x32));
.................................................

При этом i изменяется от 00000000 до 00000111.
Величина ADC_INPUT_RANGE_2500mV_E440 есть ни что иное как 0000001. (стр. 17. Руководство программиста).
Что бы задать режим АЦП "32 с общей землей", усиление 4 выполним операцию  сдвига влево а затем операцию ИЛИ ((ADC_INPUT_RANGE_2500mV_E440<<0x6) | 0x32).
Где 0Х32 соответствует 00100000.В результате сдвига на шесть получим 01000000, а в результате операции ИЛИ получим значение 01100000
Выполнив операцию ИЛИ для каждого из каналов (i | ((ADC_INPUT_RANGE_2500mV_E440<<0x6) | 0x32)) получим

канал 1  01100000
канал 2  01100001
канал 3  01100010
................
канал 8  01100111

Я правильно все понял?

12.12.2014 20:21:53
#18

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

Re: Обращение к каналам АЦП E14-140-MD

Николай пишет:

Спасибо большое за ответ. Для проверки самого себя smile.

Пожалуйста! И Вам спасибо за правильный поход - с подробной проверкой.
Все почти верно, два мелких исправления:
1. Индекс коэффициента усиления равен 1 (из ряда 0, 1, 2, 3), а сам коэффициент усиления равен 4 (из ряда 1, 4, 16, 64).
2. Вы написали десятичные значения (96, 97...), поэтому нужно убрать "0x" (это в языке C обозначение шестнадцатеричной константы!).
96 = 0x60, 97 = 0x61 и т.д.

Николай пишет:
ap.ControlTable[i] = (WORD)(i | ((ADC_INPUT_RANGE_2500mV_E440<<0x6) | 0x32));

И здесь то же самое: либо 32, либо 0x20.
Вообще в этом куске кода я бы как раз написал счетчики в десятичной системе, а битовую маску в шестнадцатеричной:

ap.ChannelsQuantity = 8;
for (i = 0; i < ap.ChannelsQuantity; i++)
    ap.ControlTable[i] = (WORD)(i | (ADC_INPUT_RANGE_2500mV_E440 << 6) | 0x20);
Николай пишет:

Я правильно все понял?

За исключением смысла префикса 0x smile А в остальном - правильно и исчерпывающе подробно.

P.S. Константы, "двоичные по смыслу" (т.е. которые используются не как одно арифметическое число, а как "склеенные" битовые поля), проще и нагляднее записывать в шестнадцатеричной системе.
Поскольку 16 - это степень 2, двоичная запись числа совпадает с двоично-шестнадцатеричной, то есть можно просто каждые 4 бита, начиная с младшего, заменять одной цифрой (0x0 = 0000 ... 0xF = 1111).
Например:
0100 1100 0010 1101 0100 0011 0110 0001 0111 0010 0110 0100 = 0x4C2D43617264 smile
То есть числа любой длины кодируются "с листа", ничего не нужно умножать и складывать.

Николай
12.12.2014 21:21:41
#19

Гость

Re: Обращение к каналам АЦП E14-140-MD

Спасибо большое за ответ.

James пишет:

2. Вы написали десятичные значения (96, 97...), поэтому нужно убрать "0x" (это в языке C обозначение шестнадцатеричной константы!).

Утром до меня это дошло big_smile