Меню

+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Спасибо.
Драйвера проверил - все установлены. Неизвестных устройств в в системе нет. Сообщений что устройства "могут работать быстрее" нет. Выглядит что все работает в штатном режиме. На всякий случай переустановил драйвера - эффекта не дало.
Подключаюсь к USB2.0
Хаб USB2.0 найду попробую - посмотрим даст эффект или нет.
На всякий случай проверил спецификацию CPU - пишут что энергоэффективных ядер нет, все шутрые, так что дело точно не в них.
Дополню.
Гипотетически я бы мог предположить что процессы запускаются на энергоэффективных ядрах, а не на высокопроизводительных. Но. Приложение, в котором это все работает, имеет метрику FPS. Так вот по PFS на AMD Ryzen 7700 в 10-15 раз выше чем на Intel Core i7 и остальных (также запускал на старых китайских зеонах, где также скорость измерения каждого канала не превышала 1-2мс). Поэтому теория о том, что дело в энергоэффективных ядрах весьма спорная.
Добрый вечер!
Помогите пожалуйста разобраться со следующей проблемой:
Есть код, который проходит по всем 32-м каналам АЦП, последовательно, используя опрос одного канала:
for (int i=0; i<(toChannel-fromChannel+1); i++){
ansyncPar.Chn[0] = (i+fromChannel) | (gain << 6) | 0x20; // i канал однополлюсное подключение (в общем случае лог. номер канала)
status = pI->IoAsync(&ansyncPar);
if (status!= L_SUCCESS){
this->logger->AddLog("e14440::GetState ADC error %lu\n", status);
this->Close();
}
*(arr+i) = (short)ansyncPar.Data[0];
}
На железе Intel Core i7 6700 (и такой же древности Intel-лов) обход всех каналов занимает 32-35мс. Т е на обход каждого канала затрачивается 1-2мс. Это нас полностью устраивает. Простой код, все понимают что каналы опрашиваются последовательно. Все хорошо.
Но, после того, как приложение запустили на AMD Ryzen 7700, время опроса резко выросло. И этот же код 32 канала опрашивает за 416мс. Т е на время опроса каждого канала затрачивается 13мс. Что в 10-13 раз медленней чем на "древнем" железе.
ОС одинаковая: Windows 10 x64.
"непрерывный" режим не пробовал не измерял т к по сути нужно разобраться почему на новом, боле-менее современном железе обмен данными с АЦП работает в 10 раз медленней.
Подскажите, в чем может быть проблема?
Драйвер брал с сайта, стандартный LComp. Версия 7.0.0.5.
Добрый вечер!
Подскажите пожалуйста: как корректно определять доступность АЦП?
Проблема:
- Включаем АЦП: запускаем приложение: АЦП нашлось, запустился сбор данных путем перебора значений выводов:
==
for (int i=0; i<(toChannel-fromChannel+1); i++){
ansyncPar.Chn[0] = (i+fromChannel) | (gain << 6) | 0x20;
status = pI->IoAsync(&ansyncPar);
if (status!= L_SUCCESS){
this->logger->AddLog("e14440::GetState ADC error %lu\n", status);
this->Close();
}
*(arr+i) = (short)ansyncPar.Data[0];
}
==
Если в этот момент я выдерну USB, то сбор данных "продолжится", ошибка не определяется.
Добрый вечер!
Спасибо огромное за ответ!
Поправил алгоритм, результат стал быть похожим на правду.
По типу АЦП: сообщение я писал уже в ночи, опечатался, извините. Речь идет о Е14-440.
Еще одни вопрос:
dKadr я устанавливаю в 0 (при dRate=2.5), после иниализации беру значение частоты и задержки и вижу, что АЦП dKadr устанавливает в 0.4
==
23:15:20: Rate: 2.500000
23:15:20: Kadr: 0.400000
==
По какому принципу происходит этот пересчет? Это время переключения на новый кадр с канала 0?
Добрый вечер!
Помогите пожалуйста разобраться с логикой программирования параметров частоты сбора данных.
Имею: E14-400
К ней подключено, допустим 25 каналов. Для отладки подключен генератор импульсов каждый 200мс пеняющий статус порта 0/5В/0/5В/...
Цель: собирать измерения со всех 25 каналов в течении 3-х секунд с частотой 100 герц на канал.
Моя логика:
в 1 секунду нужно каждый канал измерить 100 раз. Т е я должен получить на выходе массив слов размеров: 25*3*100 = 7500. или по 300 слов на канал.
Т е получается за 3 секунды я должен получить 300 кадров по 25 каналов в каждом.
Смотрю в описание (lcomp):
=
E14-440/E14-140/E154
• dRate - частота опроса каналов в кадре в килогерцах;
• dKadr - интервал между кадрами в миллисекундах, фактически определяет скорость сбора данных;
==
Значение буфера пока не меняю, оставляю как в примере:
==
adcPar.t1.FIFO = 1536;
adcPar.t1.IrqStep = 1536;
adcPar.t1.Pages = 16;
adcPar.t1.IrqEna = 1;
adcPar.t1.AdcEna = 1;
==
Дальше магия.
Как я понимаю: частоту dRate я задаю для измерений внутри кадра, хоть 1кГц, количеством же полученных кадров я управляю через dKadr.
Т е чтобы на 1 секунду получить 100 кадров, я задаю dKadr = 10.
Но при таких параметрах измерение идет оочень долго.
Для отладки сделал генератор импульсов, который каждые 200мс устанавливает/сбрасывает напряжение на портах в 5В. Когда добиваюсь того, чтобы измерение шло 3с, вижу что ловится всего несколько импульсов, часть пропускается.
Подскажите, в чем ошибка моего понимания?
И так, для тех кто столкнется с тем, на что наступил я.
В E14-400 ЦАП 12 бит. т е 0x0000 - 0x0FFF
Диапазон -5 - +5 В
Первые 11 бит это диапазон 0-5В
12-й бит это признак отрицательного значения (0x0800)
В явном виде в документации этого не нашел (с теми, кто уверен что этого писать не надо т к "само-собой разумеется" я не согласен. Документация к коммерческому продукту должна быть очевидна и включать все мелочи, это экономит время разработки). Оставляю свой опыт здесь.
И так, оставлю комментарий для тех, кто пойдет по моим стопам.
С проблемой разобрался, gcc тут непричем.
Основные положения:
- Стоит обратить внимание что в примерах SDK АЦП работает в дифференциальном режиме. На это стоит обратить внимание при отладке, особенно если вы подключаете сигнал к общей земле и используете однополюсной режим; Я долго не мог понять что происходит, почему одни сигнал нормальные а другие хрен знает какие, пока в сотый раз не перечитал структуру настройки каналов в инструкции и не обратил внимание в 'L-Graph I' на галочку в верхнем углу, переключающую режим.
- Установка задержки между кадрами. В инструкции ничего не нашел по этому поводу. Наверное для разработчиков которые "в теме" это само-собой разумеющийся параметр. Для мена он таковым не является. Вот ссылка где доходчиво про это написано: https://studfile.net/preview/420362/
- Лучше все-таки заземлять неиспользуемые выводы. Если этого не сделать, незадействованные выводы будут фонить, если заходите выводить графики на один экран могут быть сюрпризы.
- Если получили отрицательные числа X, то перевести их в отчеты нужно по по формуле 0xFFFF-X. - Установлено методом научного тыка.
Пожалуй это ключевые моменты, не понимая которые меня затормозили.
Из не решенного вопроса на текущий момент вижу вопрос с переводом отсчетов в Вольты.
Также почему-то вылетает по сегментации ф-ция из примера:
==
if(pI) pI->CloseLDevice();
if(pI) pI->Release(); <- Вот тут вылетает. Странно, буду с этим разбираться.
==
В общем есть над сем работать.
Спасибо за внимание.
Все доброго времени суток!
Подскажите, не сталкивался ли кто-нибудь с подобной проблемой:
Есть сигнал поданный на вход АЦП (14-440).
Если открыть lcomp для windows (l7xx.osc) то в окне это выглядит вот так
Но как бы ладно, тут еще есть варианты пофильтровать разобраться
Далее я пересобрал на gcc пример lcomp (l7xx.tst) под консоль, получил файл data.dat, загрузил его в тотже lgraph и получил такую картинку:
Примерно такую же картину я получаю в своем приложении.
Тут явно что-то не то. Герцовку менял, все остальные параметры зашитые в примере не трогал. Собираю под 32-х битную версию...
Из технических деталей даже не знаю что еще приложить.
Подскажите пожалуйста, может кто сталкивался или у вас будут мысли хоть в какое направление копать?
Здравствуйте!
Помогите пожалуйста разобраться с записью в ЦАП.
Использую пример:
==
ASYNC_PAR pp;
pp.s_Type = L_ASYNC_DAC_OUT;
pp.Mode = port; //0 или 1, зависит от номера порта
pp.Data[0] = value; //Значение
pI->IoAsync(&pp);
==
При этом уровень сигнала выхода на ЦАП не изменяется.
Подскажите, есть ли еще где-нибудь более подробный пример? Или В каком месте можно более подробно прочитать про установку уровня ЦАП?
Страницы 1