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

Текущая конструкция не позволяет изменять амплитуду, смещение и сопряжение сигнала. Выход фиксирован на уровне 0-4 В. Я планирую сделать еще одну полностью аналоговую плату для регулировки амплитуды и смещения.

 

Компоненты

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

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

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

Схема

Схема и печатная плата были разработаны с помощью KiCad, довольно приличным EDA с открытым исходным кодом. Я просто выделим некоторые части схемы в статье. Если вас интересуют подробности, в архиве есть схема, загруженная в формате PDF.

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

Это схема обвязки вокруг AD9833. Номиналы обходных конденсаторов взяты из описания AD9833, как и должно быть. Источник тактового сигнала может быть выбран перемычкой JP1, либо внутренний генератор, либо внешний источник синхронизации, который подается через BNC-разъем. Выход DDS сначала фильтруется по нижнему пределу, а затем усиливается. На плате есть тестовые точки, разбросанные по всему пути прохождения сигнала, чтобы облегчить тестирование.

Проект печатной платы

Разметка печатной платы была довольно простой. Вот скриншот финальной печатной платы в 3d-представлении KiCad.

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

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

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

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

Протокол

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

    set commands:
    sf1 [freq] #in Hz
    sf2 [freq] #in Hz
    sp1 [phase] #in degrees
    sp2 [phase] #in degrees
    sfo [1/2/m(modulation)] #frequency output
    spo [1/2/m(modulation)] #phase output
    so [o(off)/s(sine)/t(triangle)/q(square)] #output mode
    sm [freq] #modulation freq

ПО для ПК

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

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

Логика приложения очень проста: приложение просто отправляет соответствующие команды через виртуальный последовательный порт всякий раз, когда любое из значений изменяется в пользовательском интерфейсе. Для этого на компьютере должны быть установлены Python 3.4, а также cx_Freeze 4.3.2. Чтобы запустить управляющее приложение необходимо два раза кликнуть курсором по файлу fgen.py.


Архив для статьи "DDS генератор сигналов на AT90USB162 и AD9833 управляемый по USB"
Описание: Исходный код(Си), управляющее приложение Python, макет печатной платы
Размер файла: 1.17 MB Количество загрузок: 554 Скачать