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


Проблема с программированием (плата l791)

Вы не вошли.

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

йоша
24.07.2009 13:29:59
#1

Гость

Проблема с программированием (плата l791)

Здравствуйте.

Мы приобрели устройство l791 (серийный номер, программно читаемый с карты 3r386407). Я пытаюсь разобраться с тем, как можно программно работать с l791 использованием библиотеки lcomp.dll (версии 6.0.0.6). Для экспериментов я подключаю батарейку на 1,5 В к выходу X7, При этом используется однофазная схема подключения сигналов с общей землей. При использовании программы l-graph I осциллоскоп (в этой программе) показывает «нормальную» прямую линию сигнала (около 1,4 В).

Я пытался переделать один из примеров (l791.tst) под свои нужды. Далее я приведу некоторые части исходного кода, в которых из-за непонимания, как мне кажется, я мог допустить ошибки

·         установка параметров сбора данных

     ap.t2.dRate = 100.0;//с такими параметрами собираются данные с l-graph

     ap.t2.dKadr = 0.010;//с такими параметрами собираются данные с l-graph

      ap.t2.NCh = 1;//у нас подключена только батерейка на 1,5В к Х7 (тип подключения - с общей землей)

     ap.t2.Chn[0] = getLogicalChannelNumber(6, 1, 2, 0);//коэффициент усиления х4 (от -2,5 до 2,5 В), то есть логический номер канала в нашем случае получается 0x36 (54)

     ap.t2.FIFO = 1;//плата должна каждый отсчет сбрасывать в большой кольцевой буфер (data)

·         непосредственно сбор данных

     fstream file("file.txt", ios_base::out);

     fstream cfile("file.txt", ios_base::out);

     stringstream ss;

     ULONG j = 0;

     for (int i = 0; i < 2000; i++)

     {

          if (j != sync[I_ADC_PCI_COUNT_L791])

          {

                j = sync[I_ADC_PCI_COUNT_L791];//сохраняем указатель, так как sync[I_ADC_PCI_COUNT_L791] между нашими действиями

                if ((j > 1) && (j < tm))

                {

                     stringstream ss;

                     ULONG newidata = data[j-1];//так как мне кажется, что sync[I_ADC_PCI_COUNT_L791] указывают на позицию буфера куда будут записываться данные, а последние записанные данные у нас находятся 4 слова (32 бита) назад.

                     ss << j << " :    //t" << hex << newidata << dec << "     //t" << getVoltage(newidata, pd.KoefADC);

                     if (0 == (i % 10))

                     {

                          cout << ss.str() << endl;

                          cfile << ss.str() << endl;

                     }

                     file << ss.str() << endl;

                     Sleep(10);

                }

          }

          else Sleep(1000);

     }

     file.close();

     cfile.close();

·         функция расшифровки данных с АЦП

double    getVoltage(ULONG slovo, float *koefADC)//частный случай функции, в которой считается что данные считываются с канала с усилением x4

{

     ULONG value = (slovo & 0x00001fff);//маскируем необходимые нам биты, в которых должны находиться значения АЦП. младшие 13 бит, так как знак нас не интересует

     double voltage = (static_cast<double>(value) + koefADC[2]) * koefADC[10];//выполняем корректировку значения

     return voltage * (5.0 / 16384.0);//преобразуем значение в модуль напряжения

}

В начале выводятся следующие считанные программно параметры и настройки платы:

Параметры платы

SerNum 3R386407

BrdName L791

Rev A

DspType NODSP

IsDacPresent 0

Quartz 20000000

Параметры виртуального слота

Slot parameters

Base           0

BaseL          0

Mem     cfdff000

MemL        1000

Type          13

DSPType        0

Irq            3

Настройки сбора данных с АЦП

Allocated memory size(word): 524288

Buffer size(points): 131072

ap.t2.AutoInit = 1

ap.t2.dRate = 100

ap.t2.dKadr = 0.01

ap.t2.SynchroType = 0

ap.t2.SynchroSrc = 0

ap.t2.NCh = 1

ap.t2.Chn[0] = 54

ap.t2.FIFO = 1

ap.t2.IrqStep = 1024

ap.t2.Pages = 128

ap.t2.IrqEna = 0

ap.t2.AdcEna = 1

adc_master_en = 1

adc_buf_depth = 0

Но далее, к сожалению, получаются довольно странные данные (они полностью приведены в файлах file.txt и cfile.txt). Суть такова, что пока не подключена батарейка получаются следующие значения (примерно такие же и с таким же поведением как и в l-graph):

Используется такой формат

sync[I_ADC_PCI_COUNT_L791]:    data[sync[I_ADC_PCI_COUNT_L791]-1]   Напряжение

118 :      1500e000            -0.000917482

14378 :                 900e000               -0.000917482

30006 :                 1500e000            -0.000917482

45632 :                 1f00e000             -0.000917482

61258 :                 900e000               -0.000917482

76886 :                 1500e000            -0.000917482

92513 :                 e000     -0.000917482

108139 :               a00e000               -0.000917482

123766 :               1500e000            -0.000917482

<…………………….>

55203 :                 2001fff                 2.652

70828 :                 b001fff                 2.652

86455 :                 16001fff               2.652

После подключения батарейки происходит что-то странное — напряжение начинает постепенно расти, и при достижении 2,652 В сбрасывается в ноль и снова начинает расти и так далее. Выглядит это так:

44049 :                 10001fff               2.652

59676 :                 1b001fff              2.652

75302 :                 5001fff                 2.652

90929 :                 1000e000            -0.000917482

106556 :               1b00e000            -0.000917482

<тут подключаю батарейку, сначала происходят скачки напряжения (наверное, из-за помех вносимых мной руками), а затем напряжение начинает плавно расти>

122190 :               d00e4c3               0.393895

6738 :                    1100ea9e            0.879395

22365 :                 1c00e97c             0.785469

37991 :                 600e630               0.512112

53618 :                 1100e323            0.25916

69246 :                 1d00e488            0.374786

84871 :                 600e9fa               0.826278

100501 :               1400ebea            0.986923

116125 :               1c00e821             0.673082

681 :      800e859               0.691219

16306 :                 1100e88a            0.707089

31934 :                 1d00e8c3            0.72555

47561 :                 800e902               0.745955

63187 :                 1200e940            0.766036

78815 :                 1e00e95d            0.775428

94440 :                 700e982               0.787412

110067 :               1200e9b1            0.802634

125694 :               1d00e9f2             0.823687

10249 :                 800ea2c               0.842472

25876 :                 1300ea46            0.850893

41502 :                 1d00ea68            0.861905

<……………………..>

85836 :                 b00ee4a              1.18384

101465 :               1800ee71            1.19648

117090 :               100ee8c               1.20522

1644 :                    b00eea0              1.2117

17271 :                 1600eeb8            1.21947

32898 :                 100eee1              1.23275

48524 :                 b00ef07               1.24506

Помогите, пожалуйста, разобраться, в чем дело, что я неправильно делаю и каким образом необходимо в таком случае организовывать сбор данных. У меня есть несколько предположений относительно причин:
1)      неправильные параметры сбора данных
2)      возможно, при чтении данных я их читаю не с той позиции буфера, или не в том формате
3)      неверное преобразование данных 32-х разрядного слова в напряжение
4)      неправильное подключение сигналов из-за чего возникают такие помехи (это маловероятно, так как помехи не возникают в l-graph).

Заранее вам спасибо.

27.07.2009 10:46:13
#2

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

Re: Проблема с программированием (плата l791)

Программист по L-791 в отпуске. Должен появиться в понедельник.

йоша
27.07.2009 12:52:30
#3

Гость

Re: Проблема с программированием (плата l791)

Сергей, а программист этот должен появиться в понедельник 03-08-2009?

27.07.2009 13:08:21
#4

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

Re: Проблема с программированием (плата l791)

Да.

йоша
27.07.2009 13:52:14
#5

