cDAQ Проблема с аналоговым выходом

Простейшие вопросы в области инженерной разработки
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

cDAQ Проблема с аналоговым выходом

Сообщение jane_wild »

Ребята не могу понять в чем причина.
Используя в качестве примера Voltage (non-regeneration) - Continuous Output.vi из папки Examples, создала свой vi.
всё как бы работает, но изменения частоты или амплитуды происходят с огромной задержкой, порядка 20 секунд. Т.е я подключаю осцилограф на выход модуля NI 9263, который установлен в cDAQ 9189, далее запускаю vi, осцилограф показывает две синусоиды. Я изменяю, скажем частоту, изменения на осцилографе наступают секунд через 20, причем на графике в vi меняется сразу же. Создается такое впечатление, что на железном уровне в драйвере накапливается очередь, потому как упомянутые 20 секунд относительны, чем дольше работает vi , тем больше задержка. Думала бракованый NI 9263, взяла другой - результат тот же. Для убедительности подключала частомер, думала осцилограф глючный, нет все в норме. В чем может быть причина?
P.S. задача: Нужно генерировать две синусоиды от 50 до 5000 Гц с разной амплитудой и иметь возможность менять параметры во время работы.

Спасибо.
Вложения
Sin Generator.vi
(39.01 КБ) 79 скачиваний
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: cDAQ Проблема с аналоговым выходом

Сообщение Borjomy_1 »

Т.е генерация сигнала производится быстрее, чем ЦАП успевает выдавать. Поэтому все закономерно. Решается эта задача контролем количества сгенерированных ЦАПом значений. И добавлением в буфер только когда остаток в нем будет меньше какого-то порога. Это и будет являться временем реакции на изменение сигнала
Хотя я проверил на NI PCI-6052 и тут криминала не увидел - свойство Total Samples Per Channell Generated различается с инкрементальным счетчиком сгенерированного массива на 8900+- отсчетов. Осциллографом, правда, не смотрел. Но на других устройствах с подобным дефектом сталкивался.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение Artem.spb »

Тоже такое замечал. На некоторых устройствах очередь "бесконечная" и не контролирует, сколько в неё впихнули.
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение taras_33 »

Первоначальный запуск происходит нормально? Если да то: Что то изменили -> остановили задачу, очистили -> внесли изменения -> запустили и пусть себе накапливает очередь, если это ни на что не влияет... Хотя странно это всё. Я использую в одном проекте такую же технику и никакой задержки не наблюдается. Правда там работает usb 6218 и генерирует одну синусоиду.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: cDAQ Проблема с аналоговым выходом

Сообщение Borjomy_1 »

taras_33 писал(а): 26 мар 2021, 21:56 Первоначальный запуск происходит нормально? Если да то: Что то изменили -> остановили задачу, очистили -> внесли изменения -> запустили и пусть себе накапливает очередь, если это ни на что не влияет... Хотя странно это всё. Я использую в одном проекте такую же технику и никакой задержки не наблюдается. Правда там работает usb 6218 и генерирует одну синусоиду.
Задача состоит в непрерывной генерации. Тут нельзя остановить и снова запустить. Весь цимес в непрерывности и времени реакции на изменение
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение jane_wild »

Borjomy_1 писал(а): 26 мар 2021, 17:14 Решается эта задача контролем количества сгенерированных ЦАПом значений. И добавлением в буфер только когда остаток в нем будет меньше какого-то порога. Это и будет являться временем реакции на изменение сигнала
И как проверить сколько ЦАП фактически успел записать? На выходе DAQmx Write.vi (writing number of samples per channel) количество совпадает с #s и равно 8000.

Я тут подумала что предложение Taras_33 имеет право на жизнь. Только если уж останавливать и создавать новую задачу то имеет смысл использовать пример Analog Output\Voltage - Continuous Output.vi из папки examples
Поправьте меня если мои рассуждения не верны. Я создаю кусочек синусоиды, (вернее несколько периодов) который я посылаю в cDAQ один раз, а он уже повторяет его снова и снова. Следовательно чтобы получилась непрерывная синусоида, последний сэмпл должен отличаться на один отсчет от нуля, потому как новый цикл повторения начинается именно с него. Я так понимаю, что нужно перед созданием новой задачи, рассчитать sampling rate и количество самих сэмплов так, чтобы окончание синусоиды совпадало с началом новой генерации. Проблема усугубляется тем, что фактическая частота не всегда совпадает с запрашиваемой. Я уже не упоминаю о двух синусоидах. Мне бы хоть с одной разобраться
Посмотрите на мое творение, если ввести скажем 3000Гц но окончание почти совпадает с началом. А если 1953, то совсем нет.
И здесь я прошу помощи с математикой, у меня с ней всегда были сложности. Помогите рассчитать верные sampling rate и количество самих сэмплов чтобы синусоида была непрерывной. Спасибо.
Вложения
SinGen Folder.zip
(158.06 КБ) 68 скачиваний
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение Artem.spb »

jane_wild писал(а): 29 мар 2021, 05:10 И как проверить сколько ЦАП фактически успел записать? На выходе DAQmx Write.vi (writing number of samples per channel) количество совпадает с #s и равно 8000.
Свойства как обычно рулят :)
daq.png
Я тут подумала что предложение Taras_33 имеет право на жизнь.
Ну останавливать задачу без веских на то причин - так себе затея. Просто потому что на это тратится "много" времени.
Поправьте меня если мои рассуждения не верны. Я создаю кусочек синусоиды, (вернее несколько периодов) который я посылаю в cDAQ один раз, а он уже повторяет его снова и снова. Следовательно чтобы получилась непрерывная синусоида, последний сэмпл должен отличаться на один отсчет от нуля, потому как новый цикл повторения начинается именно с него. Я так понимаю, что нужно перед созданием новой задачи, рассчитать sampling rate и количество самих сэмплов так, чтобы окончание синусоиды совпадало с началом новой генерации. Проблема усугубляется тем, что фактическая частота не всегда совпадает с запрашиваемой. Я уже не упоминаю о двух синусоидах.
Зачем такие сложности? Для регенерации не нужно забивать весь буфер, драйвер гоняет по кругу то, что есть. И менять частоту генерации "на ходу" тоже странная идея.
Нужно выбрать частоту генерации и запустиь задачу. Дальше сгенерировать ОДИН период и отправить его в буфер. При смене выходного сигнала отправить в буфер новый один период.
Давно такое делал, так что может уже что-то путаю в технических деталях, но по воспоминаниям генерировал выходной сигнал длиной в несколько недель (для одного научного эксперимента) именно в таком духе.
И там как раз была проблема с "бесконечным" буфером. Поэтому перед отправкой очередной порции нужно было проверять, что предыдущее уже на исходе
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение taras_33 »

jane_wild писал(а): 29 мар 2021, 05:10
Я тут подумала что предложение Taras_33 имеет право на жизнь. Только если уж останавливать и создавать новую задачу то имеет смысл использовать пример Analog Output\Voltage - Continuous Output.vi из папки examples
Если не гонять фазу по кругу, а писать всегда с нуля, то генерировать две синусоиды не получится. Дискретизация и количество точек, для каждого канала, должно быть одинаковыми иначе получишь ошибку записи.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение jane_wild »

taras_33 писал(а): 29 мар 2021, 18:58 Если не гонять фазу по кругу, а писать всегда с нуля, то генерировать две синусоиды не получится. Дискретизация и количество точек, для каждого канала, должно быть одинаковыми иначе получишь ошибку записи.
К моему большому сожалению Вы правы. Без информации о фазе генерировать две синусоиды нельзя. Остается вариант с "Do Not Allow Regeneration" mode.
Borjomy_1 писал(а): 26 мар 2021, 17:14 Т.е генерация сигнала производится быстрее, чем ЦАП успевает выдавать. Поэтому все закономерно. Решается эта задача контролем количества сгенерированных ЦАПом значений. И добавлением в буфер только когда остаток в нем будет меньше какого-то порога. Это и будет являться временем реакции на изменение сигнала
Хотя я проверил на NI PCI-6052 и тут криминала не увидел - свойство Total Samples Per Channell Generated различается с инкрементальным счетчиком сгенерированного массива на 8900+- отсчетов. Осциллографом, правда, не смотрел. Но на других устройствах с подобным дефектом сталкивался.

