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

Версия DDS генератора на микросхеме AD9833 и мк AT90USB162

Одним из важных инструментов в радиолюбительской лаборатории является генератор сигналов. . Генераторы заводского изготовления довольно дороги, и не многие могут позволить себе его покупку.

С другой стороны в радиолюбительской лаборатории/мастерской вполне достаточно генератора сигналов, который можно сконструировать самостоятельно. Предлагаем вашему вниманию еще один вариант конструкции DDS функционального генератора. Его отличительной особенностью является полное управление по интерфейсу USB (Рисунок 1).

Рисунок 1. Внешний вид платы DDS генартора с установленными компонентами.

Основой конструкции является распространенная специализированная микросхема AD9833производства компании Analog Devices, выполняющая функцию DDS синтеза.

Прямой цифровой синтез (DDS) – метод, позволяющий получить аналоговый сигнал за счет генерации временной последовательности цифровых отсчетов и их дальнейшего преобразования в аналоговую форму посредством цифро-аналогового преобразователя.

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

Для микросхемы необходим сигнал тактовой частоты 25 МГц, она имеет встроенные схемы фазовой автоподстройки частоты, таблицу значений синуса и цифро-аналоговый преобразователь. Управление микросхемой осуществляется по интерфейсу SPI, пользователь может установить форму выходного сигнала (синусоида, треугольные или прямоугольные импульсы), частоту в диапазоне 0.

01 Гц – 3 МГц, сдвиг фазы. Частоту выходного сигнала можно увеличить до 7 МГц, однако выходной синусоидальный сигнал будет иметь сильные искажения.

Дополнительно, используется микроконтроллер Atmel AVR AT90USB162 со встроенным интерфейсом USB и простая аналоговая схема. Сразу стоит отметить, что аналоговая часть генератора очень проста, т.к.

не осуществляется регулировка амплитуды и смещение выходного аналогового сигнала, выходной сигнал фиксирован (0 – 4 В).

Автор планирует в дальнейшем модернизировать аналоговую часть в виде дополнительного блока к генератору, но пользователи могут самостоятельно экспериментировать с аналоговой частью, опираясь на материалы в сети Интерент и на сайте Радиолоцман (например, статья «Моделирование аналоговой части DDS генератора»).

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

Операционный усилитель OPA357 в аналоговой части предназначен для усиления выходного сигнала микросхемы AD9833, т.к. ее номинальное выходное напряжение составляет 0.6 В с центром на уровне 0.3 В.

Выбор данного ОУ связан с его возможностью работать на высоких частотах.

Принципиальная схема и печатная плата разрабатывались в бесплатной мультиплатформенной среде с открытым кодом KiCad.

Устройство может питаться от интерфейса USB или от внешнего стабилизированного источника 5 В. В данном случае применен интегральный регулятор напряжения серии LM1117 (Рисунок 2). Два диода Шоттки выполняют защитную функцию при подаче напряжения питания одновременно от двух источников.

Рисунок 2. Схема питания DDS генератора. Схема аналоговой части изображена на Рисунке 3. Блокировочные конденсаторы и их номиналы взяты непосредственно из технического описания на микросхему AD9833, они должны быть обязательно установлены. На схеме предусмотрен джампер выбора источника тактовых сигналов, поэтому тактовый сигнал может подаваться либо от осциллятора установленного на плате, либо от внешнего источника через коннектор BNC.Рисунок 3. Схема аналоговой части DDS генератора Выходной сигнал микросхемы AD9833 проходит через фильтр низких частот и поступает на вход ОУ. Резистор R10 сопротивлением 50 Ом предназначен для согласования . Контрольные точки, указанные на схеме, использовались автором при тестировании и настройке аналоговой части генератора.

Полная принципиальная схема DDS генератора в PDF формате.

Печатная плата генератора разработана с учетом использования компонентов для поверхностного монтажа. 3D изображение печатной платы показано на Рисунке 4. На ней виден коннектор BNC для внешнего источника тактовых сигналов, но на печатную плату он не устанавливался.Рисунок 4. 3D вид печатной платы DDS генератора в программе KiCad.

Также следует учитывать, что плата разработана под установку осциллятора 25 МГц в корпусе для поверхностного монтажа. Если таковой отсутствует, следует учесть этот момент перед изготовлением печатной платы, или использовать навесной монтаж (Рисунок 5).Рисунок 5.

При отсутствии осциллятора на 25 МГц для поверхностного монтажа, можно подключить осциллятор в корпусе DIP навесным монтажом. Для коммуникации ПК с DDS генератором автор применил простой способ передачи ASCII команд управления, что значительно упростило тестирование и отладку программы микроконтроллера, которая написана на Си в компиляторе WinAVR.

Следует учитывать, что все команды заканчиваются символом возврата каретки и перевода строки.

Набор команд: sf1 [freq] – установка частоты 1 в Герцах sf2 [freq] – установка частоты 2 в Герцах sp1 [phase] – установка фазы для частоты 1 в градусах sp2 [phase] – установка фазы для частоты 1 в градусах sfo [1/2/m(modulation)] – FSK модуляция выходного сигнала spo [1/2/m(modulation)] – PSK модуляция выходного сигнала so [o(off)/s(sine)/t(triangle)/q(square)] – установка формы выходного сигнала sm [freq] – установка частоты модуляции К примеру, для установки первой выходной частоты 100 Гц, необходимо отправить команду вида “sf1 100 [символ возврата каретки] [символ перевода строки]”. Работа микроконтроллера с интерфейсом USB основана на известном и хорошо зарекомендовавшим себя стеке для микроконтроллеров с открытым исходным кодом LUFA. Также автором был использован готовый код обработки SPI интерфейса и относительно полная библиотека функций для работы с микросхемой AD9833. Приложение для компьютера разработано в среде Python3. Вид окна управляющей программы DDS генератора изображен на Рисунке 6. Логика работы приложения очень проста: при любых изменениях параметров в программе по последовательному интерфейсу (виртуальный COM-порт) отправляются соответствующие команды микроконтроллеру.Рисунок 6. Вид окна управляющей программы DDS генератора. Демонстрация работы DDS генератора Загрузки

Архив с файлами проекта (исходные коды, описание протокола коммуникации, схема и печатная плата (KiCad)) – скачать

Документация по программному коду микроконтроллера

tuomasnylund.fi

Источник: http://www.cxema.top/2013/12/dds-ad9833-at90usb162.html

Функциональный DDS rенератор на ПЛИС

25 июня 2015 в 20:32 (МСК) | сохранено26 июня 2015 в 02:32 (МСК)<\p>

Недавно я увидел проект генератора сигналов на микроконтроллере AVR. Принцип генерации — DDS, на базе библиотеки Jesper максимальная частота — 65534 Гц (и до 8 МГц HS выход с меандром).

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

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

Для этого у меня есть плата USB2RS232. Плата драйверов не требует (CDC), поэтому, я думаю, что и под Linux будет работать (для кого-то это важно). Так же, не буду скрывать, что с приемом сообщений по RS232 я уже работал. Модули для работы с RS232 буду брать готовые c opencores.com.

Для генерации синусоидального сигнала потребуется ЦАП. Тип ЦАП я выбрал, как и в исходном проекте — R2R на 8 бит. Он позволит работать на высоких частотах, порядка мегагерц. Убежден, что ПЛИС с этим должна справиться

По поводу того, на чем написать программу для передачи данных через COM порт я задумался. С одной стороны, можно написать на Delphi7, опыт написания такой программы уже есть, к тому же размер исполняемого файла будет не большим.

Еще попробовал набросать что-то для работы с Serial в виде java скрипта в html страничке, но более менее заработало только через Chrome serial API, но для этого надо устанавливать плагин… в общем тоже отпадает. В качестве новшества для себя попробовал PyQt5, но при распространении такого проекта, нужно тащить кучу библиотек.

Попробовав собрать PyQt проект в exe файл, получилось больше 10 мб. То есть, будет ничем не лучше приложения, написанного на c++Qt5. Стоит еще учесть, что опыта разработки на python у меня нет, а вот на Qt5 — есть. Поэтому выбор пал на Qt5. С пятой версии там появился модуль для работы с serial и я с ним уже работал.

А еще приложение на Qt5 может быть перенесено на Linux и Mac (для кого-то это важно), а с 5.2 версии, приложения на QWidgets может быть перенесено даже на смартфон!

Что еще нужно? Естественно плата с ПЛИС. У меня их две (Cyclone iv EP4CE10E22C8N на 10 тыс. ячеек, и Cyclone ii EP2C5 на 5 тыс. ячеек). Я выберу ту, что слева, исключительно по причине более удобного разъема.

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

Обе платы имеют «на борту» генераторы 50 МГц, а внутри ПЛИС есть PLL, с помощью которого я смогу увеличить частоту до запланированных 200 МГц.

В связи с тем, что модуль DDS я уже делал в своем синтезаторном проекте, то я сразу взялся за паяльник и начал паять ЦАП на резисторах. Плату взял макетную. Монтаж делал с применением накрутки. Единственное изменение, которое коснулось технологии — я отказался от кислоты Ф38Н для лужения стоек в пользу индикаторного флюс-геля ТТ. Суть технологии проста: в печатную плату впаиваю стойки, на них со стороны печатного монтажа припаиваю резисторы. Недостающие соединения выполняю накруткой. Еще, стойки удобны тем, что я их могу вставить прямо в плату ПЛИС. К сожалению, дома в наличии не оказалось резисторов 1 и 2 килоома. Ехать в магазин было некогда. Пришлось поступиться одним из своих правил, и выпаять резисторы из старой не нужной платы. Там применялись резисторы 15К и 30К. Получился вот такой франкенштейн:
Дальше я запустил Quartus, создал проектПосле создания проекта нужно задать целевое устройство: Меню Assigments -> DeviceДалее там же нажимаю кнопочку «Device and Pin options» потому что некоторые пины настроены так, что работать не будут. Настраиваю все, как «Use as regular I/O»В проекте я «нахадркодил» неуправляемый главный модуль DDS на фиксированную частоту.Модуль генератора на 1000 Гцmodule signal_generator(clk50M, signal_out); input wire clk50M;
output wire [7:0] signal_out; wire clk200M;
osc osc_200M reg [31:0] accumulator; assign signal_out = accumulator[31:31-7]; //пробуем генерировать 1000 Гц
//50 000 000 Hz – тактовая частота внешнего генератора
//2^32 = 4 294 967 296 – разрядность DDS – 32 бита
//делим 1000Hz / 50 000 000 Hz / 2 * 4294967296 => 42949,67296
always @(posedge clk50M) begin accumulator Pin PlannerНа линии HS_OUT, key0 и key1 прошу пока не обращать внимание, они появляются в проекте потом, но скрин в самом начале я сделать не успел.В принципе, достаточно «прописать» только PIN_nn в столбце Location, а остальные параметры (I/O standart, Current Strench и Slew Rate) можно оставить по умолчанию, либо выбрать такие же, что предлагаются по умолчанию (default), чтобы не было warning'ов.Как узнать какому PIN соответствует номер разъема на плате?Номера контактов разъема подписаны на платеА пины ПЛИС, к которым подключены контакты разъема, описаны в документации, которая идет в комплекте с платой ПЛИС.

После того, как пины назначены, компилирую проект еще раз и прошиваю с помощью USB программатора. Если у вас не установлены драйверы для программатора USB Byte blaster, то укажите Windows, что они находятся в папке, куда у вас установлен Quartus. Дальше она сама найдет. Подключать программатор нужно к разъему JTAG. А пункт меню для программирования «Tools -> Programmer» (либо нажать значек на панели инструментов). Кнопка «Start», радостное «Success» и прошивка уже внутри ПЛИС и уже работает. Только не выключайте ПЛИС, а то она все забудет.Tools -> ProgrammerЦАП подключен к разъему платы ПЛИС. К выходу ЦАП подключаю осциллограф С1-112А. В результате должна получиться «пила» потому что на выход 8 бит выводится старшая часть слова DDS аккумулятора фазы. А оно всегда увеличивается, пока не переполнится. Каких-то 1.5 часа и для частоты в 1000 Гц я вижу следующую осциллограмму:Хочу заметить, что «пила» по середине имеет небольшой перелом. Он связан с тем, что резисторы имеют разброс значений. Еще один важный момент, который нужно было выяснить — это максимально возможная частота, с которой будет работать DDS генератор. При правильно настроенных параметрах TimeQuest, после компиляции в «Compilation Report» можно увидеть, что скорость работы схемы выше 200 МГц с запасом. А это значит, что частоту генератора 50 МГц я буду умножать с помощью PLL на 4. Увеличивать значение аккумулятора фазы DDS буду с частотой 200 МГц. Итоговый диапазон частот, который можно получить в наших условиях 0 — 100 МГц. Точность установки частоты: 200 000 000 Гц (clk) / 2^32 (DDS) = 0,047 ГцТо есть, это лучше, чем ~0.05 Гц. Точность в доли герца для генератора с таким диапазоном рабочих частот (0…100 МГц) считаю достаточной. Если кому-то потребуется повысить точность, то для этого можно увеличить разрядность DDS (при этом не забыть проверить TimeQuest Timing Analyzer, что скорость работы логической схемы укладывалась в CLK=200 МГц, ведь это сумматор), либо просто снизить тактовую частоту, если такой широкий диапазон частот не требуется.TimeQuest Timing AnalyzerПосле того, как я увидел на экране «пилу», семейные дела заставили меня ехать на дачу (выходной же). Там я косил, варил, жарил шашлык и не подозревал о том сюрпризе, что ждал меня вечером. Уже ближе к ночи, перед сном, я решил посмотреть форму сигнала для других частот.Для частоты 100 КГцДля частоты 250 КГцДля частоты 500 КГцДля частоты 1 МГцНе буду скрывать, что форма сигналов меня расстроила, особенно на 1МГц (жалкий, никчемный мегагерц!). Я планировал получить частоты несколько других порядков. Почитав про R2R ЦАП стала ясна причина проблемы — паразитные емкости. Поэтому в планах на следующий день было решено сделать ЦАП на резисторах 100 и 200 Ом, которые у меня есть в наличии, а этот ЦАП оставить для будущих разработок, не требующих работы на таких высоких частотах, ведь в гладкости пилы тоже есть свой плюс. В связи с тем, что было интересно, как будет работать ЦАП на резисторах 100 и 200 Ом, я сразу взялся за паяльник. На этот раз ЦАП получился более аккуратным, а времени на его монтаж ушло меньше.Ставим ЦАП на плату ПЛИС и подключаем к осциллографуПроверяем 1 МГц — ВО! Совсем другое дело!Пила 10 МГцПила 25 МГцФорма пилы на 10 МГц еще похожа на правильную. Но на 25 МГц она уже совсем «не красивая». Однако, у С1-112а полоса пропускания — 10 МГц, так что в данном случае причина может быть уже в осциллографе. В принципе, на этом вопрос с ЦАП можно считать закрытым. Теперь снимем осциллограммы высокоскоростного выхода. Для этого, выведем старший бит на отдельный PIN ПЛИС. Данные для этой линии будем брать со старшего бита аккумулятора DDS.assign hs_out = accumulator[31];
Меандр 1 МГцМеандр 5 МГцМеандр 25 МГцМеандр 50 МГц уже практически не виденНо считаю, что выход ПЛИС стоило бы нагрузить на сопротивление. Возможно, фронты были бы круче. Синус делается по таблице. Размер таблицы 256 значений по 8 бит. Можно было бы взять и больше, но у меня уже был готовый mif файл. С помощью мастера создаем элемент ROM с данными таблицы синуса из mif-файла.Создание ROM – Tools -> Mega Wizard Plugin managerВыбираем 1 портовую ROM и задаем название модулюСоглашаемсяТут тоже соглашаемсяС помощью browse находим наш mif файл с таблицей синусаТут тоже ничего не меняемСнимаем галочку с модуля sine_rom_bb.v — он не нужен. Дальше finish. Квартус спросит добавить модуль в проект — соглашаемся. После этого, модуль можно использовать так же, как любой другой модуль в Verilog.Старшие 8 бит слова аккумулятора DDS будут использоваться в качестве адреса ROM, а выход данных — значение синуса.Код//sine rom
wire [7:0] sine_out;
sine_rom sine1(.clock(clk200M), .address(accumulator[31:31-7]), .q(sine_out));Осциллограмма синуса на разных частотах выглядит… одинаково.При желании, можно рассмотреть проблемы ЦАП, связанные с разбросом резисторов:Чтож, на этом выходные кончились. А ведь еще не написано ПО для управления с ПК. Вынужден констатировать факт, что в запланированные сроки я не уложился. Времени совсем мало, поэтому программу пишем на скорую руку (в лучших традициях). Местами, чтобы сократить количество букв и удобство ввода информации с клавиатуры, применяется фильтр событий по имени виджета. Прошу понять и простить. Интерфейс

