cDAQ Проблема с аналоговым выходом
- jane_wild
- master
- Сообщения: 461
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 84 раза
- Поблагодарили: 15 раз
- Контактная информация:
cDAQ Проблема с аналоговым выходом
Ребята не могу понять в чем причина.
Используя в качестве примера Voltage (non-regeneration) - Continuous Output.vi из папки Examples, создала свой vi.
всё как бы работает, но изменения частоты или амплитуды происходят с огромной задержкой, порядка 20 секунд. Т.е я подключаю осцилограф на выход модуля NI 9263, который установлен в cDAQ 9189, далее запускаю vi, осцилограф показывает две синусоиды. Я изменяю, скажем частоту, изменения на осцилографе наступают секунд через 20, причем на графике в vi меняется сразу же. Создается такое впечатление, что на железном уровне в драйвере накапливается очередь, потому как упомянутые 20 секунд относительны, чем дольше работает vi , тем больше задержка. Думала бракованый NI 9263, взяла другой - результат тот же. Для убедительности подключала частомер, думала осцилограф глючный, нет все в норме. В чем может быть причина?
P.S. задача: Нужно генерировать две синусоиды от 50 до 5000 Гц с разной амплитудой и иметь возможность менять параметры во время работы.
Спасибо.
Используя в качестве примера 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 КБ) 81 скачивание
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: cDAQ Проблема с аналоговым выходом
Т.е генерация сигнала производится быстрее, чем ЦАП успевает выдавать. Поэтому все закономерно. Решается эта задача контролем количества сгенерированных ЦАПом значений. И добавлением в буфер только когда остаток в нем будет меньше какого-то порога. Это и будет являться временем реакции на изменение сигнала
Хотя я проверил на NI PCI-6052 и тут криминала не увидел - свойство Total Samples Per Channell Generated различается с инкрементальным счетчиком сгенерированного массива на 8900+- отсчетов. Осциллографом, правда, не смотрел. Но на других устройствах с подобным дефектом сталкивался.
Хотя я проверил на NI PCI-6052 и тут криминала не увидел - свойство Total Samples Per Channell Generated различается с инкрементальным счетчиком сгенерированного массива на 8900+- отсчетов. Осциллографом, правда, не смотрел. Но на других устройствах с подобным дефектом сталкивался.
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Тоже такое замечал. На некоторых устройствах очередь "бесконечная" и не контролирует, сколько в неё впихнули.
-
taras_33
- professional
- Сообщения: 392
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Первоначальный запуск происходит нормально? Если да то: Что то изменили -> остановили задачу, очистили -> внесли изменения -> запустили и пусть себе накапливает очередь, если это ни на что не влияет... Хотя странно это всё. Я использую в одном проекте такую же технику и никакой задержки не наблюдается. Правда там работает 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!
So far, the Universe is winning!
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: cDAQ Проблема с аналоговым выходом
Задача состоит в непрерывной генерации. Тут нельзя остановить и снова запустить. Весь цимес в непрерывности и времени реакции на изменениеtaras_33 писал(а): ↑26 мар 2021, 21:56 Первоначальный запуск происходит нормально? Если да то: Что то изменили -> остановили задачу, очистили -> внесли изменения -> запустили и пусть себе накапливает очередь, если это ни на что не влияет... Хотя странно это всё. Я использую в одном проекте такую же технику и никакой задержки не наблюдается. Правда там работает usb 6218 и генерирует одну синусоиду.
- jane_wild
- master
- Сообщения: 461
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 84 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
И как проверить сколько ЦАП фактически успел записать? На выходе 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 КБ) 69 скачиваний
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Свойства как обычно рулят :)
Ну останавливать задачу без веских на то причин - так себе затея. Просто потому что на это тратится "много" времени.Я тут подумала что предложение Taras_33 имеет право на жизнь.
Зачем такие сложности? Для регенерации не нужно забивать весь буфер, драйвер гоняет по кругу то, что есть. И менять частоту генерации "на ходу" тоже странная идея.Поправьте меня если мои рассуждения не верны. Я создаю кусочек синусоиды, (вернее несколько периодов) который я посылаю в cDAQ один раз, а он уже повторяет его снова и снова. Следовательно чтобы получилась непрерывная синусоида, последний сэмпл должен отличаться на один отсчет от нуля, потому как новый цикл повторения начинается именно с него. Я так понимаю, что нужно перед созданием новой задачи, рассчитать sampling rate и количество самих сэмплов так, чтобы окончание синусоиды совпадало с началом новой генерации. Проблема усугубляется тем, что фактическая частота не всегда совпадает с запрашиваемой. Я уже не упоминаю о двух синусоидах.
Нужно выбрать частоту генерации и запустиь задачу. Дальше сгенерировать ОДИН период и отправить его в буфер. При смене выходного сигнала отправить в буфер новый один период.
Давно такое делал, так что может уже что-то путаю в технических деталях, но по воспоминаниям генерировал выходной сигнал длиной в несколько недель (для одного научного эксперимента) именно в таком духе.
И там как раз была проблема с "бесконечным" буфером. Поэтому перед отправкой очередной порции нужно было проверять, что предыдущее уже на исходе
-
taras_33
- professional
- Сообщения: 392
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Если не гонять фазу по кругу, а писать всегда с нуля, то генерировать две синусоиды не получится. Дискретизация и количество точек, для каждого канала, должно быть одинаковыми иначе получишь ошибку записи.
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!
So far, the Universe is winning!
- jane_wild
- master
- Сообщения: 461
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 84 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
К моему большому сожалению Вы правы. Без информации о фазе генерировать две синусоиды нельзя. Остается вариант с "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 секунду полностью игнорируются?
Что бы это значило? Вообщем слишком много вопросов...
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Ключевое слово "свойства" (property), они по-прежднему рулят How Is Buffer Size Determined?
- jane_wild
- master
- Сообщения: 461
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 84 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Спасибо за ссылку.Artem.spb писал(а): ↑30 мар 2021, 16:18Ключевое слово "свойства" (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 туда не влезет... Что то я совсем запуталась.
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Функция записи имеет параметр timeout. Если за это время буфер успеет опустошиться, то всё прекрасно влезет.
так чтоб прям угадать кратно 1000 действительо странно. Но чисто в теории, если частота 10К, то каждые 100 мс из буфера уходит 1к точек, так что всё правильно.Свойство Space Available in Buffer всегда возвращает целое значение кратное тысяче 2000, 6000, 4000 либо ноль. Все равно не совсем понятна локика. Каждые 100mS я проверяю это свойство
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Кстати, для проверки, реальо ли все запросы улетают в буфер, можно (раз уже техника позволяет) закинуть в этот самый буфер десяток другой разных синусов и посмотреть, что там на выходе. Если там будут все синусы, значить буфер игнорирует свои настройки и разбухает. А если часть синусов пропадёт, значит идёт перезапись данных в буфере.
И то и другое странно
И то и другое странно
- jane_wild
- master
- Сообщения: 461
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 84 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: cDAQ Проблема с аналоговым выходом
Отчитываюсь. Вообщем заработало
Ну и чем выше генерируемая частота, тем заметнее ступенька, а на максимальной частоте 5k совсем уж кошмар, нужно будет нашим железячникам мудрить какой то фильтр, что бы эту ступеньку сгладить. Еще раз спасибо за консультацию
Именно так я и сделала. Порог установила в три раза больше буфера, т.е. когда разница между количеством записанных и реально сгенерированных точек станет меньше 24000, то добавить новую порцию. Заметила что после остановки и Clear Task, значение на выходе NI 9263 не нулевое, я догадываюсь что это последняя записаная точка. Получается что Clear Task не сбрасывает модуль (его выходы) в ноль. Поэтому перед остановкой задачи я записываю нулевую амплитуду и жду когда это реально сгенерируется в модуле (второй while loop).
Ну и чем выше генерируемая частота, тем заметнее ступенька, а на максимальной частоте 5k совсем уж кошмар, нужно будет нашим железячникам мудрить какой то фильтр, что бы эту ступеньку сгладить. Еще раз спасибо за консультацию
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: cDAQ Проблема с аналоговым выходом
Что касается ступенек, то надо-ли? Это всего лишь паразитная гармоника на частоте 5кГц х 16 отсчётов, т.е порядка 80кГц. Даже хороший фильтр внесёт множество искажений, шумы и амплитудную зависимость от температуры. Если анализируете ответ только на базовой частоте, то ничего не добавляйте.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение