Свежие обсуждения
Измерения

DDS-генератор на AVR - нужна помощь

1 140 189

Леонид Иванович: Ладно, ладно, ухожу. На шутку ATLab не надо обижаться.. А самое лучшее продолжение от Леонида Ивановича, это просто открыть на pro-radio.ru тему, например : "Генератор на DDS от Леонида Ивановича" Или как по другому назовете...
Какие будут мнения?

 

Можно Леонида Ивановича и здесь послушать, почему нет. Также понимаю ATLab, накатали 130 страниц и не только о генераторе. Теперь, чтобы что-то найти, надо основательно потрудиться. Ну да ладно, что ж теперь..в чёрной крепости его надо было через дымоход брать, да...

 

Л.И.: Иначе никак, ведь внутри одного цикла DDS нужно перегрузить две 32-разрядных переменных, на это просто нет времени. Да и в моем случае ресурсов не хватает для таких вещей.
Отношение мощности синусоидального сигнала к мощности шумов квантования равно 1.76+6.02·N dB. Т.е. в Вашем случае это 49.92 dB. Это максимальная теоретическая оценка, не учитывающая ни нелинейность ЦАП, ни шумы квантования фазы в DDS

Ну, хорошо, о децибелах ни слова. (Формулу вашу подправлю только: 6.02*N+1.76+10log(Fs/(2Fmax)), последнее слагаемое даст дополнительно 13 дБ)

Ну, положим, генератор у вас простаивает 1.5 мкс, да ещё требуется время на приём кода новой частоты по уарту, думаю, что генерация-таки прерывается. А в моём варианте принимается код частоты (пакет 5 байт) и после выдачи выборки старой частоты через 0.5 мкс выдаётся выборка уже новой частоты, т.е. нет перерыва генерации на загрузку-разгрузку. Так же и для свипа.

 

Vlad_Petr На шутку ATLab не надо обижаться

Так это была шутка?

GM Формулу вашу подправлю только

С исправлением согласен, мой вариант формулы был для полной зоны Найквиста (Fmax = 1/2*Fs), при таких условиях результаты у нас будут равны. А дополнительные 13 дБ будут, если сузить полосу Вашего генератора до 50 кГц, тут Вы правы. Получите примерно 63 дБ. По этой формуле для 16-разрядного генератора с Fs = 206 кГц и Fmax = 50 кГц получите примерно 101 дБ. Разница - 38 дБ. Но хочу подчеркнуть, что есть еще шум квантования фазы (или еще говорят "phase truncation spurs"), который совсем не белый. Ну да ладно.

GM думаю, что генерация-таки прерывается

Время на прием кода новой частоты учитывать не надо, так как прием ведётся в фоне. У меня ведь DDS работает в прерывании таймера, других прерываний в системе нет, но зато есть время на выполнение основной задачи. Прерывание, с учетом времени входа и выхода, занимает 92 цикла. Таймер генерирует прерывания каждые 97 циклов. Загрузка процессора задачей DDS составляет 95%, а 5% остается на основную задачу, где ведется прием команд от управляющего процессора (используется поллинг). Когда команда полностью принята и данные сохранены в буфере, DDS останавливается, код частоты (или фазы) копируется в рабочие регистры DDS, и DDS снова запускается. Прерывания генерации нет, просто очередной отсчет после перезагрузки появляется на выходе с некоторой небольшой дополнительной задержкой (на копирование буфера в регистры). Это и есть скачок фазы. Плохо, конечно, но нормальный генератор без таких скачков нужно уже строить на ПЛИС.

 

Леонид Иванович: Vlad_Petr На шутку ATLab не надо обижаться