Гость

Re: Проблема с программированием (плата l791)

Спасибо, Сергей. Буду ждать понедельника.

йоша
03.08.2009 08:47:38
#6

Гость

Re: Проблема с программированием (плата l791)

ап теме в надежде на скорейшую помощь отдохнувшего программиста по l-791.

03.08.2009 09:10:27
#7

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Проблема с программированием (плата l791)

Маску надо накладывать 0xFFFF на данные. и потом приводитьих к типу
short.

В примере L791.TST это все расписано в конце файла после строчки: printf("//n Converting ...");

йоша
03.08.2009 10:26:37
#8

Гость

Re: Проблема с программированием (плата l791)

эм... я попробую вечером (плата у меня дома)
Но тогда каким образом получаемые значения переводить в напряжение?
Так как сбор данных осуществляется только с одного канала, на котором стоит усиление 4 (от -2,5 В до 2,5 В), то раньше я делал так
значение_полученное_с_ацп * (5.0 / 16384.0); //это если отбросить корректировку значений.
Теперь же при маскировке значения, получаемого с апц, (маской 0xffff) и последующем преобразовании в short будет получаться значение, не всегда лежащее в интервале [-8192; 8191]. Что делать в таких случаях? И как правильно преобразовывать значения, получаемые с апц, в напряжение?

03.08.2009 11:47:40
#9

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Проблема с программированием (плата l791)

значение всегда будет в диапазоне... преобразовывать x*2.5/8192

йоша
03.08.2009 16:48:27
#10

Гость

Re: Проблема с программированием (плата l791)

К сожалению не получаются нормальные значения и при маскировании 0xffff и последующем преобразовании к short. Получаемые таким образом значения действительно лежат в диапазоне [-8192; 8191], но даже при подключенной батарейке в 1,5В (реально 1,35В) не получается постоянное значение, читаемые с  АЦП данные имеют примерно такие поведение и значения
63187 : 1200e940 0.766036
78815 : 1e00e95d 0.775428
94440 : 700e982 0.787412
110067 : 1200e9b1 0.802634
125694 : 1d00e9f2 0.823687
10249 : 800ea2c 0.842472
25876 : 1300ea46 0.850893
41502 : 1d00ea68 0.861905
хотя по-хорошему должно установиться одно постоянное значение. Почему так не происходит? Почему с АЦП приходят такие данные?

03.08.2009 18:02:08
#11

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

Re: Проблема с программированием (плата l791)

1. Опишите, пожалуйста, как именно Вы подключаете батарейку (конкретно, к каким контактам разъема что подключено).
2. А в LGraph все работает хорошо?

03.08.2009 19:23:40
#12

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

Re: Проблема с программированием (плата l791)

Для 32-канального режима к "-" нужно присоединить AGND, GND32, а к "+" присоединить X1 (для 1-го канала). Для 16-канального режима к "-" нужно присоединить AGND, Y1, а к "+" присоенить X1 (для 1-го канала). Можно также проверить исправность в режиме "собственно нуля" - должны быть коды, близкие к нулю.

йоша
03.08.2009 20:02:03
#13

Гость

Re: Проблема с программированием (плата l791)

to Владислав
>>> 1. Опишите, пожалуйста, как именно Вы подключаете батарейку (конкретно, к каким контактам разъема что подключено).

Для подключения я использую входящий в комплект "клеммник" INTER-DB37Fv2.
На нем перемкнуты 17 и 36 выходы, а 36 перемкнут с выходом Korpus. Далее /'+/' батарейки подключаю в выходу 16 (x1), а /'-/' батарейки к 17 (agnd). Пробовал подключать батарейку и наоборот /'+/' к 17 выходу, а /'-/' к 16.

>>> 2. А в LGraph все работает хорошо?

Да, осциллоскоп в L-Graph I при подключенной батарейке показывает, примерно, верное значение (прямую линию на уровне около 1,3В). При разомкнутых сигнала какое-то максимальное значение (наверное, около 2,56В). При перемкнутых напрямую 16 и 17 выходах показывается прямая линия на уровне 0В.

