Программирование AVR: работа с USB Функциональный генератор на AD9833, управляемый через USB Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Функциональный генератор на AD9833, управляемый через USB Печать
Добавил(а) microsin   

Наткнулся на интересную разработку функционального генератора на основе микросхемы AD9833, уже довольно не новую: function-gen [1]. Проект довольно простой, что делает возможным его сборку в домашних условиях, и в то же время обладает широкими возможностями в генерации сигналов. Формируемые частоты: 0..12.5 МГц, форма сигнала синусоидальная, прямоугольная и треугольная. Благодаря тому, что исходный код открыт и схема открыты, есть возможность применить составные части проекта в своих собственных разработках.

[Общее описание function-gen]

Синтез сигнала осуществляется микросхемой AD9833 [2] по методу прямого цифрового синтеза (DDS). Эта микросхема управляется через интерфейс SPI микроконтроллером AT90USB162. Этот же микроконтроллер формирует на своем интерфейсе USB устройство класса USB CDC (виртуальный COM-порт), позволяя управлять генератором обычными текстовыми командами (описание протокола см. далее). Таким образом, микроконтроллер служит мостом между компьютером и микросхемой AD9833, позволяя осуществить простой интерфейс управления генератором.

AT90USB162 AD9833 function gen sch

Рис. 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].

at90usb162 04IMG 8330 AD9833 DDS board
Макетная плата AVR-USB162 AD9833 DDS Signal Generator Module

Скорее всего, через некоторое время эти ссылки устареют, поэтому вбейте в браузере строку поиска Google [4].

AD9833 DDS Signal Generator Module Square / Triangle / Sine Wave + LPF filtering
CJMCU-9833 AD9833 AD9833BRMZ sine wave square wave triangle module
1PCS AD9833 Module DDS Signal Generator Module
AD9833 DDS Signal Generator Module 0-12.5 MHz Square / Triangle / Sine Wave

При выборе советую обращать в первую очередь на те платы с AD9833, где есть буферный операционный усилитель.

Купил я этот модуль за $8.48 с бесплатной доставкой.

AD9833 DDS Signal Generator Module top AD9833 DDS Signal Generator Module bottom

Схема модуля снабжена сдвоенным цифровым резистором на микросхеме MCP41010 (номинал 10 кОм), которым можно регулировать амплитуду сигнала на выходе.

AD9833 DDS Signal Generator Module 0 12.5 MHz sch

Назначение выводов платы, как Вы их видите на 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, и Вы получите графический интерфейс для управления генератором.

function gen python GUI

Однако, если у Вас не установлен интерпретатор 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:

https://social.msdn.microsoft.com/Forums/vstudio/ru-RU/1969e78b-f2cd-4d6a-97d4-a378e613d0ba/installation-gets-stuck-on-update-for-microsoft-windows-kb2999226?forum=vssetup 

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
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, например:

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.
2. AD9833: программируемый генератор сигналов.
3. Макетная плата AVR-USB162.
4. AD9833 DDS site:aliexpress.com.
5. Дистрибутивы Phyton для Windows.
6170426AT90USB162-AD9833.zip - исходный код, документация.

 

Добавить комментарий


Защитный код
Обновить

Top of Page