Так это была шутка?
Вообще то, я писал не в шутку: не люблю, когда все мешают в одну кучу (кроме окрошки):
1. эта тема посвящена вполне определенной конструкции и преследует вполне определенную цель,
2. конструкции Л.И. - вполне самостоятельные и законченные изделия, которых с темой объединяет только принцип -DDS.
3. выкладки Л.И., как всегда, полны и понятно, что тему он знает хорошо, но... он уводит в сторону, обсуждение вновь возвращается к основам, GM начинает защищать свой алгоритм... Так можно дискутировать до бесконечности с нулевым результатом на выходе.

Поэтому прошу: при всем уважении, Л.И. организуйте другую тему про свои генераторы - у них совершенно другая конструкция, другой код программы, обсуждать детали которого здесь, imho, нет смысла.
Насколько я помню, основной затык здешней конструкции был в построении выходного фильтра и выходного каскада. Есть у Вас предложения на эту тему?

P.S. Почитал еще раз последние страницы, в уме сложился такой образ: пришел взрослый парень с набором "Лего-робот" в песочницу и говорит малышне: фигня ваши песочные куличики, смотрите как надо робота программировать...
А не надо малышне роботов, им хочется куличик и именно из песка. Умеешь - помоги. Из песка. Из лего - это совсем другая история...
Еще раз: не в обиду...

 

ATLab Извините, пожалуйста!

 

ATLab: пришел взрослый парень с набором "Лего-робот" в песочницу и говорит малышне: фигня ваши песочные куличики, смотрите как надо робота программировать...
А не надо малышне роботов, им хочется куличик и именно из песка. Умеешь - помоги. Из песка. Из лего - это совсем другая история...
Еще раз: не в обиду...

Резковато как-то Вы. Я из спора GM и Леонида Ивановича извлек новую для себя информацию. Опыт в вопросах генерации сигналов дорогого стоит.
Нельзя бояться критики, нужно уметь защищать свою точку зрения не переходя на личности, а вы такого специалиста хотите из нашей песочницы выпихнуть. Не стоит.

Теперь вопрос, а скорее просьба к Леониду Ивановичу: у нас так и не родился хороший оконечник с фильтром, поэтому прошу Вашего разрешения на использование фрагмента схемы проекта "SG-532" для завершения "DDS-1". Это открытый проект, поэтому крайние версии схем и плат будут выложены в интернете и доступны для повторения всеми желающими.
Ибо как правильно заметил ATLAB затык в нашем проекте возник именно тут и за последний месяц никто не предложил нормального проверенного варианта его решения.

 

madgrey: нет никаких проблем с использованием любых частей схемы SG-532, как и других моделей генераторов (все схемы я публиковал). Вот только мой выходной буфер медленноват для обсуждаемого здесь генератора. По крайней мере, придется подобрать более быстрый ОУ. А можно в качестве буфера применить и что-то интегральное, например, AD811. У него выходной ток 100 мА, этого как раз хватает для работы на нагрузку 50 Ом (+50 Ом согласующий резистор). Есть и другие интегральные решения, можно посмотреть драйверы ADSL.

Ну а фильтр вполне нормальный и LC, как было здесь на схемах. Между резисторной матрицей ЦАП и фильтром нужно, конечно, ставить ОУ. Можно тот же AD811. Фильтр не обязательно рассчитывать с входным/выходным импедансом 50 Ом, вполне можно и 200 или 600 Ом, чтобы была возможность применить ОУ с меньшим выходным током.

Можно поставить и активный фильтр, но для частоты среза порядка 1 МГц потребуются довольно быстрые ОУ. А из дешевых все теперь низковольтные, это потребует организации специального уровня питания типа ±5 В. Не вижу смысла делать фильтр активным.

На выходе резисторной матрицы сигнал однополярный, поэтому каскад на ОУ должен его смещать. Сделать это лучше интегратором. В интеграторе может работать любой ОУ, лучше OP07, но пойдет даже LM358 при условии допустимости чуть большего смещения нуля.

