Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Здравствуйте.
Я посмотрел тот пример, что Вы присылали.
Тут нужно учитывать, что хотя сам модуль позволяет вводить и выводить сигнал синхронно с заданной частотой и диаграммы синхронного ввода и вывода привязаны к одной точке старта, но сами данные между модулем и программой на ПК передаются с задержками. Более того, под ОС общего назначения эти задержки строго не определены и могут варьироваться от запуска к запуску.В связи с этим синхронный вывод с точной привязкой по времени возможен только при условии, что на момент вывода данные уже загружены в сам модуль, т.е. всегда нужно иметь загруженную часть сигнала в памяти самого модуля (время предзагруженного сигнала в общем и определяет макс. суммарную задержку, которая не приведет к разрыву данных).
У Вас в программе выполняется предзагрузка, но всего на две точки для каждого канала (что для частоты 2.5 КГц меньше мс).
В результате, когда Вы запускаете синхронный ввод-вывод через StreamsStart, пока модуль пошлет ответ (функция завершается по успешному ответу от модуля) и этот ответ будет обработан программой ПК, у Вас эти точки уже давно будут выведены и из-за отсутствия новых данных последняя точка будет повторяться до тех пор, пока не придут новые данные, которые уже начнут выводиться синхронно с момента прихода, но длительность паузы пока данных не было будет зависеть от задержек передачи ответа, его обработки, посылки новых данных, которые каждый раз разные. При этом с АЦП данные собираются с момента старта всегда синхронно и хоть и получаются в ПК с задержкой, но соответствуют синхронным моментам времени с заданной частотой от начала сбора.Таким образом Вам нужно изначально предзагрузить достаточно данных - хотя бы 7-10 Ваших циклов по 8 мкс, чтобы к моменту посылки новых данных буфер на вывод не опустошился и вывод был бы строго синхронным. Я для проверки у себя завел DOUT1 и DOUT2 на первый и второй канал АЦП и проверил Ваш пример с достаточной предзагрузкой, в результате получился синхронный сигнал с той же задержкой от начала, что и выводилось, без сдвигов от запуска к запуску:
При обработке данных от АЦП Вы при необходимости можете учитывать эту разницу в циклах, т.е. первый принятый цикл данных с АЦП будет соответствовать точно первому предзагруженному циклу и т.д.Также у Вас несколько странно был сделан сам вывод. В Prepeare передается размер каждого сигнала (на цикл у Вас 20 точек) и каждый массив на входе должен быть этого размера, а в Send передается уже размер слов общего результирующего массива. Т.к. Вы используете все 3 потока вывода, то он должен быть в 3 раза больше. У Вас же получалось, что Вы подавали размер 4, при этом массив цифровых линий был из одного элемента (3 других по сути использовались как мусор из памяти за массивом), далее получался массив на 12 элементов из которых Вы передавали только 4 первых (ЦАП1, ЦАП2, DOUT, ЦАП1), что соответствовало двум циклам вывода, где во втором значения ЦАП2 и DOUT повторялись, т.к. они не пришли в кадре (т.е. так как Вы из выходного потока передавали все равно только один DOUT, то лишний мусор на выходе из PrepareData не видели). Да и разбивать цикл на 10 частей и выводить по два отсчета особого смысла не имеет, логичнее формировать и посылать сразу блок на цикл в 8 мс (времена реакции в 1мс все равно сильно меньше мин. возможных задержек в windows).
Подправленный пример я выслал Вам на почту.
P.S,: если цикл всегда одинаковый, а вывод уровней на ЦАП явно к фазе цикла не привязан, то проще использовать циклический вывод для DOUT и асинхронный для ЦАП.
Спасибо! Теперь все синхронно работает.
Еще такой вопрос - вывод на DOUT логичнее сделать с частотой 1250 Гц и поделить логический массив на 10 столбцов, но при попытке так сделать, он устанавливает частоту вывода 1953.12 Гц, получается это минимальная частота вывода для карты?
Добрый день!
Работаю с картой E-502 в Labview в синхронном режиме, задача состоит в том, чтобы выводить импульсы в определенной последовательности на цифровые выводы и считывать данные АЦП с 6 каналов. К карте собственно подключаются оптические датчики.
В качестве основы взял ваш пример по синхронному сбору АЦП и добавил синхронный вывод на DOUT. Данные по АЦП следующие: частота кадра — 10000 Гц, частота сбора одного канала — 60000 Гц, частота вывода на DOUT — 2500 Гц.
Вывод сигналов работает нормально, проверил на осциллографе, а сбор данных осуществляется с какой-то временной задержкой, см. рисунок:
https://www.lcard.ru/forums/img/members … 3-1158.jpg
Т.е. регистрируемые импульсы с АЦП запаздывают по отношению к управляющим импульсам, подающимся на DOUT. Причем эта задержка меняется при каждом запуске программы.
Задача состоит в том, чтобы считывать уровень полки импульса и далее с ней работать, а в таком режиме работы это невозможно...
Подскажите пожалуйста как можно синхронизировать вывод и ввод данных, или хотя бы стабилизировать временную задержку между ними?
Заранее спасибо!
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск