Функциональный генератор НЧ сигналов на основе DDS с применением контроллера AVR ATMega16

В последнее время получили широкое распространение методы цифрового синтеза частоты(DDS), причем методы реализации очень многообразны. Способ и метод реализации зависит от требований к генератору.
    У меня к генератору были основные требования:
  • 1. Частота в диапазоне от 0.01Гц – 50000Гц с шагом 0.01Гц
  • 2. Максимальная, по возможности, линейность на протяжении всего диапазона.
  • 3. Работа на низкоомную нагрузку(для проверки динамиков и УЗ магнитострикционных излучателей)
  • 4. Удобство и быстрота перестройки «на горячую».
  • 5. Сканирование заданного диапазона с заданным шагом (удобно для определения частоты резонанса чего угодно)
  • 6. Большое количество форм сигналов, и постоянное напряжение для калибровки.
  • 7. Информативность отображения.

Поскольку я часто сталкивался с написанием программ на контроллеры AVR и Microchip – я выбирал между ними… Но дешевле и функциональнее оказался AVR. По быстродействию и нужному количеству выводов подошел ATMega16. Теперь о расчетах…
F max = 16000000Hz(Частота атмеги)
15 циклов берем на изменение аккумулятора фазы, выборку из LUT и вывод.
Итого Fclk=16000000Hz/15=1066666,6667Hz
Для необходимой точности выбрал 32-битный аккумулятор фазы.
Теперь вычислим минимальный шаг:
Step(Hz)= 1066666,6667Hz/(2^32)= 0,0002483526865641276041667(Hz)
Код самого генератора:
while (1){ 
          
            #asm 
                        ADD  R1,R6
                	ADC  R2,R7
                        ADC  R3,R8
                	ADC  R4,R9
            #endasm
PORTC=LUT_of_Signal[Phase_acc.Phase_acc_8bits_of_byte[3]];  

При 50000Гц сигнал за период будет образовываться ~21 сменой напряжений на выходе ЦАПа.
В качестве ЦАП я выбрал обычную R-2R матрицу – она не требует стробов и 8 бит вполне удовлетворяют условиям. Т.е. (|12|+|-12|) / 2^8 = 0,09375~ 0,1V
Максимум и минимум для расчета шага

Читать дальше →