|
|
|
|
2 канала ЦАП E14-140D
Подскажите как правильно заполнять WhiteBuffer
для вывода гармонического сигнала с обоих каналов?
for(i = 0; i < (DWORD)dp.DacFifoLength; i++)
{
WriteBuffer[i] = Round(SignalAmplitude*sin(2.0*M_PI*SignalFrequency*CurrentTime));
WriteBuffer[i] &= (WORD)(0x0FFF);
WriteBuffer[i] |= (WORD)(0x0 << 12);
i++;
WriteBuffer[i] = Round(SignalAmplitude*sin(2.0*M_PI*SignalFrequency*CurrentTime));
WriteBuffer[i] &= (WORD)(0x0FFF);
WriteBuffer[i] |= (WORD)(0x1 << 12);
CurrentTime += 1.0/dp.DacRate;
}
Но такой вариант работает плохо
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
Вроде бы все правильно. А что значит "такой вариант работает плохо"?
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
Моя проблема описана к конце этого форума http://www.lcard.ru/forumthreads/5476
Но я выяснил что всётаки похоже ЦАП мне в какой-то момент выдаёт сдвинутый синус.
вобщем дело обстоит так: несколько периодов нормально выдаётся синус а потом в какой-то момент выдаёт так: http://2whitespirit.googlepages.com/sinus.JPG
а дальше такой глюк повторяется чаще.
Причём, вроде как, если работать только с одним каналом синус всё время выводится без глюков.
Может как-то специально надо установить размер буфера или BaseIndex?
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
1. Есть подозрение, что речь идёт про модуль E14-440D.
2. Я так понимаю, что у Вас одновременно работают АЦП и ЦАП?
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
Подскажите поскорее, а то я уже неделю голову ломаю, понять не могу в чём дело.
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
Сейчас проверил на осцилографе как генерирует Цап синус. Так на осцилографе всё нормально показывает. Значит получается что проблема именно в считывании данных. Подскажите пожалуйста в чём может быть проблема?
может буфер поменьше сделать или чистить его как-нибудь?
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
В руководстве пользователя написано, что при одновременной потоковой работе АЦП и ЦАП их частоты не должны превышать соответственно:
-- 100 кГц (ввод) и 100 кГц (вывод) для модулей с ревизиями ‘A’÷’C’;
-- 250 кГц (ввод) и 125 кГц (вывод) для модулей с ревизиями ‘D’ и выше.
У Вас эти условия выполняются?
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
Да, выполняются. Причем с самого начала обработки синус несколько периодов идёт нормально и только через некоторое время начинает глючить. Вот у меня и возникла мысль что это из-за буфера.
Скажите, есди я к вам подъеду не уделите ли вы пол часика что бы с этим попробовать разобраться? У вас ведь опыта много. А я сам никак не могу найти закономерность этого явления.
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
А штатный консольный пример из директории /E14-440/Examples/Borland C++ 5.02/ReadWrite/ работает нормально?
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
К сожалению его проверить нет возможности.
Т.к. моя задача немного специфичная.
В том примере на макимальной частоте читают несколько блоков данных в файл, а я на маленькой по одному блоку с последующей обработкой перед сохранением в файл, вот и думаю что может даже и обработка вызывает такое явление, так что мне этот пример не очень поможет.
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
Нормально работающий штатный пример ReadWrite означает, что библиотека и сам модуль функционируют корректно. Т.о. проблема только в программной реализации Вашего собственного алгоритма.
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
Здравствуйте, появилось время проверить штатный пример ReadWrite. Оказалось что он тоже подглючивает.
Достаточно просто поставить вывод тех данных на экран, которые записываюся в файл и подождать немного. Особенно часто этот глюк появляется при запросе очередного ADC_DATA_BLOCK_QUANTITY.
Вот пример минимальномодифицированной программы
http://2whitespirit.googlepages.com/Rea … esting.cpp
и пример лога вывода с ошибкой в начале. Как раз после двух пропущенных строк идёт вывод очередного ADC_DATA_BLOCK_QUANTITY, и в его начале виден глюк.
Channel[1]= 1884 Channel[2]= 03 Channel[3]= 2052 Channel[4]= 03
Channel[1]= 2218 Channel[2]= 03 Channel[3]= 2376 Channel[4]= 03
Channel[1]= 2527 Channel[2]= 01 Channel[3]= 2675 Channel[4]= 02
Channel[1]= 2816 Channel[2]= 02 Channel[3]= 2948 Channel[4]= 02
Channel[1]= 3073 Channel[2]= 02 Channel[3]= 3191 Channel[4]= 03
Channel[1]= 3300 Channel[2]= 02 Channel[3]= 3399 Channel[4]= 03
Channel[1]= 3493 Channel[2]= 03 Channel[3]= 3575 Channel[4]= 03
Channel[1]= 3652 Channel[2]= 03 Channel[3]= 3716 Channel[4]= 02
Channel[1]= 3773 Channel[2]= 03 Channel[3]= 3819 Channel[4]= 02
Channel[1]= 3855 Channel[2]= 03 Channel[3]= 3880 Channel[4]= 03
Channel[1]= 3899 Channel[2]= 03 Channel[3]= 3907 Channel[4]= 03
Channel[1]= 3905 Channel[2]= 02 Channel[3]= 3893 Channel[4]= 03
Channel[1]= 3870 Channel[2]= 02 Channel[3]= 3839 Channel[4]= 02
Channel[1]= 3795 Channel[2]= 03 Channel[3]= 3746 Channel[4]= 03
Channel[1]= 3684 Channel[2]= 03 Channel[3]= 3613 Channel[4]= 03
Channel[1]= 3537 Channel[2]= 02 Channel[3]= 3449 Channel[4]= 02
Channel[1]= 3351 Channel[2]= 02 Channel[3]= 3245 Channel[4]= 03
Channel[1]= 3132 Channel[2]= 03 Channel[3]= 3011 Channel[4]= 02
Channel[1]= 2882 Channel[2]= 03 Channel[3]= 2745 Channel[4]= 01
Channel[1]= 2603 Channel[2]= 04 Channel[3]= 2451 Channel[4]= 02
Channel[1]= 2298 Channel[2]= 02 Channel[3]= 2137 Channel[4]= 03
Channel[1]= 1967 Channel[2]= 02 Channel[3]= 1796 Channel[4]= 02
Channel[1]= 1621 Channel[2]= 03 Channel[3]= 1439 Channel[4]= 03
Channel[1]= 1256 Channel[2]= 02 Channel[3]= 1067 Channel[4]= 03
Channel[1]= -2946 Channel[2]= 03 Channel[3]= -2813 Channel[4]= 03
Channel[1]= -2672 Channel[2]= 03 Channel[3]= -2525 Channel[4]= 04
Channel[1]= -2373 Channel[2]= 03 Channel[3]= -2215 Channel[4]= 03
Channel[1]= -2048 Channel[2]= 03 Channel[3]= -1881 Channel[4]= 02
Channel[1]= -1705 Channel[2]= 04 Channel[3]= -1528 Channel[4]= 03
Channel[1]= -1344 Channel[2]= 03 Channel[3]= -1160 Channel[4]= 04
Channel[1]= -969 Channel[2]= 03 Channel[3]= -777 Channel[4]= 02
Channel[1]= -585 Channel[2]= 02 Channel[3]= -390 Channel[4]= 03
Channel[1]= -195 Channel[2]= 03 Channel[3]= 02 Channel[4]= 02
Channel[1]= 198 Channel[2]= 02 Channel[3]= 394 Channel[4]= 02
Channel[1]= 588 Channel[2]= 02 Channel[3]= 781 Channel[4]= 03
Channel[1]= 972 Channel[2]= 01 Channel[3]= 1162 Channel[4]= 02
Channel[1]= 1347 Channel[2]= 02 Channel[3]= 1530 Channel[4]= 01
Channel[1]= 1708 Channel[2]= 02 Channel[3]= 1884 Channel[4]= 02
Channel[1]= 2053 Channel[2]= 03 Channel[3]= 2218 Channel[4]= 02
Channel[1]= 2377 Channel[2]= 03 Channel[3]= 2529 Channel[4]= 02
Channel[1]= 2676 Channel[2]= 04 Channel[3]= 2816 Channel[4]= 02
Channel[1]= 2948 Channel[2]= 01 Channel[3]= 3073 Channel[4]= 04
Channel[1]= 3190 Channel[2]= 03 Channel[3]= 3301 Channel[4]= 02
Channel[1]= 3400 Channel[2]= 02 Channel[3]= 3493 Channel[4]= 02
Channel[1]= 3576 Channel[2]= 02 Channel[3]= 3653 Channel[4]= 03
Channel[1]= 3717 Channel[2]= 03 Channel[3]= 3772 Channel[4]= 03
Channel[1]= 3820 Channel[2]= 03 Channel[3]= 3854 Channel[4]= 02
Channel[1]= 3881 Channel[2]= 02 Channel[3]= 3900 Channel[4]= 03
Channel[1]= 3908 Channel[2]= 03 Channel[3]= 3905 Channel[4]= 03
Channel[1]= 3893 Channel[2]= 03 Channel[3]= 3871 Channel[4]= 02
Channel[1]= 3839 Channel[2]= 02 Channel[3]= 3795 Channel[4]= 02
Channel[1]= 3745 Channel[2]= 02 Channel[3]= 3684 Channel[4]= 02
Channel[1]= 3614 Channel[2]= 03 Channel[3]= 3537 Channel[4]= 02
Channel[1]= 3449 Channel[2]= 03 Channel[3]= 3351 Channel[4]= 02
Channel[1]= 3244 Channel[2]= 03 Channel[3]= 3132 Channel[4]= 03
Channel[1]= 3010 Channel[2]= 03 Channel[3]= 2883 Channel[4]= 02
Channel[1]= 2745 Channel[2]= 02 Channel[3]= 2603 Channel[4]= 04
Channel[1]= 2452 Channel[2]= 02 Channel[3]= 2299 Channel[4]= 02
Channel[1]= 2136 Channel[2]= 03 Channel[3]= 1967 Channel[4]= 02
Channel[1]= 1796 Channel[2]= 02 Channel[3]= 1620 Channel[4]= 02
Channel[1]= 1440 Channel[2]= 03 Channel[3]= 1256 Channel[4]= 02
Channel[1]= 1068 Channel[2]= 03 Channel[3]= 879 Channel[4]= 03
Channel[1]= 685 Channel[2]= 02 Channel[3]= 492 Channel[4]= 02
Channel[1]= 296 Channel[2]= 02 Channel[3]= 99 Channel[4]= 03
Channel[1]= -96 Channel[2]= 03 Channel[3]= -293 Channel[4]= 03
Channel[1]= -488 Channel[2]= 02 Channel[3]= -682 Channel[4]= 04
Channel[1]= -875 Channel[2]= 03 Channel[3]= -1065 Channel[4]= 03
Channel[1]= -1253 Channel[2]= 02 Channel[3]= -1437 Channel[4]= 02
Channel[1]= -1618 Channel[2]= 02 Channel[3]= -1793 Channel[4]= 03
Channel[1]= -1964 Channel[2]= 02 Channel[3]= -2133 Channel[4]= 02
Channel[1]= -2295 Channel[2]= 02 Channel[3]= -2448 Channel[4]= 02
Channel[1]= -2600 Channel[2]= 02 Channel[3]= -2743 Channel[4]= 03
Channel[1]= -2879 Channel[2]= 03 Channel[3]= -3008 Channel[4]= 03
Channel[1]= -3129 Channel[2]= 03 Channel[3]= -3241 Channel[4]= 02
Channel[1]= -3348 Channel[2]= 01 Channel[3]= -3445 Channel[4]= 03
Channel[1]= -3534 Channel[2]= 02 Channel[3]= -3611 Channel[4]= 02
Channel[1]= -3681 Channel[2]= 03 Channel[3]= -3742 Channel[4]= 02
Channel[1]= -3792 Channel[2]= 02 Channel[3]= -3836 Channel[4]= 02
Channel[1]= -3867 Channel[2]= 04 Channel[3]= -3890 Channel[4]= 03
Channel[1]= -3903 Channel[2]= 02 Channel[3]= -3904 Channel[4]= 03
Channel[1]= -3897 Channel[2]= 02 Channel[3]= -3878 Channel[4]= 02
Channel[1]= -3850 Channel[2]= 03 Channel[3]= -3816 Channel[4]= 02
Channel[1]= -3769 Channel[2]= 01 Channel[3]= -3713 Channel[4]= 03
Channel[1]= -3649 Channel[2]= 01 Channel[3]= -3573 Channel[4]= 02
Channel[1]= -3490 Channel[2]= 02 Channel[3]= -3396 Channel[4]= 03
Channel[1]= -3298 Channel[2]= 03 Channel[3]= -3189 Channel[4]= 02
Channel[1]= -3070 Channel[2]= 04 Channel[3]= -2945 Channel[4]= 02
Channel[1]= -2812 Channel[2]= 04 Channel[3]= -2671 Channel[4]= 03
Channel[1]= -2525 Channel[2]= 03 Channel[3]= -2374 Channel[4]= 03
Channel[1]= -2215 Channel[2]= 03 Channel[3]= -2049 Channel[4]= 03
Channel[1]= -1881 Channel[2]= 02 Channel[3]= -1705 Channel[4]= 04
Channel[1]= -1528 Channel[2]= 02 Channel[3]= -1345 Channel[4]= 02
Channel[1]= -1158 Channel[2]= 03 Channel[3]= -969 Channel[4]= 03
Channel[1]= -777 Channel[2]= 02 Channel[3]= -585 Channel[4]= 03
Немого более полный лог лежит тут:
http://2whitespirit.googlepages.com/log.txt
Потестируете пожалуйста на своих модулях, и если такое у вас не повториться то хотелось бы приехать и проверить мой модуль на исправность.
Если повториться, то дайте рекомендации как такого избежать.
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
Для пояснения.
Выход с первого канала ЦАП подключен к 1 и 3 каналу АЦП одновременно.
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
1. Вывод на экран текстовой информации такого объёма является достаточно медленной операцией, а Вам надо не менее чем через 32 мс вызывать очередную функцию WriteData(). Не легче ли просто просмотреть записанный штатным ReadWrite бинарный файл данных в любом предназначенной для этого программе, например L-Graph I (http://www.lcard.ru/download/lgraph1.zip) или L-Graph II (http://www.lcard.ru/download/#9).
2. Можно попробовать увеличить размер DataStep.
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
1. Наблюдается та же ситуация без текстового вывода и при просмотре на L-Graph 2.
вот http://2whitespirit.googlepages.com/teeest.JPG
Причём ситуация вообще идентичная, сначала идёт всё хорошо, потом начинаются глюки.
2. В каком мысле увеличить DataStep? я его задаю в том диапазоне, который описан в инструкции и всё должно работать нормально.
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
проверьте, пожалуйста, на ваших модулях, это очень важно и сроки поджимают.
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
1. Какие частоты работы АЦП и ЦАП используются в Вашем алгоритме?
2. Например, если при вводе данных задать DataStep=512 при частоте АЦП равной 400 кГц, то очередные ReadData() необходимо будет будет вызывать по меньшей мере каждую 1 мс. Такой алгоритм работы модуля под Windows заранее обречен на провал. Вывод: размер запроса для ReadData() следует выбирать таким, чтобы время его выполнения была не менее 15-30 мс.
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
Насчёт L-Graph II ...
Я же уже говорил, что отображение большого кол-ва данных на экране дисплея одновременно с их сбором на высоких частотах АЦП - неправильный подход. При этом однозначно будут сбои в работе модуля. Следует сначала записать данные в файл (без отображения их на экране), а потом спокойно их просмотреть на предмет наличия сбоев.
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
Я же написал, что использую штатный пример ReadWrite.
Единственное что я там поменял это DataStep поставил DataStep = MAX_DAC_FIFO_SIZE_E440
Вот именно он, можете посмотреть(правда там он с текстовым выводом, но,как я уже написал, без него работает точно так же)
http://2whitespirit.googlepages.com/Rea … esting.cpp
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
1. Я же с самого начала говорил, что сперва следует запустить именно ШТАТНЫЙ пример ReadData. И не надо ничего в нем менять. Затем тупо проверить полученные данные на предмет наличия сбоев. Без этого шага сложно двигаться дальше.
2. И всё-таки: какие частоты АЦП и ЦАП используются?
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
1. Сейчас попробую.
2. Как и в штатном примере ReadWrite это 250 АЦП и 125 ЦАП
|
|
|
|
|
Re: 2 канала ЦАП E14-140D
Штатный пример ReadWrite работает номально, но стоит изменить DataStep = MAX_DAC_FIFO_SIZE_E440, начинаются глюки. Вы хотите сказать что это из-за тех самых 15-30 мс?
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,535
|
Re: 2 канала ЦАП E14-140D
Это минимальные значения. В общем случае временной интервал выполнения запросов ReadData или WriteData должен выбирать с запасом, т.е. быть больше, чем время обработки полученных данных (в данном случае это процедура сохранение данных в файл). Кроме того, размеры запросов сильно зависит от степени загруженности компьютера, скорости работы дисковой подсистемы и т.д. Короче, чем больше величина запросов, тем надежнее работает Ваше приложение.
|