Данный DDS функциональный генератор (версия 2.0) сигналов собран на микроконтроллере AVR, обладает хорошей функциональностью, имеет амплитудный контроль, а также собран на односторонней печатной плате.
Данный генератор базируется на алгоритме DDS-генератора Jesper, программа была модернизирована под AVR-GCC C с вставками кода на ассемблере. Генератор имеет два выходных сигнала: первый — DDS сигналы, второй — высокоскоростной (1..8МГц) «прямоугольный» выход, который может использоваться для оживления МК с неправильными фузами и для других целей.
Высокоскоростной сигнал HS (High Speed) берется напрямую с микроконтроллера Atmega16 OC1A (PD5).
DDS-сигналы формируются с других выходов МК через резистивную R2R-матрицу и через микросхему LM358N, которая позволяет осуществить регулировку амплитуды (Amplitude) сигнала и смещение (Offset). Смещение и амплитуда регулируются при помощи двух потенциометров. Смещение может регулироваться в диапазоне +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 можете скачать ниже.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот | |
---|---|---|---|---|---|---|---|
Блок питания | |||||||
Линейный регулятор | LM7805 | 1 | |||||
Линейный регулятор | LM7812 | 1 | |||||
Линейный регулятор | LM7912 | 1 | |||||
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-бит | ATmega16 | 1 | ||||
IC2 | Операционный усилитель | LM358N | 1 | КР1040УД1 | |||
C2, 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×16 | 1 | ||||
Q1 | Кварц | 16 МГц | 1 | ||||
BUTTONS, RESET | Кнопка | 6 | |||||
HS, DDS | Разъём | 2 контакта | 1 | BNC | |||
ISP | Разъём | PLD-6 | 1 | Разъём ISP | |||
JP1 | Разъём | 4 контакта | 1 | Разъём питания | |||