Данный 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″ "\n\t"
"eor r19, r19 ;r19<-0″ "\n\t"
"1:" "\n\t"
"add r18, %0 ;1 cycle" "\n\t"
"adc r19, %1 ;1 cycle" "\n\t"
"adc %A3, %2 ;1 cycle" "\n\t"
"lpm ;3 cycles" "\n\t"
"out %4, __tmp_reg__ ;1 cycle" "\n\t"
"sbis %5, 2 ;1 cycle if no skip" "\n\t"
"rjmp 1b ;2 cycles. Total 10 cycles" "\n\t"
:
:"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В - 2x15В | 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 2x16 | 1 |
| Поиск в магазине |
|---|
| Q1 |
Кварц | 16 МГц | 1 |
| Поиск в магазине |
|---|
| BUTTONS, RESET |
Кнопка |
| 6 |
| Поиск в магазине |
|---|
| HS, DDS |
Разъём | 2 контакта | 1 |
BNC | Поиск в магазине |
|---|
| ISP |
Разъём | PLD-6 | 1 |
Разъём ISP | Поиск в магазине |
|---|
| JP1 |
Разъём | 4 контакта | 1 |
Разъём питания | Поиск в магазине |
|---|
Скачать список элементов (PDF) Оригинал статьи
Источник: http://hmelectro.ru/proekts/dds_generator/ |