йоша
03.08.2009 20:21:24
#14

Гость

Re: Проблема с программированием (плата l791)

to Гарманов Александр
>>>Для 32-канального режима к /"-/" нужно присоединить AGND, GND32, а к /"+/" присоединить X1 (для 1-го канала). Для 16-канального режима к /"-/" нужно присоединить AGND, Y1, а к /"+/" присоенить X1 (для 1-го канала).

Да, так и подключаю. Следую рисунку 6 руководства (пункт 4.6 на странице 22). Но при экспериментировании подключал также и /'-/' батарейки к 17 выходу, /'+/' к 16, надеюсь это не могло вывести из строя плату.

>>>Можно также проверить исправность в режиме /"собственно нуля/" - должны быть коды, близкие к нулю.

При перемкнутых 16 и 17 выходе (режим "собственно нуля") получаются такие данные
с ацп (четырехбайтные слова) 0x1300e000 0x1d00e000 0x0a00e000 0x0200e000 0x0c00e000 и тд,
то есть точно 0В. Но если контакты разомнуты, то получаются снова не совсем понятные
данные, как и в случае, когда подключена батарейка - напряжение пробегается все значения от -2,5В до 2,5В.

03.08.2009 20:41:49
#15

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

Re: Проблема с программированием (плата l791)

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

03.08.2009 20:52:05
#16

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

Re: Проблема с программированием (плата l791)

"Да, так и подключаю. Следую рисунку 6 руководства (пункт 4.6 на странице 22)"
- если так, значит, скорее всего, Ваши программные настройки не соответствуют 32-канальному режиму с общей землёй...

03.08.2009 20:53:58
#17

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

Re: Проблема с программированием (плата l791)

Или опрашиваете не тот номер канала, к которому фактически подключили...

йоша
04.08.2009 03:43:36
#18

Гость

Re: Проблема с программированием (плата l791)

Вы правы. Действительно, я допустил глупейшую ошибку в функции формирования номера логического канала (запутался в битах) из-за этого выбирался не тот канал с неправильным коэффициентом усиления. Сейчас всё работает прекрасно.
Спасибо огромное!

йоша
05.08.2009 16:52:43
#19

Гость

Re: Проблема с программированием (плата l791)

Здравствуйте.
От экспериментов с батарейкой мы перешли к эксперементам с тензодатчиком (Мерадат К-18М-3-С3).

При сборе данных с платы я выбираю уровень усилений 128 (от -0.078В до 0.078В). При этом
1. когда на датчик ничего не установлено получаются значения от 0 до 0x0004 (почти 0В), а мультиметр показывает 1-2мВ.
2. когда на датчик установлен груз получаются значения от 0 до 0x000d (почти 0В), а мультиметр показывает 8-9мВ.

Поэтому возникли вопросы. Какие минимальные колебания напряжений можно заметить при использовании платы.? Какие действия при подключении сигналов нужно предпринять при измерении малых напряжений? Какие параметры сбора данных использовать в таких случаях и как можно преобразовывать получаемые значения с АПЦ для увеличения точности?

Кстати значения с платы сильно колеблются и при использовании L-Graph I.

Заранее спасибо.

05.08.2009 18:35:24
#20

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

Re: Проблема с программированием (плата l791)

Вопрос требует подробного ответа. Смогу ответить на него 7-8 августа. Уточните пожалуйста: Вам требуется 1-канальный или многоканальный режим? Дайте ссылку на характеристики датчика (или на его документацию). В Вашей задаче как далеко датчик отдалён от L-791?

йоша
06.08.2009 04:48:33
#21

Гость

Re: Проблема с программированием (плата l791)

У нас будет конструкция, состоящая из 5 платформ. Под каждой платформой (по углам) будут расположены тензодатчики. Всего получается 20 датчиков (16 из них с пределом измерений в 3 тонны, 4 - в 2 тонны). Датчики будут расположены на расстоянии от 3 до 10 метров от компьютера. Документацию к датчикам (в ней указаны и его характеристики) я смогу только к вечеру отсканировать и выслать вам на почту.