Регулятор уровня нужно ставить между фильтром и выходным буфером, в простейшем случае это переменный резистор. Если хочется сделать электронную регулировку, то при такой полосе придется ставить нормальные умножающие ЦАП. Для одноканального варианта я применял AD5452, для двухканального - AD5449. Они 12-разрядные, довольно дорогие. Но можно взять из этой же линейки и 10-разрядные, или даже 8-разрядные. Правда, дискретность установки амплитуды тогда увеличится.

На выходе буферного усилителя нужен ступенчатый аттенюатор, его можно коммутировать с помощью герконовых реле. Я обычно использую EDR101. Аттенюатор рассчитывается для импеданса 50 Ом, только нужно помнить о мощности рассеяния согласующего резистора, который работает при ослаблении 0 дБ.

Самый трудный момент - преобразователь синуса в меандр. Ничего лучше, чем применить быстрый rail-to-rail ОУ (AD8051, AD8091), придумать не удалось. Схема есть в SG-642, но там я дополнительно переключаю уровни питания ОУ, что только усложняет схему. Зря так сделал. Можно запитать ОУ ±5 В, а разницу амплитуды синуса и меандра компенсировать программно с помощью аттенюатора. Все равно там нужны разные калибровки.

Интересно делает Agilent в своих функциональных генераторах. Синус в прямоугольник преобразуют с помощью компаратора, а порогом компаратора регулируют скважность выходного сигнала.

Если есть желание сделать регулируемое постоянное смещение на выходе, то его можно суммировать на вход выходного буфера. А формировать это напряжение можно с помощью ШИМ управляющего контроллера. Быстрой регулировки тут не требуется, поэтому нет проблем как следует ШИМ отфильтровать.

 

Спасибо за оперативный ответ. К слову, на примере Ваших статей и конструкций с конца 90-х учился современной схемотехнике. Низкий Вам поклон за Вашу работу и пламенный привет из города-героя Севастополя.

Теперь по сути.
Леонид Иванович: нет никаких проблем с использованием любых частей схемы SG-532, как и других моделей генераторов (все схемы я публиковал)
Cпасибо.

Леонид Иванович: Ну а фильтр вполне нормальный и LC, как было здесь на схемах.
У меня есть ряд возражений по поводу самодельных LC фильтров высокого порядка, но это мое личное мнение. Кроме того, лично мне 1 МГц не очень нужен, тут все уперлись в синус, а этот генератор задумывался как ГСПФ и в этом его главная ценность. Иначе поставили бы АДшный аппаратный DDS и не морочились. Поэтому лично я ограничусь полосой 100-200 кГц.

Леонид Иванович: Можно поставить и активный фильтр, но для частоты среза порядка 1 МГц потребуются довольно быстрые ОУ. А из дешевых все теперь низковольтные, это потребует организации специального уровня питания типа ±5 В. Не вижу смысла делать фильтр активным.

На выходе резисторной матрицы сигнал однополярный, поэтому каскад на ОУ должен его смещать. Сделать это лучше интегратором. В интеграторе может работать любой ОУ, лучше OP07, но пойдет даже LM358 при условии допустимости чуть большего смещения нуля.

Регулятор уровня нужно ставить между фильтром и выходным буфером, в простейшем случае это переменный резистор. Если хочется сделать электронную регулировку, то при такой полосе придется ставить нормальные умножающие ЦАП. Для одноканального варианта я применял AD5452, для двухканального - AD5449. Они 12-разрядные, довольно дорогие. Но можно взять из этой же линейки и 10-разрядные, или даже 8-разрядные. Правда, дискретность установки амплитуды тогда увеличится.
Разумно и обоснованно. Но это скорее возможное направление дальнейшего развития этого проекта. Я планирую использовать активный ФНЧ, добавить схему смещения, а уровень регулировать вручную. На плате управления I2C выведен на разъем, поэтому в дальнейшем можно будет перейти на электронную регулировку.

Леонид Иванович: Самый трудный момент - преобразователь синуса в меандр.
Леонид Иванович: Синус в прямоугольник преобразуют с помощью компаратора, а порогом компаратора регулируют скважность выходного сигнала.
Именно компаратор GM и предложил использовать для этой цели.

Леонид Иванович: Если есть желание сделать регулируемое постоянное смещение на выходе, то его можно суммировать на вход выходного буфера.
Есть не просто желание, а необходимость. Только ШИМом не получится, т.к. занял его выводы под клавиатуру и перекинуть пока просто некуда. Наверное эта работа будет поручена ЦАПу. (резисторы не помогут, т.к. в приборе несколько {пока 2} канала, а габарит корпуса тоже Z4).

А на передней панели у меня поместились: дисплей, полная цифровая клавиатура, энкодер+4 кнопки и до 6 байонетов. Места осталось максимум под два переменника. Соосные ставить неохота, тем более, что в перспективе уровень и смещение по каналам будут регулироваться электронно с помощью кнопок и энкодера.
Но блин на днях сдается очередной этап очередного проекта, поэтому на "DDS-1" пока меня не хватает.

 

madgrey Спасибо!

madgrey: У меня есть ряд возражений по поводу самодельных LC фильтров высокого порядка

Есть, конечно, определенные проблемы. Требуется высокая точность номиналов, необходим учет паразитных параметров, а методика настройки фильтра довольно туманна. К тому же, для настройки нужно иметь более высокочастотные приборы, чем создаваемый. Но начиная с частот порядка десятков мегагерц, такой фильтр является, пожалуй, единственной альтернативой.

Если речь идет о 200 кГц, то активный фильтр строится без проблем. Когда-то давно делал такой на OP42, сейчас можно подобрать что-то подешевле с полосой порядка 10 МГц и скоростью нарастания порядка 50 В/мкс. На такой частоте и КР572ПА1 вполне нормально работает в регуляторе уровня.

madgrey: этот генератор задумывался как ГСПФ и в этом его главная ценность

Я понимаю, что у всех задачи разные, но мой личный опыт говорит о том, что генератор сигналов произвольной формы в работе не очень нужен. Я пользуюсь исключительно многоканальными генераторами синуса и прямоугольных импульсов (хоть делал и произвольной формы). С другой стороны, AWG в хозяйстве тоже не помешает. Но я бы не стал называть эту возможность главной ценностью. Тем более, учитывая качество выходного сигнала.

madgrey: Именно компаратор GM и предложил использовать для этой цели.

Компаратор тоже хорошо, но основная сложность - обеспечить одинаковую амплитуду и смещение для синуса и меандра. Некрасиво, если при переключении формы меняются другие параметры сигнала. С компаратором можно застрять в преобразователях уровней.

madgrey: Только ШИМом не получится, т.к. занял его выводы

Кроме ШИМа нет простых и дешевых вариантов сформировать программируемое напряжение. Внешний ЦАП будет намного дороже. Другое дело, что раз уровень регулируется вручную, так и смещение тоже логично регулировать вручную. Единство стиля - тоже важная вещь в эргономике приборов. У меня так и сделано в младшем генераторе импульсов PG-760.

Ну а с клавиатурой при необходимости всегда можно что-то придумать: подключить ее через SAA3010, или расширить порты с помощью 74HC595/597, или организовать аналоговую клавиатуру с резисторной цепочкой на АЦП.

madgrey: до 6 байонетов

А зачем они? Есть два канала, поэтому должны быть только два выходных разъема.

Любой прибор должен быть сбалансированным. В этом генераторе применяется ЦАП низкой разрядности и таблица очень маленького объема для форм. Как следствие, качество выходного сигнала хорошим быть не может. Поэтому я бы не вкладывал в этот прибор слишком много средств и времени. Все регулировки сделал бы ручными, а аналоговый тракт - простейшим. Получил бы красивый, простой и дешевый прибор. А нормальный AWG нужно строить на FPGA + RAM + DAC, и это тоже вполне подъемно для радиолюбителей даже с LUT-технологией. Силы и время лучше направить туда. После завершения простого прибора, разумеется