Исходный код на GitHub. Там же есть уже собранное под windows приложение.

Код прост, как 5 копеек. В файл проекта .pro кроме всего прочего нужно добавить модуль serialport:QT += core gui serialport
Открытие COM порта QSerialPort serial; … serial.setPortName(ui->lbSerialPortInfo->currentText()); serial.setBaudRate(QSerialPort::Baud115200); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); serial.open(QIODevice::ReadWrite);Формирование и отправка сообщения QByteArray source; QDataStream stream(&source, QIODevice::ReadWrite); stream

Источник: https://sohabr.net/habr/post/260999/

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

Один из инструментов, без которого я бы пропал в своей домашней лаборатории, является функциональный генератор. Он довольно дорогой, поэтому я не купил его.

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

Теперь надо добавить только USB-совместимый AVR микроконтроллер и возможно немного аналоговых элементов.

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

Элементы

Неотъемлемой частью этой конструкции является 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:

Вы можете видеть 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
“.

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

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

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

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

Программное обеспечение написано на Python3. Я начал изучать его пару месяцев назад и до сих пор использую его для создания простых интерфейсов.

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

Это прекрасный язык, но я предпочитаю работать с микроконтроллерами и писать код на С.

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

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

Результат

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

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

ОбозначениеТипНоминалКоличествоПримечаниеМагазинМой блокнотU2U3U1U4X1X2D1, D2D3, D4С1-С3C4C5, C7, C12-C15C6C9C10, C11R1, R3R2, R7R4R5, R9, R11R6R8R10, R12J1P2, P5JP1CON1P1P3
МК AVR 8-бит AT90USB162 1 Поиск в Utsource В блокнот
Программируемый генератор AD9833 1 Поиск в Utsource В блокнот
Линейный регулятор LM1117-N 1 Поиск в Utsource В блокнот
Операционный усилитель OPA357 1 Поиск в Utsource В блокнот
Кварцевый резонатор ? 1 Поиск в Utsource В блокнот
Генератор ? 1 Поиск в Utsource В блокнот
Диод Шоттки ? 2 Поиск в Utsource В блокнот
Светодиод 2 Поиск в Utsource В блокнот
Конденсатор 1 мкФ 3 Поиск в Utsource В блокнот
Электролитический конденсатор 4.7 мкФ 1 Поиск в Utsource В блокнот
Конденсатор 100 нФ 6 Поиск в Utsource В блокнот
Электролитический конденсатор 10 мкФ 1 Поиск в Utsource В блокнот
Конденсатор ? 1 Поиск в Utsource В блокнот
Конденсатор 22 пФ 2 Поиск в Utsource В блокнот
Резистор 22 Ом 2 Поиск в Utsource В блокнот
Резистор 20 кОм 2 Поиск в Utsource В блокнот
Резистор 10 кОм 1 Поиск в Utsource В блокнот
Резистор 1 кОм 3 Поиск в Utsource В блокнот
Резистор ? 1 Поиск в Utsource В блокнот
Резистор 150 кОм 1 Поиск в Utsource В блокнот
Резистор 50 Ом 2 Поиск в Utsource В блокнот
Разъём Mini USB 1 на плату Поиск в Utsource В блокнот
Разъём BNC 2 на плату Поиск в Utsource В блокнот
Разъём PLS-3R 1 для перемычки Поиск в Utsource В блокнот
Разъём PLD-6 1 ISP Поиск в Utsource В блокнот
Разъём 2 контакта 1 питание Поиск в Utsource В блокнот
Разъём PLS-8 1 Поиск в Utsource В блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

  • function-gen.rar (971 Кб)

Источник: http://cxem.net/izmer/izmer112.php

Функциональный DDS генератор на базе микросхемы AD9833

» Схемы » Генераторы · Применение микроконтроллеров

23-04-2012

AD9833

На страницах сайта Радиолоцман, в разделе «Схемы», опубликовано множество схем DDS генераторов, от простых, на одном микроконтроллере, до сложных на базе ПЛИС с богатыми функциональными возможностями.

Мы рассмотрим еще одну конструкцию такого прибора, функцию DDS синтеза аналогового сигнала в котором выполняет специализированная микросхема AD9833, производства компании Analog Devices, являющейся одним из лидеров в этой области.

Основные характеристики генератора:

  • Выходная частота от 1 Гц до 5 МГц;
  • Точность 0.1 Гц;
  • Форма выходного сигнала: прямоугольные, треугольные, синус;
  • Возможность регулировки скважности импульсов;
  • 5 В ТТЛ выход;
  • Аналоговый выходной сигнал с размахом от +15 В до –15 В;
  • Возможность подстройки постоянного смещения в пределах от +15 В до –15 В;
  • Пользовательский интерфейс: двухстрочный ЖК индикатор и 16-кнопочная клавиатура.

Прямой цифровой синтез (DDS) – метод, позволяющий получить аналоговый сигнал за счет генерации временной последовательности цифровых отсчетов и их дальнейшего преобразования в аналоговую форму посредством цифро-аналогового преобразователя.

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

На сегодняшнем уровне развития схемотехники DDS синтезаторы представляют собой очень компактные микросхемы с низким потреблением.

Выбор микросхемы AD9833 основан на следующих ее преимуществах:

  • низкая стоимость,
  • малое потребление,
  • последовательный интерфейс управления,
  • простые команды,
  • минимальное количество необходимых внешних компонентов,
  • высокая точность выходного сигнала.

Расположение выводов микросхемы AD9833

В качестве источника тактовых импульсов для микросхемы синтезатора необходимо использовать осциллятор со встроенным генератором, простой кварцевый резонатор не подходит для использования совместно с микросхемой. В техническом описании на микросхему указано значение тактовой частоты 25 МГц, но автор применил генератор на 50 МГц, при тестировании устройства никаких проблем не было выявлено.

Прибор снабжен ЖК индикатором, клавиатурой для управления и настройки и переменными резисторами для регулирования уровня, смещения и симметрии. Управление микросхемой DDS синтезатора и всей периферией осуществляет микроконтроллер Atmel AVR ATmega32.

Условно схема DDS генератора разбита на несколько частей: схема питания, микроконтроллерная часть, модуль DDS на микросхеме AD9833, выходная аналоговая часть и пользовательский интерфейс.

Схема питания построена на интегральных регуляторах напряжения и обеспечивает двуполярное напряжение ±15 В для выходной аналоговой части и напряжение +5 В для питания микроконтроллера и периферии.

Микроконтроллер тактируется от встроенного RC осциллятора 8 МГц. Стандартный двухстрочный ЖК индикатор на базе контроллера HD44780 подключен к порту C (Port C) микроконтроллера по 4-битному интерфейсу. Резистор R1 предназначен для регулировки контрастности.

К сигнальной линии PC7/TOSC2 подключен звуковой излучатель (буззер), который используется для звукового оповещения пользователя при переключении режимов и настройке. Потенциометр R2, подключенный к каналу ADC0 встроенного АЦП микроконтроллера, используется для цифровой регулировки уровня выходного аналогового сигнала.

Регулировка уровня выполнена на базе микросхемы цифрового потенциометра MCP41010 (см. схему выходной аналоговой части), которая управляется микроконтроллером по интерфейсу SPI.

Схема микроконтроллерной части DDS генератора

Нажмите для увеличения

Управление микросхемой DDS синтезатора осуществляется по линиям микроконтроллера PD0 (DDSDATA), PD1 (DDSFSYNC), PD2 (DDSCLK). Микросхема DDS, осциллятор и несколько пассивных компонентов обвязки конструктивно составляют отдельный подключаемый модуль, что позволит использовать его в других конструкциях или в экспериментах.

Схема DDS модуля генератора на микросхеме AD9833

Нажмите для увеличения

К аналоговой выходной части генератора предъявляются особые требования, т.к. не так просто усилить сигнал с амплитудой 400 мВ до уровня ±15 В, с выходным током 300 мА на частоте 5 МГц.

Поэтому был применен сверхбыстродействующий операционный усилитель LM7171 с обратной связью по напряжению и схема двухтактного транзисторного усилителя мощности.

Блокировочные конденсаторы по питанию операционных усилителей на печатной плате должны быть расположены как можно ближе к микросхемам.

Кроме того, в зависимости от формы генерируемого сигнала (прямоугольные импульсы или синусоида) включаются разные схемы предварительного усиления и нормализации сигнала. Переключение этих схем выполнено на реле, которое управляется микроконтроллером, в зависимости от режима работы генератора (транзисторы Q6 и Q7).

На выводе микроконтроллера PD7 генерируются прямоугольные импульсы, которые поступают через буфер на микросхеме 74HC14 на ТТЛ выход генератора.

Схема выходной аналоговой части DDS генератора

Нажмите для увеличения

ТТЛ выход генератора

Нажмите для увеличения

Модуль готовой матричной клавиатуры с организацией 4×4 подключается к порту B (Port B). Строки матрицы клавиатуры подключены к линиям порта PB0-PB3, столбцы – подключены к линиям PB4-PB7.

Загрузки

Исходный код и прошивка микроконтроллера – скачать

microsyl.com

Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Фрагменты обсуждения: Полный вариант обсуждения »
  • Ошибка: Вместо микроконтроллерной части схемы скачивается схема DDS. Жаль что и тут и у автора очень скудное описание проекта
  • Эта разработка, вероятно, относится к измерительной технике, которая должна иметь кроме прочих иметь метрологические характеристики воспроизводимого сигнала. Например: – выходное сопротивление, которое зависит от частоты при наличии усилительного каскада на транзисторах; – коэффициент гармоник при воспроизвелении синусоиды; – время установления для прямоуголоного сигнала; – линейность (отклонение от линейности) для треугольного сигнала. Эти требования прописаны в соответствующих ГОСТ-ах и ТУ. Метрологию и метрологов, к сожалению, не изучают, а многие просто не знают о её существовании.
  • Ошибку исправили – скачивается схема микроконтроллерной части генератора.
  • Ктото пробовал собирать данный DDS. У меня пока сним прблемы,на схеме мега32 а исходнике мега324,они не совместимы.
  • а где можно найти печатные платы.
  • Какие платы, схема и прошивка не рабочие,всё нужно переделывать. Использовать как направление,чем сейчас и занимаюсь. Схема меге32 а прошивка мега 324,а они не совместимы и так дальше,везде глюки.
  • а который можно взять генератор чтобы там были основные сигналы (синус треугольный и меандир можно еще шум) очень надо
  • Если по-быстрому ,используй 174ГФ2(не указал,правда ,диапазон перестройки и прочие парам.(наприм.Точность,уход частоты,и пр..)
  • чем получше до 2-5 МГц
  • Если ГФ2 достанешь-подойдёт…
  • Не факт что схема и прошивка не рабочие… Или вы проверяли прошиву именно на ATmega324. Уточните, если не затруднит. На схеме действительно указана mega32. Но автор проекта на своем сайте в комментариях к этому проекту уточнил, что в схеме должен использоваться микроконтроллер ATmega324… Однако в схеме эта ошибка пока не устранена…
  • Перепутаны столбцы и строки клавиатуры. TTL выход вобще не зделан.Уровень прямоугольного сигнала 5V,синус и пила 0.6V.
  • Кстати да, за какое время устаканивается работа синтезатора после записи управляющего слова в регистры чипа AD9833? Даташит смотрел, но не нашел нужных цифр. Наверное плохо смотрел.
  • камрад, Вам большой салям из 2012 года! 🙂
  • Да хоть из 2002_го 🙂 Что касаемо времени, нашел в даташите, что время задержки установки частоты у AD9833 равняется 7 или 8 периодам тактовой частоты.
  • Вопрос вдогонку – кто-нибудь пробовал модулировать получаемый с AD9833 сигнал по амплитуде? Есть у нее выход наружу от ИОН с которого подается определенное напряжение на ЦАП. Вывод для конденсатора, для сглаживания возможных пульсаций напряжение опорного источника. Что, если шунтировать этот вывод, изменяя напряжение опорника? Возможно изменение амплитуды напряжения на выходе ЦАП таким образом?
  • Если бы был внешний ИОН (или возможность программного переключения на него), то можно было бы менять напряжение на выходе. А так, пытаясь “просадить” опору, ничего путного получить не удастся. Нужен внешний каскад для модуляции…
  • Жаль. Я было подумал, что может получится как в AD9850/9851, у которых имеется возможность АМ модуляции сигнала путем изменения тока ЦАП. Цена у 9850 раза в 3 выше чем 9833. Надеялся, что получится сэкономить. Ну ладно, тогда возьму AD9850. Мутить внешний АМ модулятор не буду, хотелось “красивого” решения без лишних навесов на синтезатор.
Полный вариант обсуждения »

При перепечатке материалов с сайта прямая ссылка на РадиоЛоцман обязательна.

Приглашаем авторов статей и переводов к публикации материалов на страницах сайта.

Источник: https://www.rlocman.ru/shem/schematics.html?di=128164

Страничка эмбеддера » Генератор синуса и прямоугольника

Фигова эмбеддерская жизнь без генератора синуса! Вот и я решился сделать себе такой девайс.

Сначала хотел на atXmega сделать – там есть суперский такой 12-битный ЦАП. Посчитал, написал (вот одно из тех мест, где нужно писать на асме!), получилось, но плохо – всего 800kSps, тоесть можно рассчитывать на 100кГц синуса максимум. Не густо! Подумал я еще и прикупил ad9833.

Введение

Этот проект – один из долгоиграющих проектов. С одной стороны пришлось принять много компромиссных решений (а я жутко не люблю компромиссы

Источник: http://bsvi.ru/generator-sinusa-i-pryamougolnika/

Генератор сигналов на AD9833

AD9833 – это программируемый генератор сигналов с низким энергопотреблением. Позволяет генерировать сигналы с частотой до 12.5МГц синусоидальной, треугольной и прямоугольной формы. Программирование осуществляется с использованием трехпроводного интерфейса SPI и не составляет труда.

Ниже приведены основные характеристики микросхемы:

  • Цифровое программирование частоты и фазы.
  • Потребляемая мощность 12.65 мВт при напряжении 3 В.
  • Диапазон выходных частот от 0 МГц до 12.5 МГц.
  • Разрешение 28 бит (0.1 Гц при частоте опорного сигнала 25 МГц).
  • Синусоидальные, треугольные и прямоугольные выходные колебания.

  • Напряжение питания от 2.3 В до 5.5 В.
  • Трехпроводной интерфейс SPI.
  • Расширенный температурный диапазон: от –40°C до +105°C.
  • Опция пониженного энергопотребления.

Более подробную информацию вы можете найти в даташите.

В характеристиках также заявлено, что микросхема не требует внешних компонентов, но здесь производитель лукавит: обвязка и источник опорной частоты все же нужны. На Али продаются модули AD9833 с необходимой обвязкой и кварцевым генератором на 25 МГц, как раз с таким модулем я и собираюсь экспериментировать.

Данный модуль имеет следующие выводы:

  • VCC – плюс питания для цифровых и аналоговых цепей генератора.
  • DGND – цифровая земля.
  • SDATA – вход данных интерфейса SPI. Передача осуществляется 16-битными словами.
  • SCLK – вход тактового сигнала SPI. Используется второй режим работы: (CPOL = 1, CPHA = 0).
  • FSYNC – выбор микросхемы.

    Перед началом передачи данных должен быть установлен в 0, по завершении в 1.

  • AGND – аналоговая земля.
  • OUT – выход генератора.

Попробуем подключить этот модуль к Ардуино и научиться им управлять.

Для начала ознакомимся с его функциональной схемой:AD9833 состоит из следующих основных частей: два регистра выбора частоты, аккумулятор фазы, два регистра выбора фазы и сумматор смещения фазы (вместе эти компоненты составляют генератор с цифровым управлением – NCO), SIN ROM для преобразования информации о фазе в амплитуду и 10-разрядный цифро-аналоговый преобразователь.

Из схемы видно, что данные с интерфейса SPI передаются в управляющий регистр, регистры выбора фазы и частоты. Именно они определяют сигнал на выходе генератора. И программирование генератора сводится к изменению содержимого указанных регистров. Это 16-разрядный регистр, управляющий работой генератора. Подробное описание его битов приведено ниже в таблице.

Схема из даташита также наглядно демонстрирует их назначение:

БитНазваниеНазначение
15, 14 DB15, DB14 Чтобы AD9833 понял, что принятое по SPI 16-битное слово содержит новое значение для управляющего регистра, два старших бита в слове должны быть установлены в 0.

13 B28 Регистры частоты AD9833 имеют разрядность 28 бит, поэтому для изменения их содержимого требуется передача двух 16-битных слов. Однако в некоторых случаях требуется изменить только старшую или младшую часть регистра частоты.

Здесь и используется данный признак: B28 = 1 говорит о том, что необходимо обновить регистр частоты целиком и его новое значение будет передано двумя последовательными записями. Первая запись содержит 14 младших бит, вторая 14 старших бит. Первые два бита в обеих записях определяют регистр частоты, в который будет записано передаваемое значение и должны быть одинаковыми.

Обновление регистра частоты происходит после получения полного слова, поэтому запись промежуточного значения в регистр исключена. B28 = 0 позволяет обновить отдельно старшую или младшую часть регистра. Какая именно часть будет изменена определяется управляющим битом HLB.

12 HLB Бит HLB определяет, какая из частей регистра частоты (младшая или старшая) будет перезаписана. Используется при B28 = 0. При B28 = 1 значение этого бита игнорируется. HLB = 1 позволяет обновить старшие 14 бит регистра частоты; HLB = 0 позволяет обновить младшие 14 бит регистра частоты.

11 FSELECT Бит FSELECT определяет, какой из регистров используется в аккумуляторе фазы – FREQ0 или FREQ1.
10 PSELECT Бит PSELECT определяет, данные какого из регистров PHASE0 или PHASE1 добавляются к выходу аккумулятора фазы.

9 Зарезервирован Данный бит зарезервирован и должен быть установлен в 0.
8 RESET RESET = 1 сбрасывает внутренние регистры генератора в 0. Сброс не затрагивает регистры управления, частоты и фазы.

7 SLEEP1 При SLEEP1 = 1 запрещается внутреннее тактирование, приостанавливается работа NCO и выход генератора остается в своем текущем состоянии. При SLEEP1 = 0 тактирование разрешено.
6 SLEEP12 При SLEEP12 = 1 отключается внутренний ЦАП.

Это может быть полезно для генерации прямоугольных импульсов, при которой не требуется выполнение цифро-аналоговых преобразований. При SLEEP12 = 0 внутренний ЦАП активен.

5 OPBITEN Данный бит вместе с битом MODE управляют выходом генератора.

При OPBITEN = 1 внутренний ЦАП отключается от выхода VOUT и для генерации выходного сигнала используется значение старшего значащего бита с входа ЦАП, что позволяет получить на выходе генератора прямоугольные импульсы.

4 Зарезервирован Данный бит зарезервирован и должен быть установлен в 0.
3 DIV2 Используется в паре со значением OPBITEN = 1. При DIV2 = 1 значение старшего значащего бита данных с входа ЦАП подается напрямую на выход VOUT. DIV2 = 0 позволяет задействовать делитель частоты и уменьшить частоту выходного сигнала вдвое. При OPBITEN = 0 значение данного бита игнорируется.
2 Зарезервирован Данный бит зарезервирован и должен быть установлен в 0.
1 MODE Данный бит вместе с битом OPBITEN управляют выходом генератора. При OPBITEN = 1 бит MODE должен быть установлен в 0. Значение MODE = 0 позволяет получить на выходе генератора синусоидальный сигнал. При MODE = 1 на выходе будет треугольный сигнал.
Зарезервирован Данный бит зарезервирован и должен быть установлен в 0.

И для лучшего понимания назначения битов OPBITEN, MODE и DIV2 я приведу таблицу с их допустимыми комбинациями и формой результирующих сигналов на выходе:

OPBITENMODEDIV2Сигнал на выходе VOUT
X Синусоидальный
1 X Треугольный
1 Прямоугольный с частотой F/2
1 1 Прямоугольный с частотой F
1 1 X Зарезервировано

Генератор AD9833 имеет 2 регистра частоты и 2 регистра фазы разрядностью 28 бит и 12 бит соответственно. 

Выбор активного регистра частоты осуществляется установкой управляющего бита FSELECT: при FSELECT = 0 активным является FREQ0; при FSELECT = 1 активен регистр FREQ1. Результирующая частота на выходе генератора определяется следующим образом:

(FMCLK / 228) * FREQREG,

где FMCLK – это опорная частота, FREQREG – значение, загруженное в активный регистр частоты. Таким образом, если мы хотим получить на выходе генератора сигнал с частотой 400Гц при опорной частоте 25МГц, в активный регистр  должно быть загружено значение:

FREQREG = FOUT*228 / FMCLK = 400Гц * 228 / 25МГц ≈ 4295

Для того чтобы загрузить значение FREQREG в регистр частоты необходимо, старшие биты передаваемого по SPI значения установить в 01 для загрузки в FREQ0 или 10 для загрузки в FREQ1.

Напомню, что общение с AD9833 осуществляется по SPI 16-битными словами.

Фаза выходного сигнала определяется следующим образом:(2π / 212) * PHASEREG соответственно, значение для регистра фазы вычисляется по формуле:

PHASEREG = PHASE*212 / 2π

В приведенных формулах PHASEREG – это значение активного регистра фазы. Выбор активного регистра осуществляется установкой управляющего бита PSELECT: при PSELECT = 0 активным является PHASE0; при PSELECT = 1 активен регистр PHASE1.

При записи нового значения в регистр фазы старшие биты должны быть установлены в 11, а выбор регистра, в который должно быть записано значение, осуществляется установкой бита 13: при нулевом его значении будет обновлен регистр PHASE0; при установке указанного бита в 1 будет обновлен регистр PHASE1. 12й бит не используется, а биты с 0 по 11 содержат значение для регистра фазы.

Разрядность регистра частоты в 28 бит при опорной частоте 25МГц обеспечивает шаг 0.1Гц для установки частоты сигнала на выходе. А 12-битный регистр фазы обеспечивает разрешение 2π/4096.

Тестовая программа для AD9833 на Ардуино

Теперь мы можем написать первую программу для AD9833. Схема подключения модуля AD9833 к Ардуино и скетч приведены ниже.

С подключением все просто: общение с модулем происходит по интерфейсу SPI, для которого на Ардуино отведены следующие пины: D10 – SS (Slave Select – выбор ведомого), к нему подключаем вывод FSYNC модуля. D11 – MOSI (Master Out Slave In – выход ведущего, вход ведомого), к нему подключаем вывод SDATA. D13 – SCK (Serial Clock – Тактовый сигнал), к нему подключаем вывод SCLK. void setup() { SPI.begin(); WriteAD9833(0x2100); WriteAD9833(0x50C7); WriteAD9833(0x4000); WriteAD9833(0xC000); WriteAD9833(0x2000); } void WriteAD9833(uint16_t Data){ SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV2, MSBFIRST, SPI_MODE2)); digitalWrite(SS, LOW); delayMicroseconds(1); SPI.transfer16(Data); digitalWrite(SS, HIGH); SPI.endTransaction();
} void loop() { WriteAD9833(0x2000); delay(5000); WriteAD9833(0x2002); delay(5000); WriteAD9833(0x2020); delay(5000); WriteAD9833(0x2028); delay(5000); }В данном скетче выполняются следующие действия:

  • При первом вызове функции WriteAD9833 производится установка управляющего регистра: бит RESET устанавливается в 1 для выполнения сброса; бит DB28 устанавливается в 1 для перезаписи всего содержимого регистра частоты; биты FSELECT и PSELECT содержат 0, поэтому для генерации выходного сигнала будут использоваться регистры FREQ0 и PHASE0.
  • Следующие два вызова передают значение 4295 в регистр частоты FREQ0. Данное значение умещается в 14 младших разрядах, поэтому в старшие разряды регистра записываем нули.
  • Сдвиг по фазе не требуется – запишем в регистр PHASE0 значение 0
  • Последним вызовом WriteAD9833 в процедуре setup снимаем бит RESET, разрешая тем самым работу генератора. Результирующий сигнал поступает на вывод VOUT.
  • Следующие вызовы WriteAD9833 в функции loop обновляют содержимое управляющего регистра, перебирая комбинации битов MODE, OPBITEN и DIV2 для генерации сигнала синусоидальной, треугольной и прямоугольной форм.

