Функциональный генератор на AD9833, управляемый через USB
Добавил(а) microsin
Наткнулся на интересную разработку функционального генератора на основе микросхемы AD9833, уже довольно не новую: function-gen [1]. Проект довольно простой, что делает возможным его сборку в домашних условиях, и в то же время обладает широкими возможностями в генерации сигналов. Формируемые частоты: 0..12.5 МГц, форма сигнала синусоидальная, прямоугольная и треугольная. Благодаря тому, что исходный код открыт и схема открыты, есть возможность применить составные части проекта в своих собственных разработках.
[Общее описание function-gen]
Синтез сигнала осуществляется микросхемой AD9833 [2] по методу прямого цифрового синтеза (DDS). Эта микросхема управляется через интерфейс SPI микроконтроллером AT90USB162. Этот же микроконтроллер формирует на своем интерфейсе USB устройство класса USB CDC (виртуальный COM-порт), позволяя управлять генератором обычными текстовыми командами (описание протокола см. далее). Таким образом, микроконтроллер служит мостом между компьютером и микросхемой AD9833, позволяя осуществить простой интерфейс управления генератором.
Рис. 1. Схема функционального генератора на AD9833 и AT90USB162.
Схема довольно простая, питается от напряжения 4.5..4.7V, которое приходит либо от USB (от коннектора J1), либо от стабилизатора напряжения U1, когда к коннектору P1 подано питание 8..12V. От конфликта по питанию (если одновременно подключен USB и внешний источник питания) спасают 2 диода Шоттки D1 и D2. Синтезатор DDS AD9833 получает тактирование либо от генератора X2 на 25 МГц, либо от внешнего генератора через коннектор P2, в зависимости от положения перемычки JP1. На выходе генератора стоит буферный операционный усилитель U4. Коннектор CON1 служит для перепрошивки программатором ISP, но его устанавливать не обязательно, так как есть возможность перешить программу микроконтроллера через USB (в память микроконтроллера AT90USB162 прошит загрузчик USB Flip DFU, как им пользоваться, см. [3]). Кварцевый резонатор X1 может быть на частоту либо 8 МГц, либо на 16 МГц, что должно быть учтено в firmware микроконтроллера. Светодиоды LED1 и LED2, показанные на схеме, в firmware микроконтроллера не используются. Вы можете использовать их по своему усмотрению, доработав исходный код. Как вариант их можно сконфигурировать в библиотеке LEFA для отображения различных событий USB.
[Как собрать аппаратную часть]
Эту схему проще всего собрать самому из двух готовых модулей - макетной платы AVR-USB162 [3] и китайского модуля на AD9833 [4].
Купил я этот модуль за $8.48 с бесплатной доставкой.
Схема модуля снабжена сдвоенным цифровым резистором на микросхеме MCP41010 (номинал 10 кОм), которым можно регулировать амплитуду сигнала на выходе.
Назначение выводов платы, как Вы их видите на 1 фотографии:
Вывод
Назначение
CS
Сигнал выборки для цифрового потенциометра MCP41010.
DAT
По схеме это сигнал SPI_MOSI. Сигнал данных, который поступает на вход SDATA AD9388 (ножка 6).
CLK
По схеме это сигнал SPI_SCK. Сигнал тактов, который поступает на вход SCLK AD9388 (ножка 7).
FSY
Сигнал, который приходит на вывод FSYNC AD9833 (ножка 8).
GND
Общий провод для всех сигналов и минус питания.
VCC
Напряжение питания +5V.
PGA
Выход операционного усилителя.
VOUT
Сигнал с выхода AD9833 (ножка 10), который поступает на вход операционного усилителя.
Таким образом, имея 2 такие платы, достаточно их просто соединить проводами (земля, питание, сигналы SPI_SCK, SPI_MOSI, AD_CS), залить прошивку через загрузчик USB, и сразу получите функциональный генератор, работающий в диапазоне частот 0..12.5 МГц.
[Firmware микроконтроллера]
Обработка протокола USB в программе микроконтроллера построена на основе библиотеки LUFA. Исходный код можно скачать в архиве по ссылке [6]. В таблице показаны модули программы и их краткое описание.
Имя файла
Назначение
LUFA\
Каталог, где находятся модули библиотеки, предназначенной для обработки протокола USB.
ad9833.c, ad9833.h
Модуль, в котором содержатся подпрограммы для управления микросхемой AD9388.
Descriptors.c, Descriptors.h
Исходные данные для библиотеки LUFA, описывающие устройство USB генератора для операционной системы хоста USB.
main.c
Основной алгоритм программы. В главном цикле декодируется как команды текстовый поток, приходящий от виртуального COM-порта устройства USB CDC, осуществляется управление микросхемой синтезатора DDS, и делаются вызовы обработки протокола USB.
makefile
Основной конфигурационный файл проекта. В нем задается тактовая частота микроконтроллера и его тип.
spi.c, spi.h
Простейший модуль для обмена через интерфейс SPI микроконтроллера с чипом синтезатора DDS.
windriver.inf
Информационный файл, описывающий устройство USB SDC. Нужен для установки драйвера операционной системы Windows, когда происходит первое подключение устройства к порту USB.
Примечание: проделывать шаги 1, 2, 3 проделывать необязательно, Вы можете взять готовую прошивку из каталога bin архива [6]. Там 2 прошивки, AT90USB162-function-gen-8MHz.hex и AT90USB162-function-gen-16MHz.hex, рассчитанные на частоту кварца 8 МГц и 16 МГц соответственно.
1. Убедитесь, что частота кварца на чипе AT90USB162 (кварц может быть на 8 МГц или на 16 МГц) точно соответствовала макропеременным F_CPU и F_USB, указанным в makefile. Например, если частота кварца 16 МГц, то в файле makefile должны присутствовать следующие 2 строки:
F_CPU = 16000000 F_USB = 16000000
2. Если Вы компилируете для другого чипа AVR USB, не для AT90USB162, то проверьте, правильно ли установлен тип микроконтроллера в макропеременной MCU того же makefile. Для чипа AT90USB162 макропеременная должна быть установлена так:
MCU = at90usb162
3. Чтобы скомпилировать проект, нужен установленный пакет WinAVR, который можно бесплатно скачать из сети Интернет. Проект компилируется команды make clean, make all, запущенными из корневой папки проекта (см. содержимое makefile, где приведена подсказка по командам компиляции).
4. Полученную прошивку (это будет файл main.hex) можно записать прямо через USB утилитой Flip DFU (как это делается, см. [3]).
[Первое подключение устройства к порту USB]
После того, как Вы залили полученную прошивку и переподключили плату через USB, Windows обнаружит новое устройство Function Generator и запросит для него драйвер. Укажите мастеру установки драйвера на файл windriver.inf, который находится в корневой папке проекта. Если в процессе установки драйвера Windows запросит подтверждение, то выберите "установить все равно". После успешной установки драйвера в Диспетчере Устройств, в его разделе Порты (COM и LPT) появится новое устройство "Function Generator (COMxx)" (вместо xx будут цифры номера COM-порта).
[Как управлять генератором]
Устройство генератора видится на Windows как обычный последовательный COM-порт (конечно, он виртуальный, работающий через USB). Поэтому управлять генератором можно простыми текстовыми командами, если вводить их в окне putty, SecureCRT, TerraTerm или любой другой программы терминала. Набор команд довольно простой, см. таблицу:
Команда
Описание
sf1 [freq]
Установка частоты 1 (частота freq указывается в Гц).
sf2 [freq]
Установка частоты 2 (частота freq указывается в Гц).
sp1 [phase]
Установка фазы 1.
sp2 [phase]
Установка фазы 2.
sfo [1/2/m]
Установка частоты выхода 1, 2, модуляции.
spo [1/2/m]
Установка фазы выхода 1, 2, модуляции.
so [o/s/t/q]
Установка формы выходного сигнала. Установка o означает выключено (off), s синусоидальный сигнал, t треугольный сигнал, q прямоугольный сигнал.
sm [freq]
Установка частоты модуляции.
gsf1
Получение частоты 1.
gsf2
Получение частоты 2.
gp1
Получение фазы 1.
gp2
Получение фазы 2.
Такой способ управления генератором довольно неудобен. Автор проекта [1] сделал утилиту управления с графическим интерфейсом, написанную на Python. Она состоит из следующих файлов:
Имя файла
Назначение
icons\
Каталог, где находятся графические файлы, используемые для оформления GUI утилиты.
fgen.py
Основная программа утилиты, которая запускается либо двойным щелчком на этом файле, либо командой phyton fgen.py.
fgenio.py
Модуль, работающий с виртуальным COM-портом устройства USB генератора.
То, что программа управления основана на Phyton, означает её кроссплатформенность, т. е. теоретически можно запустить программу на любой операционной системе. Таким образом, если Вы на короткой ноге с Phyton, и он установлен у Вас на компьютере (программа может работать на операционных системах Linux, Mac OS, Windows), то никаких проблем не возникнет. Просто подключите устройство к компьютеру, убедитесь, что в модуле fgen.py правильно задано имя виртуального COM-порта (в зависимости от операционной системы это может быть, например, "/dev/ttyACM0" или "COM49"), запустите программу командой python fhen.py, и Вы получите графический интерфейс для управления генератором.
Однако, если у Вас не установлен интерпретатор Python и Вы не знаете, как им пользоваться, то с запуском утилиты возможно придется повозиться. Решение некоторых возможных проблем описано во врезке.
Постарайтесь установить последнюю версию Python, которую можно скачать с сайта python.org (список релизов для Windows см. по ссылке [5]). Если у Вас свежая операционная система, и Вы её регулярно обновляете, то скорее всего никаких проблем у Вас не будет.
Если у Вас Windows XP, то устанавливайте версию Python 3.3.3 - 2013-11-17, более новые не установятся, так как в них Windows XP уже не поддерживается. Также Вам придется установить библиотеку pyserial (см. далее).
Если же у Вас при установке Python возникли проблемы, то ищите их решение в Интернете. Ниже описано решение некоторых подобных проблем.
1. Python 3.6 под Windows не устанавливается, инсталлер висит на процессе установки обновления C Runtime Update KB2999226. Как решить: скачайте это обновление с сайта Microsoft, и установите перед запуском инсталлятора Python.
2. Обновление KB2999226 не устанавливается. Скачайте с сайта Microsoft или из другого источника (можно прогуглить) vs2015.com_enu.iso или vs2015.com_rus.iso, и установите оттуда обновление KB2999226. Для примера дам парочку прямых ссылок на образы iso:
[Проблемы в библиотеках Python и модулях программы]
3. Запуск fgen.py выдает ошибку "ImportError: No module named io". Настройте 2 переменных окружения PYTHONHOME и PYTHONPATH, указывающие на каталог установки Python. К примеру, если Python установлен у Вас в каталог C:\Python33, то эти переменные должны быть настроены следующим образом:
PYTHONHOME C:\Python33 PYTHONPATH C:\Python33\Lib
Если Вы не знаете, что такое переменные окружения Windows и как они настраиваются, то прогуглите, ничего сложного в этом нет.
4. Запуск fgen.py выдает ошибку "ImportError: No module named serial". Скачайте и установите модуль pyserial версии 2.7 или 3.3, или более свежий. Прогуглите слова pyserial download, и получите множество полезных ссылок. Установка заключается в простом копировании папки serial из скачанного архива в папку Lib каталога установки Python (например, это может быть каталог c:\Python33\Lib). Иногда есть exe-инсталляторы, упрощающие установку (например, pyserial-2.7.win32.exe).
Как вариант, можно использовать команду pip install serial (если у Вас установлена утилита pip).
5. Ошибки наподобие "Запуск программы невозможен, так как на компьютере отсутствует api-ms-win-crt-runtime-l1-1-0.dll. Попробуйте переустановить программу." или "Точка входа в процедуру ucrtbase.terminate не найдена в библиотеке DLL api-ms-win-crt-runtime-l1-1-0.dll". Решить проблему можно только корректной установкой Python. Правильно выберите дистрибутив для своей операционной системы, и установите.
6. При запуске Python выскакивает ошибка "Запуск программы невозможен, так как на компьютере отсутствует python33.dll. Попробуйте переустановить программу.". Скорее всего, Вы решили установить Python простым копированием, но забыли взять с собой копию файла python33.dll.
7. Запуск fgen.py выдает ошибку "function 'CancelIoEx' not found".
Скачал более старую версию pyserial-2.7.tar.gz, заменил папку serial в каталоге c:\Python33\Lib\.
8. В файле lib\serial\win32.py ругань на некоторые строчки с константами, заканчивающимися на L, например:
# except TypeError, err:except (TypeError) as err:
10. Ошибка в файле serialutil.py:
File "c:\Python33\lib\serial\serialutil.py", line 314, in setPort
if isinstance(port, basestring):
NameError: global name 'basestring' is not defined
Заменил везде basestring на str, например:
# if isinstance(port, basestring):ifisinstance(port, str):
При возникновении любых подобных ошибок не стоит паниковать, достаточно прогуглить, и Вы наверняка найдете решение проблемы.
[Проблема с подключением к виртуальному COM-порту]
Программа fgen.py запускается и отображает графический интерфейс, но в консоли python.exe появляются ошибки наподобие "serial.serialutil.SerialException: Attempting to use a port that is not open".
Причина проблемы в том, что программа не может открыть COM-порт по имени, которое жестко зашито в коде fgen.py. Откройте текстовым редактором файл fgen.py, и найдите в нем строку с текстом fgen.open:
fgen.open("/dev/ttyACM0")
В этом месте нужно правильно указать имя виртуального COM-порта, как он отображается в операционной системе. Например, если Диспетчер Устройств в операционной системе Windows показывает имя для устройства генератора "Functon Generator (COM49)", то исправьте программу следующим образом:
#fgen.open("/dev/ttyACM0")
fgen.open("COM49")
После перезапуска программы fgen.py ошибка исчезнет: