Функциональный DDS генератор

Данный DDS функциональный генератор (версия 2.0) сигналов собран на микроконтроллере AVR, обладает хорошей функциональностью, имеет амплитудный контроль, а также собран на односторонней печатной плате.

Данный генератор базируется на алгоритме DDS-генератора Jesper, программа была модернизирована под AVR-GCC C с вставками кода на ассемблере. Генератор имеет два выходных сигнала: первый — DDS сигналы, второй — высокоскоростной (1..8МГц) «прямоугольный» выход, который может использоваться для оживления МК с неправильными фузами и для других целей.
Высокоскоростной сигнал HS (High Speed) берется напрямую с микроконтроллера Atmega16 OC1A (PD5).
DDS-сигналы формируются с других выходов МК через резистивную R2R-матрицу и через микросхему LM358N, которая позволяет осуществить регулировку амплитуды (Amplitude) сигнала и смещение (Offset). Смещение и амплитуда регулируются при помощи 2-х потенциометров. Смещение может регулироваться в диапазоне +5В..-5В, а амплитуда 0…10В. Частота DDS-сигналов может регулироваться в районе 0… 65534 Гц, это более чем достаточно для тестирования аудио-схем и других радиолюбительских задач.

Основные характеристики DDS-генератора V2.0:
— простая схема с распространенными и недорогими радиоэлементами;
— односторонняя печатная плата;
— встроенный блок питания;
— отдельный высокоскоростной выход (HS) до 8МГц;
— DDS-сигналы с изменяемой амплитудой и смещением;
— DDS-сигналы: синус, прямоугольник, пила и реверсивная пила, треугольник, ЭКГ-сигнал и сигнал шума;
— 2×16 LCD экран;
— интуитивная 5-ти кнопочная клавиатура;
— шаги для регулировки частоты: 1, 10, 100, 1000, 10000 Гц;
— запоминание последнего состояния после включения питания.

На представленной ниже блок-схеме, приведена логическая структура функционального генератора:

Как вы можете видеть, устройство требует наличие нескольких питающих напряжений: +5В, -12В, +12В. Напряжения +12В и -12В используются для регулирования амплитуды сигнала и смещения. Блок питания сконструирован с использованием трансформатора и нескольких микросхем стабилизаторов напряжения:

Блок питания собран на отдельной плате:

Если самому собирать блок питания нет желания, то можно использовать обычный ATX блок питания от компьютера, где уже присутствуют все необходимые напряжения. Разводка ATX разъема.

LCD-экран

Все действия отображаются через LCD-экранчик. Управление генератором осуществляется пятью клавишами

Клавиши вверх/вниз используются для перемещения по меню, клавиши влево/вправо для изменения значения частоты. Когда центральная клавиша нажата — начинается генерирование выбранного сигнала. Повторное нажатие клавиши останавливает генератор.

Система меню генератора:

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

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

Высокоскоростной выход HS имеет 4 режима частоты: 1, 2, 4 и 8 МГц.

Принципиальная схема

Схема функционального генератора простая и содержит легкодоступные элементы:
— микроконтроллер AVR Atmega16, с внешним кварцем на 16 МГц;
— стандартный HD44780-типа LCD-экранчик 2×16;
— R2R-матрица ЦАП из обычных резисторов;
— операционный усилитель LM358N (отечественный аналог КР1040УД1);
— два потенциометра;
— пять клавиш;
— несколько разъемов.

Плата:

Функциональный генератор собран в пластиковом боксе:

Тестовый запуск:

Программное обеспечение

Как я уже говорил выше, в основе своей программы я использовал алгоритм DDS-генератора Jesper. Я добавил несколько строчек кода на ассемблере для реализации останова генерирования. Теперь алгоритм содержит 10 ЦПУ циклов, вместо 9.

void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0){
asm volatile( «eor r18, r18 ;r18<-0″ «nt»
«eor r19, r19 ;r19<-0″ «nt»
«1:» «nt»
«add r18, %0 ;1 cycle» «nt»
«adc r19, %1 ;1 cycle» «nt»
«adc %A3, %2 ;1 cycle» «nt»
«lpm ;3 cycles» «nt»
«out %4, __tmp_reg__ ;1 cycle» «nt»
«sbis %5, 2 ;1 cycle if no skip» «nt»
«rjmp 1b ;2 cycles. Total 10 cycles» «nt»
:
:»r» (ad0),»r» (ad1),»r» (ad2),»e» (signal),»I» (_SFR_IO_ADDR(PORTA)), «I» (_SFR_IO_ADDR(SPCR))
:»r18″, «r19″
);}

Таблица форм DDS-сигналов размещена во флэш памяти МК, адрес которой начинается с 0xXX00. Эти секции определены в makefile, в соответствующих местах в памяти:
#Define sections where to store signal tables
LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
LDFLAGS += -Wl,-section-start=.MySection6=0x3F00

Библиотеку для работы с LCD можно взять здесь.

Не хочу вдаваться в подробное описание кода программы. Исходный код хорошо прокомментирован (правда на английском языке) и если будут какие либо вопросы по нему, то всегда можете воспользоваться нашим форумом по МК или в комментариях к статье.

Тестирование

Я тестировал генератор с осциллографом и частотомером. Все сигналы хорошо генерируются во всем диапазоне частот (1…65535 Гц). Регулирование амплитуды и смещения работает нормально.

В следующей версии генератора думаю реализовать сигнал нарастающей синусоиды.

Последнюю версию ПО (WinAVR), исходник, файлы EagleCAD и Proteus можете скачать ниже.

Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

Блок питания
Линейный регуляторLM78051

Линейный регуляторLM78121

Линейный регуляторLM79121
B1
Диодный мост1
C1, C7
Электролитический конденсатор2000 мкФ2
C3, C5, C9
Электролитический конденсатор100 мкФ3
C4, C6, C10
Конденсатор0.1 мкФ3
TR1
Трансформатор220В — 2×15В1
F1
Плавкий предохранитель1
S1
Переключатель220В1
X1
РазъёмСеть 220В1
JP1
Разъём4 контакта1
Выход БПОсновная платаIC1
МК AVR 8-битATmega161
IC2
Операционный усилительLM358N1
КР1040УД1C2, C3
Конденсатор0.1 мкФ2
C6, C7
Конденсатор18 пФ2
R1
Резистор500 Ом1
R2, R6, R8, R10, R12, R14, R16, R18
Резистор10 кОм8
R3, R21
Резистор100 кОм2
R20
Резистор100 Ом1
R22
Резистор12 кОм1
POT
Подстроечный резистор10 кОм1
POT1
Подстроечный резистор1 кОм1
POT2
Подстроечный резистор47 кОм1
LCD
LCD-дисплейHD44780 2×161
Q1
Кварц16 МГц1
BUTTONS, RESET
Кнопка6
HS, DDS
Разъём2 контакта1
BNCISP
РазъёмPLD-61
Разъём ISPJP1
Разъём4 контакта1
Разъём питанияДобавить все

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

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

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

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

Ваш адрес email не будет опубликован.