Вот как выглядит выходной сигнал генератора в виртуальном осциллографе:

Синусоидальный сигнал (биты MODE и OPBITEN сброшены в 0)

Треугольный сигнал (MODE = 1, OPBITEN = 0)

Прямоугольный сигнал (OPBITEN = 1, MODE = 0, DIV2 = 1)

Прямоугольный сигнал (OPBITEN = 1, MODE = 0, DIV2 = 0)

Обратите внимание: при генерации синусоидальных и треугольных импульсов, когда сигнал снимается с выхода ЦАП, его амплитуда изменяется в диапазоне -300мВ…300мВ. При генерации импульсов прямоугольной формы мы имеем дело с обычным цифровым сигналом с соответствующими уровнями напряжения. Так в последних двух осциллограммах логической единице соответствует напряжение ~4,5В.Разобравшись с управлением AD9833 можно приступать к созданию генератора с интерфейсом управления и индикацией. Для этого добавим в нашу схему энкодер вращения и жидкокристаллический дисплей:

Ранее я писал о том, как можно сделать меню на Ардуино с энкодером вращения. И сейчас я взял такое меню за основу скетча, добавив в него функционал для работы с AD9833. Скачать скетч можно по ссылке. При включении питания AD9833 настраивается на генерацию синусоидального сигнала частотой 100Гц, соответствующая информация отображается на дисплее. Вращая ручку энкодера можно изменять его частоту, а при нажатии вызывается меню. В меню доступны следующие опции:

  • Установка частоты (можно задать произвольное значение от 1 до 12,5МГц).
  • Установка фазы (0 – 360°).
  • Выбор формы сигнала.
  • Выбор значения, на которое изменяется частота при вращении ручки энкодера.

Остается только поместить все компоненты в подходящий корпус и получится законченное устройство. Результат работы в следующем ролике:

Источник: https://tsibrov.blogspot.com/2018/06/ad9833.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}