Функциональный генератор на 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].
Скорее всего, через некоторое время эти ссылки устареют, поэтому вбейте в браузере строку поиска Google [4]. AD9833 DDS Signal Generator Module Square / Triangle / Sine Wave + LPF filtering При выборе советую обращать в первую очередь на те платы с AD9833, где есть буферный операционный усилитель. Купил я этот модуль за $8.48 с бесплатной доставкой.
Схема модуля снабжена сдвоенным цифровым резистором на микросхеме MCP41010 (номинал 10 кОм), которым можно регулировать амплитуду сигнала на выходе. Назначение выводов платы, как Вы их видите на 1 фотографии:
Таким образом, имея 2 такие платы, достаточно их просто соединить проводами (земля, питание, сигналы SPI_SCK, SPI_MOSI, AD_CS), залить прошивку через загрузчик USB, и сразу получите функциональный генератор, работающий в диапазоне частот 0..12.5 МГц. [Firmware микроконтроллера] Обработка протокола USB в программе микроконтроллера построена на основе библиотеки LUFA. Исходный код можно скачать в архиве по ссылке [6]. В таблице показаны модули программы и их краткое описание.
Примечание: проделывать шаги 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 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 или любой другой программы терминала. Набор команд довольно простой, см. таблицу:
Такой способ управления генератором довольно неудобен. Автор проекта [1] сделал утилиту управления с графическим интерфейсом, написанную на Python. Она состоит из следующих файлов:
То, что программа управления основана на Phyton, означает её кроссплатформенность, т. е. теоретически можно запустить программу на любой операционной системе. Таким образом, если Вы на короткой ноге с Phyton, и он установлен у Вас на компьютере (программа может работать на операционных системах Linux, Mac OS, Windows), то никаких проблем не возникнет. Просто подключите устройство к компьютеру, убедитесь, что в модуле fgen.py правильно задано имя виртуального COM-порта (в зависимости от операционной системы это может быть, например, "/dev/ttyACM0" или "COM49"), запустите программу командой python fhen.py, и Вы получите графический интерфейс для управления генератором. Однако, если у Вас не установлен интерпретатор Python и Вы не знаете, как им пользоваться, то с запуском утилиты возможно придется повозиться. Решение некоторых возможных проблем описано во врезке. [Установка 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: http://rsdn.org/forum/tools/6121211.all [Проблемы в библиотеках Python и модулях программы] 3. Запуск fgen.py выдает ошибку "ImportError: No module named io". Настройте 2 переменных окружения PYTHONHOME и PYTHONPATH, указывающие на каталог установки Python. К примеру, если Python установлен у Вас в каталог C:\Python33, то эти переменные должны быть настроены следующим образом: PYTHONHOME C:\Python33 Если Вы не знаете, что такое переменные окружения 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, например: File "c:\Python33\lib\serial\win32.py", line 218 INFINITE = 0xFFFFFFFFL ^ SyntaxError: invalid syntax Удалил везде в файле win32.py такие константы, заменил на константы без L. Например: #INFINITE = 0xFFFFFFFFL INFINITE = 0xFFFFFFFF 9. Ошибка в файле serialutil.py: File "c:\Python33\lib\serial\serialutil.py", line 535 except TypeError, err: ^ SyntaxError: invalid syntax Исправил: # 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): if isinstance(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 ошибка исчезнет: c:\temp>python fgen.py Connected to COM49 [Ссылки] 1. USB-controlled function generator site:github.com. |