USB функциональный генератор на AD9833

Один из инструментов, без которого я бы пропал в своей домашней лаборатории, является функциональный генератор. Он довольно дорогой, поэтому я не купил его. Я подумал, что можно попытаться сделать его самостоятельно. Нашел довольно распространенную DDS (Direct Digital Synthesis, прямой цифровой синтез) микросхему AD9833. Теперь надо добавить только USB-совместимый AVR микроконтроллер и возможно немного аналоговых элементов.

Эта плата не обеспечивает регулировку амплитуды или смещения сигнала. Выход устанавливается 0-4В. Я планирую сделать ещё одну полностью аналоговую плату для регулировки амплитуды и смещения.

USB функциональный генератор на AD9833

Элементы

Неотъемлемой частью этой конструкции является DDS микросхема AD9833 от Analog Devices. Микросхема имеет входной тактовый сигнал 25 МГц, внутреннюю фазовую автоподстройку частоты, таблица поиска синусов и АЦП. Контролируя её по интерфейсу SPI, вы можете получить на выходе синусоидальный, пилообразный и прямоугольный сигнал с частотным диапазоном от 0,01 Гц до 3 МГц. Частота может быть выше, до ~7 МГц, но на такой высокой частоте синусоидальный сигнал выглядит ужасно.

Для управления этой микросхемой, я использовал дешевый USB-совместимый AVR микроконтроллер Atmel AT90USB162. Он будет обеспечивать виртуальный последовательный интерфейс по USB и интерпретировать команды переданные по этому интерфейсу для изменения выходного сигнала DDS надлежащим образом.

OPA357 используется для усиления выходного сигнала DDS. Номинальное напряжение на выходе AD9833 0.6Vpp, со средним значение 0.3В. OPA357 была выбрана потому, что она поддерживает необходимые высокие частоты и её можно получить в качестве бесплатного образца от компании Texas Instruments.

Схема

Схема и печатная платы были разработаны в KiCad, довольно приличном EDA (EDA, автоматизация проектирования электронных приборов) с открытым исходным кодом. Здесь приведены некоторые части схемы. Если вас интересует более подробная схема, её можно скачать ниже в формате PDF.

Схема питания

Устройство может питаться или от USB, или от отдельного источника +5В. Два диода Шоттки установлены, чтобы напряжения нашли друг на друга, если они поступаю из обоих входов.

Схема генератора

Схема построена на DDS AD9833. Блокировочные конденсаторы и их номиналы взяты из даташита. Источник тактового сигнала может быть выбран при помощи JP1. Может использоваться встроенный генератор и внешний источник тактового сигнала через BNC разъем. Выход из DDS сначала проходит через ФНЧ и затем усиливается. На выходе есть резистор 50 Ом, чтобы обеспечить выходное сопротивление 50 Ом. По всему пути прохождения сигнала есть контрольные точки, что обеспечивает удобство тестирования.

Печатная плата

Разводка довольно проста. Вот скриншот платы в 3D-виде KiCad:

3D-вид печатной платы

Вы можете видеть BNC разъем для подачи внешнего тактового сигнала на этом скриншоте, но у меня не было необходимости его припаивать.

Я разработал плату для использования генератора для поверхностного монтажа, но у меня не было генератора нужной частоты. У меня был подходящий генератор в DIP корпусе, поэтому я припаял его к плате так:

Разъем

Немного некрасиво, но работает не хуже.

У меня также была небольшая ошибка в оригинальной разводке.  VUSB контакт AVR должен быть подключен к источнику питания, а не к USB VUSB. В таком случае, если я питаю устройство от внешнего источника, USB периферия все равно получает питание и может инициализироваться. Перерезать дорожку и припаять перемычку достаточно, что бы исправить это. К статье прилагается исправленная версия платы.

Протокол

Плата подключена к компьютеру через виртуальный последовательный порт по USB. Должен быть стандартный способ обмена информацией, поэтому я написал простой стандарт перед тем, как я начал писать код. Я решил использовать ASCII для включения человека при написании команд во время тестирования и для облегчения отладки и читабельности кода.

sf1 [freq] #в Гц
sf2 [freq] #в Гц
sp1 [phase] #в градусах
sp2 [phase] #в градусах
sfo [1/2/m(modulation)] #frequency output
spo [1/2/m(modulation)] #phase output
so [o(off-выключен)/s(sine-синусоида)/t(triangle-треугольник)/q(square-прямоугольный сигнал)] #режим выхода
sm [freq] #частота модуляции

Все команды должны заканчиваться возвратом каретки-новой строкой.

Так например, для установки выходной частоты от 1 до 100 Гц, вы должны отправить «sf1 100 rn».

Программа для AVR

Функциональность USB была предоставлена ​​отличной LUFA USB библиотекой для микроконтроллеров AVR. Я повторил код, который я написал, прежде чем обмениваться информацией по SPI и относительно функциональную библиотеку для AD9833. Потом я написал код, преобразовывающий команды, посылаемые через последовательный интерфейс в обращение к функции библиотеки AD9833.

Я получил проблему, используя Doxygen для комментирования своего кода и создания документации. Подробнее об этом можно узнать, перейдя по ссылке.

Программное обеспечение для ПК

Программное обеспечение написано на Python3. Я начал изучать его пару месяцев назад и до сих пор использую его для создания простых интерфейсов. Я использовал графическую основу tkinter для создания графического интерфейса пользователя и pyserial для последовательного соединения. Код пользовательского интерфейса не очень хорош, я ещё не совсем разобрался с Python. Это прекрасный язык, но я предпочитаю работать с микроконтроллерами и писать код на С.

FGen controller

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

Работа очень проста: приложение просто посылает соответствующие команды на виртуальный последовательный порт USB, когда любое значение изменяется в пользовательском интерфейсе.

Результат

Я снял короткое видео, демонстрирующее работу функционального генератора. Кажется, он работает довольно хорошо!

Проект на github, документация для AVR-кода

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U2 МК AVR 8-бит AT90USB162 1
U3 Программируемый генератор AD9833 1
U1 Линейный регулятор LM1117-N 1
U4 Операционный усилитель OPA357 1
X1 Кварцевый резонатор ? 1
X2 Генератор ? 1
D1, D2 Диод Шоттки ? 2
D3, D4 Светодиод 2
С1-С3 Конденсатор 1 мкФ 3
C4 Электролитический конденсатор 4.7 мкФ 1
C5, C7, C12-C15 Конденсатор 100 нФ 6
C6 Электролитический конденсатор 10 мкФ 1
C9 Конденсатор ? 1
C10, C11 Конденсатор 22 пФ 2
R1, R3 Резистор 22 Ом 2
R2, R7 Резистор 20 кОм 2
R4 Резистор 10 кОм 1
R5, R9, R11 Резистор 1 кОм 3
R6 Резистор ? 1
R8 Резистор 150 кОм 1
R10, R12 Резистор 50 Ом 2
J1 Разъём Mini USB 1 на плату
P2, P5 Разъём BNC 2 на плату
JP1 Разъём PLS-3R 1 для перемычки
CON1 Разъём PLD-6 1 ISP
P1 Разъём 2 контакта 1 питание
P3 Разъём PLS-8 1