06.08.2009 05:56:47
#22

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

Re: Проблема с программированием (плата l791)

Вышлите документацию на support@lcard.ru c пометкой "для Гарманова"

йоша
06.08.2009 19:07:43
#23

Гость

Re: Проблема с программированием (плата l791)

Отправил вам письмо с паспортом к тензодатчику на support@lcard.ru (в нем указаны характеристики датчика).

07.08.2009 14:59:02
#24

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

Re: Проблема с программированием (плата l791)

Из руководства на датчик следует, что  для вычисления максимального выходного напряжения при максимальном воздействии (оно равно наибольшему пределу измерения веса  НПИ – это  3,  или 4, или 5 тонн) рабочий коэффициент передачи датчика  (РКП = 2,0001мВ/В) нужно умножить на напряжение питания датчика (допустим, 10 В). Получим 20 мВ. При нулевом воздействии выходное напряжение датчика  будет 0 В. Значит,  выходной диапазон напряжений Вашего датчика равен 0 – 20 мВ.
Из характеристик L-791 следует, что эффективная разрядность АЦП на поддиапазоне +-78 мВ составляет 13-бит. Поскольку Вы будете использовать примерно 1/8 часть шкалы этого поддиапазона, то долой 3 бита, остаётся 10 битная разрешающая способность. Упрощённо говоря, это означает, что теоретически, после компенсации собственного смещения нуля (1), ошибок масштаба (шкалы) (2), после принятия мер, по минимизации межканального прохождения (3), а также после некоторого усреднения (для компенсации собственных и наведённых шумов) (4),  мы сможем получить разрешающую способность измерителя 20 мВ/1024  = примерно 20 мкВ. Это и есть упрощённый теоретический ответ на Ваш вопрос: "Какие минимальные колебания напряжений можно заметить при использовании платы.?".
Если Вы используете заводские калибровочные коэффициенты (применяя для этого штатные библиотечные функции), то компенсация ошибок собственного смещения нуля и шкалы уже происходит, но с учётом температурного и временного дрейфа точность этой калибровки будет порядка 0,1-0,2% на поддиапазоне  (+-78 мВ). При измерении малых сигналов (в области нулевых значений) основной вклад в погрешность вносит не полностью компенсированное собственное смещение нуля. Для того, чтобы почти  полностью его компенсировать (теоретически - с точностью до термо-ЭДС соединений),  в L-791 (и в остальных АЦП L-Card с коммутацией каналов) можно в кадр опроса данных включить дополнительный такт опроса АЦП в режиме измерения собственного нуля на том же самом поддиапазоне измерения  (+-78 мВ). Теперь измеренное значение собственного нуля следует вычесть из всех показаний каналов в текущем кадре.
Для минимизации межканального прохождения при сопротивлении источника сигнала до 1 кОм на длине кабеля 10 м  (+-78 мВ)  нужно установить частоту опроса каналов (частоту АЦП) не более 1 кГц, применить экранированное дифференциальное подключение источника сигнала и дифференциальный режим L-791. Усреднение показаний– это также необходимая мера для получения необходимой степени компенсации случайной составляющей оцифрованного сигнала.
Вывод: принимая в L-791 все перечисленные меры можно предположить, что абсолютная погрешность измерения на поддиапазоне +-78 мВ в районе нулевых значений шкалы составит около +-40 мкВ, а в районе максимальных значений шкалы составит  0,1-0,2% от показаний.  Оценка полной полной погрешности выглядит как  +-(50 мкВ + 0,0015*U), где входное напряжение L-791 в милливольтах.

Полезные статьи:
http://www.lcard.ru/articles/11
http://www.lcard.ru/distortions.pdf

йоша
07.08.2009 16:40:30
#25

Гость

Re: Проблема с программированием (плата l791)

Благодарю за столь подробный ответ. Буду разбираться.