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

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

Данный 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″ "
"

"eor r19, r19 ;r19<-0″ "
"

"1:" "
"

"add r18, %0 ;1 cycle" "
"

"adc r19, %1 ;1 cycle" "
"

"adc %A3, %2 ;1 cycle" "
"

"lpm ;3 cycles" "
"

"out %4, __tmp_reg__ ;1 cycle" "
"

"sbis %5, 2 ;1 cycle if no skip" "
"

"rjmp 1b ;2 cycles. Total 10 cycles" "
"

:

:"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 Гц). Регулирование амплитуды и смещения работает нормально.

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

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

Оригинал статьи на английском языке (перевод Колтыков А.В. для сайта cxem.net)


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 4 + 2

Добавить изображение

Последние статьи