Форум: Техническая поддержка

Тема: Указатель на void

Вы не вошли.

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

13.11.2014 16:37:47
#1

Участник
Здесь с 24.10.2014
Сообщений: 26

Указатель на void

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

скажите пожалуйста как можно получить уровни напряжений на каналах Е2010В? В примере l7xx.tst, который рекомендуется использовать в руководстве программиста, данные из кольцевого буфера переписываются в файл, сохраняя при этом тип void* (или void**). Указатель на void можно привести к любому типу, но к какому его надо привести, чтобы получить адекватные значения, при пределах измерения +-0,3В? Я посмотрел параметр pointsize, он равен двум байтам? Значит ли это, что void необходимо приводить к целому значению?

спасибо

13.11.2014 18:03:32
#2

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

Re: Указатель на void

массив signed short

14.11.2014 08:40:45
#3

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: Указатель на void

Переделал преобразование к signed short. Получил следующие значения :
...
7
7
10
8
8
9
9
11
9
...

Правильно ли я понимаю, что при настроенных пределах измерения +- 0,3 вольта, значению -0,3 вольта соответствует значение -32768, а +0,3 вольта - 32767? В таком случае полученные значения, которые приведены выше означают, что сигнал незначительно колеблется около 0?

спасибо

14.11.2014 09:25:54
#4

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

Re: Указатель на void

+-8192тк ацп 14бит и таки да около нуля

14.11.2014 09:34:45
#5

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

Re: Указатель на void

только наверное не 8192, а 8000, судя по пункту 3.2.1 документа http://www.lcard.ru/download/e2010_prog … _guide.pdf. Плюс еще калибровку (если нужна) надо либо разрешать на уровне платы, либо вручную делать.

18.12.2014 15:15:31
#6

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: Указатель на void

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

скажите пожалуйста, почему при установленном adcPar.t2.dKadr, равном 0, сбор данных происходит, при значении, отличном от 0 - нет. Настройки привел ниже.

    adcPar.t2.s_Type = L_ADC_PARAM;
    adcPar.t2.AutoInit = 1;
    adcPar.t2.dRate = 1000.0;
    adcPar.t2.dKadr = 0.0;
    adcPar.t2.SynchroType = 0x01;//0x84;//0x01;
    adcPar.t2.SynchroSrc = 0x00;
    adcPar.t2.AdcIMask = SIG_0|SIG_1|GND_2|GND_3;
         
    adcPar.t2.NCh = 1;
    adcPar.t2.Chn[0] = 0x0;
    adcPar.t2.FIFO = 32768;
    adcPar.t2.IrqStep = 32768;
    adcPar.t2.Pages = 32;
    adcPar.t2.IrqEna = 1;
    adcPar.t2.AdcEna = 1;

    // extra sync mode
    adcPar.t2.StartCnt = 0;
    adcPar.t2.StopCnt = 0;
    adcPar.t2.DM_Ena = 0;
    adcPar.t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0; // 0
    adcPar.t2.AdPorog = 0;
 

спасибо

18.12.2014 16:31:58
#7

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

Re: Указатель на void

отличном от нуля это какое число. Там интервал задается в миллисекундах, а порция 32К. Я проверил сейчас 0.1 - работает. Если числа больше то жадть дольше надо до изменения счетчика...

19.12.2014 09:29:31
#8

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: Указатель на void

я испытывал при 5.0.  Тогда, при порции 32 К, ждать необходимо около 160 секунд, получается. Я так долго не ждал. Спасибо Вам за  ответ - ситуация теперь понятна.

Вчера всплыла еще одна. Размер большого буфера у меня получается 1048576, как произведение IrqStep и Pages (32768 * 32). В примере l7xx.tst собираются половинки буфера. Я вчера попробовал собрать целиком весь. В куске кода, который собирает информацию из буфера:

 
    unsigned long  s;
        InterlockedExchange (&s, *sync);
        ULONG fl2, fl1 = fl2 = (s <= halfbuffer) ? 0 : 1;
   
        // ожидание заполнения буфера
        while (fl2 == fl1) {
            InterlockedExchange (&s, *sync);
            fl2 = (s <= halfbuffer) ? 0 : 1;
            std::cout << s << " ";
            }
       
        std::cout << halfbuffer << " " 
                     << ((signed short *)data) [halfbuffer - 1] 
                     << std::endl;
        
        InterlockedExchange (&s, *sync);
        fl1 = (s <= halfbuffer) ? 0 : 1;                 
        
        Sleep(200);

при значении

 ULONG halfbuffer = adcPar.t2.IrqStep * adcPar.t2.pages / 1;

равном  1048576 (т.е. длине кольцевого буфера), все время крутится цикл ожидания заполнения буфера, переменная s при этом всегда равна 0. 

При значении halfbuffer, равном 131072 (т.е. ~ в 10 раз меньшем, значение взято произвольным образом как произведение 1024 * 128) цикл ожидания крутится не бесконечно, значение переменной s изменяется, сбор данных вроде бы происходит , но, очевидно не полностью.

Скажите пожалуйста можно ли при сборе и обработке данных рассматривать весь буфер целиком, если да, то что я делаю неправильно?

спасибо

19.12.2014 12:25:57
#9

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

Re: Указатель на void

Sergei Alexeev пишет:

Скажите пожалуйста можно ли при сборе и обработке данных рассматривать весь буфер целиком

Если я правильно понял вопрос, то кольцевой буфер во время потокового сбора данных всегда "занят" - находится в процессе заполнения (идет запись в буфер данных по мере их поступления от АЦП).
Если начать обрабатывать весь буфер целиком, то начало массива будет испорчено, потому что АЦП запишет отсчет x(t+N*dt) поверх x(t).
Поэтому и рассматривают буфер в виде двух половин: как только пройдена отметка в полбуфера, у нас есть время забрать и обработать эти данные, пока пишется вторая половина.

Советую прочитать статьи FAQ про буферизацию: здесь и здесь.

19.12.2014 15:13:14
#10

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

Re: Указатель на void

в примере работа идет половинками буфера. s флаг того какая половинка заполнилась. пределы измененения sync 0 до (1048576-32768). Если хочется однократно заполнить буфер то можно AutoInit в 0 поставить.

26.12.2014 17:17:42
#11

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: Указатель на void

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

скажите пожалуйста, как можно посчитать время заполнения большого кольцевого буфера? Например, как посчитать, за какое время будет заполняться буфер размером 1048576 машинных слов (DWORD)? Известно время между кадрами в миллисекундах, но неизвестно  время заполнения одного кадра, содержащего данные по двум каналам.

Как заполняется буфер данными, полученными с разных каналов? Из документа  http://www.lcard.ru/download/e2010_prog … _guide.pdf я понял, что вперемешку. Т.е. данные первого канала адресуются как data[0], data[2], data[4], data[6], ... ,а второго, соответственно data[1], data[3], data[5], data[7], ... ?


с наступающим Новым Годом и Рождеством,

спасибо

26.12.2014 17:34:54
#12

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

Re: Указатель на void

данные действительно так и лежат. время сбора кадра из частоты опросов каналов выходит которая dRate и количества каналов в кадре

29.12.2014 12:01:51
#13

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

Re: Указатель на void

Sergei Alexeev пишет:

как посчитать, за какое время будет заполняться буфер размером 1048576 машинных слов (DWORD)? Известно время между кадрами в миллисекундах, но неизвестно  время заполнения одного кадра, содержащего данные по двум каналам.

Если "время между кадрами" - это период кадра, то это одно и то же.

Размер буфера в байтах разделить на размер отсчета АЦП (если отсчет 16-битный, то 2) - получится размер буфера в отсчетах.
Если дополнительная межкадровая задержка не используется, то размер буфера в отсчетах просто разделить на частоту дискретизации и всё.
А если межкадровая задержка есть, то разделить на количество каналов в кадре (получится количество кадров в буфере) и умножить на период следования кадров (см. 3.2.4. "Формат кадра отсчетов" в том же руководстве).

29.12.2014 12:36:39
#14

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: Указатель на void

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

спасибо Вам за ответ, я это уже реализовал. Скажите, вот еще вопрос - можно ли настроить программно , например структурой ADC_PAR уровни напряжений на входе прибора 0,3В, 1В или 3В?

спасибо

29.12.2014 12:44:16
#15

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

Re: Указатель на void

в ADC_PAR можно задать программно входной диапазон для канала АЦП через логический номер канала. Но именно таких величин там нет.

29.12.2014 12:46:04
#16

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: Указатель на void

а то значение, которое задается вашей программой, оно сохраняется потом при выключении прибора?

29.12.2014 12:53:38
#17

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

Re: Указатель на void

нет.

18.01.2015 19:31:53
#18

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: Указатель на void

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

скажите пожалуйста, достаточно ли установить параметр adcPar.t2.NCh = 2 чтобы lcard e2010 регистрировал два канала?

adcPar.t2.AdcIMask = SIG_0|SIG_1|GND_2|GND_3;
adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.Chn[2] = 0x2;
adcPar.t2.Chn[3] = 0x3;

Т.е. правильно ли я понимаю, что при установке adcPar.t2.NCh = 1 прибор регистрирует первый канал в виде:

 <1>, <1>, <1>, <1>, <1>, <1>, ... , <1>

? А при установке adcPar.t2.NCh = 2 прибор регистрирует данные первого и второго каналов в виде:

 <1>, <2>, <1>, <2>, <1>, <2>, <1>, <2>, <1>, <2>, <1>, <2>, <1>, <2>, ... 

- как описано в инструкции к прибору?

Какую функцию выполняет тогда параметр

adcPar.t2.Chn[]

? В документации на прибор этот параметр упомянут как коэффициент усиления входного синала.

спасибо

19.01.2015 12:47:23
#19

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

Re: Указатель на void

Он формирует кадр для опроса (до 128 каналов ) и задает порядок опроса в этом кадре. Можно опращивать  например  1 1 1 2  2 1 1 3  - типа кадр из 8 каналов

19.01.2015 13:18:42
#20

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: Указатель на void

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

спасибо за Ваш ответ. Т.е., если я правильно понял при установкt

adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.Chn[2] = 0x0;
adcPar.t2.Chn[3] = 0x1;

получается последовательность

<1>, <2>, <1>, <2>,<1>,<2>

.

А какой формируется кадр при следующих установках (когда количество опрашиваемых каналов установлено 2, но в массиве присутсвуют номера 3 и 4 кадра)?

adcPar.t2.NCh = 2;
adcPar.t2.Chn[0] = 0x0;
adcPar.t2.Chn[1] = 0x1;
adcPar.t2.Chn[2] = 0x2;
adcPar.t2.Chn[3] = 0x3;

спасибо

19.01.2015 14:47:26
#21

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

Re: Указатель на void

Nch и задает сколько элементов из таблицы брать для кадра

19.01.2015 15:30:12
#22

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

Re: Указатель на void

Sergei Alexeev пишет:

Какую функцию выполняет тогда параметр

adcPar.t2.Chn[]

?

Это логический номер канала, для E2010 там номер физического канала (0..3), см. параграф 3.2.3 в e2010_programmers_guide.pdf

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск