В первой части мы рассмотрели схемотехническое решение и конструкцию DDS генератора на микроконтроллере ATmega16.
Программное обеспечение для микроконтроллера. Основные моменты
Как упоминалось в первой части статьи, алгоритм работы DDS генератора, автором которого является Jesper Hansen, был немного переработан и адаптирован под компилятор WinAVR. Рассмотрим эти отличительные моменты.
Основной момент – это введение дополнительного кода на ассемблере, который позволил остановить генерацию при нажатии кнопки Start/Stop. В функции проверяется состояние бита CPHA в регистре SPCR, который устанавливается в обработчике внешнего прерывания (кнопка Start/Stop подключена к выводу внешнего прерывания INT0). В итоге алгоритм займет 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″
);}
Следующий момент – таблица значений сигналов для прямого синтеза. Данная таблица определена в Flash-памяти по адресу с началом 0xXX00. Поэтому необходимо в make-файле определить эту секцию с целью правильного распределения памяти:
#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
Библиотека управления ЖК дисплеем – AVR-GCC 4 bit and 8 bit LCD.
Все режимы работы и настройки отображаются на дисплее. Управление осуществляется с помощью пяти кнопок. Кнопки Up (вверх) и Down (вниз) используются для перемещения между пунктами меню, кнопки Left (влево) и Right (вправо) используются для изменения значения частоты. Кнопка Start/Stop – запускает/останавливает генерацию.
Вид меню генератора сигналов
Стоит заметить, что имеется отдельный пункт меню, в котором изменяется шаг перестройки частоты (Freq Step). Данная опция позволяет менять значение частоты для всех сигналов в широком диапазоне с минимальным количеством нажатий кнопок и переходов по меню.
При генерации шума настройки частоты не требуется – используется простая функция генерации случайного числа, результат которой непрерывно поступает на выход DDS.
Значение частоты высокочастотного сигнала можно выбрать 1 МГц, 2 МГц, 4 МГц и 8 МГц.
Результаты
Работа генератора была проверена с помощью осциллографа и частотомера. На изображениях ниже – вид формы сигнала и основные параметры на осциллографе.
![]() Синусоидальный сигнал |
![]() Сигнал прямоуголной формы |
![]() Сигнал треугольной формы |
![]() Сигнал пилообразной формы |
![]() Шум |
![]() Высокочастоный сигнал 1 МГц |
Загрузки
Текст исходного кода и hex-файл – скачать