|
|
Обращение к каналам АЦП 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
убрать вторую строчку, т.е. снимать данные только с первого канала, то программа перестает работать и выдавать данные с первого канала. Вопрос: что принципиально изменилось?
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: Обращение к каналам АЦП E14-140-MD
ReadData - потоковый пример, однократный ввод в программе AdcSample.
>убрать вторую строчку, т.е. снимать данные только с первого канала, то программа перестает работать
Не должна - модулю все равно в этом режиме, сколько каналов Вы опрашиваете.
(А Вам нужен именно такой однократный режим?)
Алексей, а Вы пробовали перекомпилировать изначальный исходник (с опросом двух каналов) своим компилятором и запускать? Может быть, дело не в каналах, а в том, что неправильно собирается программа сама по себе?
Трудности с компиляцией под Дельфи бывают нередко, т.к. там в разных версиях, бывает, различаются типы данных или выравнивание, и иногда треубется подпилить исходники 
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,519
|
Re: Обращение к каналам АЦП E14-140-MD
1. Какая версия библиотеки Lusbapi? Какая версия Delphi?
2. У меня подправленный пример AdcSample из библиотеки Lusbapi 3.4, собранный под Delphi 6.0, отработал нормально. Могу выслать исходники.
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Исходник компилируется нормально. При комментировании второй строчки на первом канале выдает -8192. (Проверяю на генераторе прямоугольных импульсов, амплитуда 1 В).
Мне нужен конечно потоковый ввод данных, но поскольку он не заработал, решил проверить более простой вариант. Плата исправна, проверял в программе L-Graph. Пишу в Delphi 7.0,Lusbapi 3.4
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Сергей, буду признателен, если вышлите. Вдруг будет работать лучше, хотя хочется разобраться, потому что в итоге программу надо писать самому.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,519
|
Re: Обращение к каналам АЦП E14-140-MD
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: Обращение к каналам АЦП E14-140-MD
А входы соответствующего канала АЦП подключены к источнику сигнала или к "земле"? Если нет, то АЦП может выдавать всё, что угодно, в том числе и -8192.
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: Обращение к каналам АЦП E14-140-MD
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Сергей, спасибо!
Александр, подключено по схеме 1.1 к генератору. В исходном виде программа работает нормально, на 1 канале виден подаваемый сигнал, на втором 0. При комментировании строчки опроса второго канала, выдает как я писал выше.
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Я правильно понял, что в этом примере данные с 1 канала снимаются в общем режиме, а со 2 канала - в дифференциальном?
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: Обращение к каналам АЦП E14-140-MD
Бит 4 там установлен, это измерение собственного нуля.
При InputRangeIndex = 1:
канал 0 (ctl_word = 0x40) в дифференциальном режиме, 2.5V
канал 1 (ctl_word = 0x51) измерение собственного нуля, 2.5V
Так что схема подключения не соответствует.
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Тогда подскажите пожалуйста пример, как должен выглядеть логический номер канала для получения данных, например, с первого канала в режиме "с общей землей" и диапазоном измерения +-10 В. А то я, видимо, запутался в этом вопросе.
|
|
- Сотрудник "Л Кард"
- Здесь с 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. Выслал консольный пример, доработанный под Ваш тип подключения.
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Спасибо, присланный пример заработал. Проблема была в правильности обращения к каналам.
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Здравствуйте. У меня ситуация аналогичная как и у Алексея. Нет четкого понимания п.3.2.3."Логический номер канала АЦП" руководства программиста. Я понимаю, что входной диапазон 5V ADC_INPUT_RANGE_5000mV_E154, а что такое 0x6? Подключено 4 канала АЦП с 1-4 по схеме 1.1. Если изменить ap.ChannelsQuantity = 0x1; на выходе ничего нет. В общем запутался. Спасибо. P.S. Выдержку из тестового примера привести не могу вот это сообщение просто достало: Обнаружен парный тег без соответствующего закрывающего тега
|
|
- Сотрудник "Л Кард"
- Здесь с 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. Выдержку из тестового примера привести не могу вот это сообщение просто достало: Обнаружен парный тег без соответствующего закрывающего тега
А Вы обратили внимание, что в Вашем сообщении эта часть текста получилась курсивом (italic) - вместо "парный тег [i] без соответствующего закрывающего тега [/i]"? Для кода есть специальный инструмент. Используйте кнопочку "блок кода" в редакторе сообщения или BB-коды [code]...[/code]:
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Спасибо большое за ответ. Для проверки самого себя . Допустим у меня есть 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
Я правильно все понял?
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: Обращение к каналам АЦП E14-140-MD
Николай пишет:Спасибо большое за ответ. Для проверки самого себя .
Пожалуйста! И Вам спасибо за правильный поход - с подробной проверкой. Все почти верно, два мелких исправления: 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 А в остальном - правильно и исчерпывающе подробно. P.S. Константы, "двоичные по смыслу" (т.е. которые используются не как одно арифметическое число, а как "склеенные" битовые поля), проще и нагляднее записывать в шестнадцатеричной системе. Поскольку 16 - это степень 2, двоичная запись числа совпадает с двоично-шестнадцатеричной, то есть можно просто каждые 4 бита, начиная с младшего, заменять одной цифрой (0x0 = 0000 ... 0xF = 1111). Например: 0100 1100 0010 1101 0100 0011 0110 0001 0111 0010 0110 0100 = 0x4C2D43617264 То есть числа любой длины кодируются "с листа", ничего не нужно умножать и складывать.
|
|
|
Re: Обращение к каналам АЦП E14-140-MD
Спасибо большое за ответ. James пишет: 2. Вы написали десятичные значения (96, 97...), поэтому нужно убрать "0x" (это в языке C обозначение шестнадцатеричной константы!).
Утром до меня это дошло 
|