Вы также правы, у меня в свойстве Total Samples Per Channel Generated с каждой итрерацией записывается чуть больше тысячи, хотя я запрашиваю 8000. И с каждой последующей этот разрыв увеличивается. Со свойством Space Available in Buffer мне вообще непонятно как его использовать , сколько там вообще места? Какого размера этот самый буфер?
И еще заметила что цикл после запуска начинает крутится как сумашедший и только после нескольких десятков интераций, начитает работать, как и предполагается с временем 100mS. Получается что мои запрашиваемые 8000 значений, которые на скорости 80000 должны записываться 0.1 секунду полностью игнорируются?
Что бы это значило? Вообщем слишком много вопросов...
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение Artem.spb »

jane_wild писал(а): 30 мар 2021, 14:45 мне вообще непонятно как его использовать , сколько там вообще места? Какого размера этот самый буфер?
Ключевое слово "свойства" (property), они по-прежднему рулят
daq.png
daq.png (12 КБ) 2173 просмотра
How Is Buffer Size Determined?
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение jane_wild »

Artem.spb писал(а): 30 мар 2021, 16:18
jane_wild писал(а): 30 мар 2021, 14:45 мне вообще непонятно как его использовать , сколько там вообще места? Какого размера этот самый буфер?
Ключевое слово "свойства" (property), они по-прежднему рулят
daq.png

How Is Buffer Size Determined?
Спасибо за ссылку.
For generations, the amount of data you write before starting a generation determines the size of the buffer. The first call to a Multiple Samples version of the Write function/VI creates a buffer and determines its size.
Получаестя что буфер создается автоматически при первом вызове и в точности равен размеру данных ( в моем случае 8000). Свойство Space Available in Buffer всегда возвращает целое значение кратное тысяче 2000, 6000, 4000 либо ноль. Все равно не совсем понятна локика. Каждые 100mS я проверяю это свойство и если там есть место, то записываю туда данные, так? Если да, то сколько бы там места небыло, в любом случае будет меньше 8000, а следовательно очередная порция данных из 8000 туда не влезет... Что то я совсем запуталась. :shok:
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение Artem.spb »

jane_wild писал(а): 30 мар 2021, 17:26 следовательно очередная порция данных из 8000 туда не влезет...
Функция записи имеет параметр timeout. Если за это время буфер успеет опустошиться, то всё прекрасно влезет.

Свойство Space Available in Buffer всегда возвращает целое значение кратное тысяче 2000, 6000, 4000 либо ноль. Все равно не совсем понятна локика. Каждые 100mS я проверяю это свойство
так чтоб прям угадать кратно 1000 действительо странно. Но чисто в теории, если частота 10К, то каждые 100 мс из буфера уходит 1к точек, так что всё правильно.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение Artem.spb »

Кстати, для проверки, реальо ли все запросы улетают в буфер, можно (раз уже техника позволяет) закинуть в этот самый буфер десяток другой разных синусов и посмотреть, что там на выходе. Если там будут все синусы, значить буфер игнорирует свои настройки и разбухает. А если часть синусов пропадёт, значит идёт перезапись данных в буфере.
И то и другое странно
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: cDAQ Проблема с аналоговым выходом

Сообщение jane_wild »

Отчитываюсь. Вообщем заработало :dance:
Borjomy_1 писал(а): 26 мар 2021, 17:14 Решается эта задача контролем количества сгенерированных ЦАПом значений. И добавлением в буфер только когда остаток в нем будет меньше какого-то порога.
Именно так я и сделала. Порог установила в три раза больше буфера, т.е. когда разница между количеством записанных и реально сгенерированных точек станет меньше 24000, то добавить новую порцию.
Works version.JPG
Заметила что после остановки и Clear Task, значение на выходе NI 9263 не нулевое, я догадываюсь что это последняя записаная точка. Получается что Clear Task не сбрасывает модуль (его выходы) в ноль. Поэтому перед остановкой задачи я записываю нулевую амплитуду и жду когда это реально сгенерируется в модуле (второй while loop).

Ну и чем выше генерируемая частота, тем заметнее ступенька, а на максимальной частоте 5k совсем уж кошмар, нужно будет нашим железячникам мудрить какой то фильтр, что бы эту ступеньку сгладить.
Sinewave.jpg
Еще раз спасибо за консультацию
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: cDAQ Проблема с аналоговым выходом

Сообщение Borjomy_1 »

Что касается ступенек, то надо-ли? Это всего лишь паразитная гармоника на частоте 5кГц х 16 отсчётов, т.е порядка 80кГц. Даже хороший фильтр внесёт множество искажений, шумы и амплитудную зависимость от температуры. Если анализируете ответ только на базовой частоте, то ничего не добавляйте.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»