ARDUINO КАК Работает DDS Генератор? Подробно об алгоритме DDS

แชร์
ฝัง
  • เผยแพร่เมื่อ 29 ก.ย. 2024
  • DDS генератор на Arduino Nanao. Прямой Цифровой Синтез
    Статья musbench.com/a...
    Самое подробное объяснение алгоритма DDS - Прямой Цифровой Синтез Аналоговых сигналов. Сегодня мы рассмотрим цифровой метод генерации аналоговых сигналов на примере генератора звуковой частоты на основе платы Arduino Uno. Данный генератор спроектирован в основном с целью демонстрации работы принципа работы DDS алгоритма. Прошивка написана исключительно на языке Си для Arduino без ассемблерных вставок. Тем не менее, даже этот простой генератор создает синусоидальный сигнал в диапазоне частот от нуля до 30 кГц, что перекрывает весь диапазон звуковых частот (более совершенный генератор на контроллере ATMegа с диапазоном до 300 кГц будет описан в одном из следующих видео.
    Донаты для канала: www.donational...
    Отличный DDS Генератор из Китая • UNI-T UTG932 FUNCTION ...
    -
    Bluetooth термометр на Arduino studio.youtube...
    Proteus 8 Visual Designer Серво мотор • Proteus 8 Visual Desig...
    Arduino в Proteus БЕЗ Кода! Часть 2 • Arduino в Proteus БЕЗ ...
    -
    Телеграм канал t.me/mbselectr... Чат канала t.me/mbs_electro
    Хороший 3D принтер s.click.aliexp...
    ABS Пластик для 3D печати s.click.aliexp...
    PLA Пластик для 3D печати s.click.aliexp...
    Мои Путешествия goo.gl/6JoHxh
    -
    Credits:
    ES_Abandoned City 5 - Merlean.mp3
    ES_Exotic Drones 2 - Gunnar Johnsйn.mp3
    from epidemicsound.com
    Licensed for Scalelab MCN partner

ความคิดเห็น • 50

  • @MbsElectronics
    @MbsElectronics  ปีที่แล้ว +1

    Донаты для канала: www.donationalerts.com/r/mrshanti
    Статья и все файлы к этому ролику musbench.com/all/dds-audio-generator-arduino/
    Телеграм канал t.me/mbselectronics Чат канала t.me/mbs_electro
    Хороший 3D принтер s.click.aliexpress.com/e/_Dk4KoTr
    ABS Пластик для 3D печати s.click.aliexpress.com/e/_DejvcFf
    PLA Пластик для 3D печати s.click.aliexpress.com/e/_Dkl6iZx
    Мои Путешествия goo.gl/6JoHxh

    • @полицию_тцк_на_фронт
      @полицию_тцк_на_фронт หลายเดือนก่อน

      Подскажи пожалуйста как побороть джиттер(фазовое дрожание частоты).
      Есть DDS генератор собран собственными руками, написана прошивка в Bascom-avr, генерация частоты и загрузка из таблицы на вставках ASM(для максимального быстродействия) весь принцип-алгоритм такой-же как у тебя в ролике. В ASM я не селен но дрожание частоты побороть не могу, облазил весь инет нет примеров на данную тему. Если делать генератор перебирая таблицу по таймеру то джиттера нет но частота падает вдвое. Ниже сама вставка генерации частоты и загрузки таблицы, может что-то подскажешь ! Заранее благодарю.
      dds:
      push r18
      push r19
      ;FOUT = M * (F_CPU/N_CLOCK)/(2^24)
      ;где F_CPU - тактовая частота процессора
      ; M - приращение фазы
      ;N_CLOCK - число машинных тактов за один проход цикла

      ;в регистр Z загружается адрес буфера в ОЗУ, содержащий таблицу одного периода генерируемого сигнала
      ;для правильной работы алгоритма адрес буфера должен быть выровнен на 0x100h, т. е. начинаться с 0xXX00h
      ;в данном случае буфер находиться по адресу 0x0100
      ldi zh, 0x01
      ldi zl, 0

      ;регистры r18, r19, zl составляют 24битный фазовый аккумулятора
      ;старшие 8 разрядов также являются адресом в таблице сигнала
      eor r18, r18 ;обнуление аккумулятора
      eor r19, r19 ;обнуление аккумулятора

      ;в регистрах r22, r23, r24 находиться 24битное значение приращения фазы - M
      1:
      add r18, r22 ;сложение аккумулятор со значением приращения фазы
      adc r19, r23 ;сложение аккумулятор со значением приращения фазы
      adc zl, r24 ;сложение аккумулятор со значением приращения фазы
      ld r0, z ;загрузка значения из таблицы по адресу zl
      out _SFR_IO_ADDR(R2RPORT), r0 ;вывод значения в ЦАП
      sbic _SFR_IO_ADDR(BTN_PIN), START ;условие для прерывания цикла,если кнопка нажата выходим
      rjmp 1b ;прыжок на начало цикла

      pop r19
      pop r19
      ret

  • @ЕвгенийВасенин-м7т
    @ЕвгенийВасенин-м7т 2 หลายเดือนก่อน

    Надо вычислять фазовую прибавку не в самом цикле, а в обработке прерывания ацп. Зачем ее каждый раз перевычислять? Один раз вычислили в прерывании,записали в переменную и все. А цикле просто прибавляете готовую переменную. Тогда цикл будет работать гораздо быстрее

  • @iloverobotics113
    @iloverobotics113 ปีที่แล้ว

    Добрый день, Олег. Спасибо за интересное видео. Быть может вы знаете как подключить камеру к микроконтроллеру с радиомодулем и передать на другой микроконтроллер видеосигнал?

  • @safocl9768
    @safocl9768 7 หลายเดือนก่อน

    2:05 -- а можно представить ассемблерный код, который будет быстрее работать чем сгенерированный компилятором?

  • @rmatveev
    @rmatveev ปีที่แล้ว

    А не рассматривали вариант PWM выход + двойной (или даже тройной) RC фильтр?
    Линейность лучше, компонентов меньше.

  • @antisoveticus
    @antisoveticus ปีที่แล้ว +1

    Простой хитроумный - это оксюморон.

  • @gimeron-db
    @gimeron-db ปีที่แล้ว +1

    38:35 - Кажется, вместо goto можно было бы использовать простой бесконечный цикл for (;;) { ... }

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว

      можно попробовать по разному и сравнить быстродействие

  • @goldirus
    @goldirus ปีที่แล้ว

    работа алгоритма понятно. Но из неё следует, что чем выше частота, тем ниже сигнал становиться похож на оригинал (синусоиду). Тоже собственно и при снижении частоты ниже исходной

    • @SIM31r
      @SIM31r ปีที่แล้ว

      При снижении частоты вроде нормально всё, осциллограф просто не показал сразу синусоиду, так как интервал маленький был в настройках.

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว

      Естественно, так как при повышении частоты пропускаются отсчеты в таблице. Но это компенсируется ФНЧ на выходе.

    • @ЕвгенийВасенин-м7т
      @ЕвгенийВасенин-м7т 2 หลายเดือนก่อน

      Более того, что будет, если при повышении частоты пропускаться будет больше четверти периода? А вообще лажа будет. А если период пропускаться будет, то вообще постоянка будет. И на полпериода постоянка будет. Лучше такие алгоритмы использовать только на понижение частоты

  • @goldirus
    @goldirus ปีที่แล้ว

    так и не понял как работает этот цап на делителя напряжения, и для чего использовать столько выходов

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว +1

      Про то как работает цап нужно делать отдельный ролик. Для данного же видео нужно просто принять тот факт что на выходе ЦАП мы имеем напряжение, пропорциональное двоечному числу в регистре порта D микроконтроллера

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว

      Можете погуглить на тему "Цифроаналоговые преобразователи (ЦАП) с суммированием токов"

    • @goodwill7643
      @goodwill7643 ปีที่แล้ว

      th-cam.com/video/IDrWtgTb3D4/w-d-xo.html

    • @SIM31r
      @SIM31r ปีที่แล้ว

      тут длинная лекция th-cam.com/video/MQeK5ee8Zfk/w-d-xo.html

    • @SIM31r
      @SIM31r ปีที่แล้ว

      @@MbsElectronics несколько часов назад вышел ролик, Ютуб в рекомендации вывел, сумматор на резисторах: th-cam.com/video/TPLAJ5IVNEY/w-d-xo.html

  • @electronic7979
    @electronic7979 ปีที่แล้ว +1

    Nice video

  • @akademiklime9266
    @akademiklime9266 ปีที่แล้ว +1

    Гениально маэстро! Лайк и подписка!

  • @ihtiandr9
    @ihtiandr9 5 หลายเดือนก่อน

    как всегда все доступно и понятно .. нормальным человеческим языком

  • @SIM31r
    @SIM31r ปีที่แล้ว

    1:30 точность особо важна для старших разрядов резисторов, младшие особо не важны уже. Если есть куча резисторов, можно отобрать самые точные (одинаковые) в старшие разряды, а в младшие любые.

  • @AtlantisRouTou
    @AtlantisRouTou ปีที่แล้ว

    Офигеть, МБС перестал паузить между словами )

  • @donatasf9496
    @donatasf9496 ปีที่แล้ว

    Вместо потенциометра конечно, и проще и лучше энкодер влупить..... есть библиотека GyverEncoder, работает очень хорошо - проверено....

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว +1

      Конечно, но потенциометр бесплатно. И можно поупражняться в прерываниях от АЦП. Вообще можно хоть две кнопки использовать

  • @gimeron-db
    @gimeron-db ปีที่แล้ว

    Из ардуинки напрашивается сделать синтезатор. Вместо потенциометра прикрутить линейку резисторов, под капотом частоту вычислить как 440 * 2^(K*R/12), а "инструменты" зашить в виде таблиц для синтеза сигнала.
    Для поддержки одновременного нажатия клавиш придётся усложнять клавиатуру и процедуру синтеза (считать сумму всех сигналов для каждой клавиши).
    Клавиатуру можно сделать матричную, только для каждой кнопке добавить по диоду, чтобы не было ложных срабатываний.

    • @SIM31r
      @SIM31r ปีที่แล้ว +1

      Уже есть такой музыкальный синтезатор, он очень сложный. Так как оптимизирован каждый бит и такт микроконтроллера, малейшая правка кода рушит всю программу вызывая непонятные глюки. Лучше такое делать на более мощных МК с математическим сопроцессором. Там останется место и для оптимизации и результат будет лучше.

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว +3

      Есть проект AVRSynth, на 16-й меге. В одном из след. роликов выложу про DDS генератор на mega8 там до 300 кгц, но DDS функция на ассемблере а компилятор не ардуино, другой. Ассемблерные вставки в GCC на кортом основан Ардуино - это вынос мозга. Для проектов на самостоятельных контроллерах я юзаю другой (платный) компилятор. Там можно писать на обычном ассемблере без этих двоеточий, амперсандов и пустых точек...

  • @ВалерийХаритонов-д9я
    @ВалерийХаритонов-д9я ปีที่แล้ว

    В следующем видео надо будет прикрутить сюда однобитный ЦАП

    • @SIM31r
      @SIM31r ปีที่แล้ว

      @@R1CBU в динамике там сложно всё. Синусоида может по фазе поплыть и т.п. Можно и комбинировать дельта преобразователь и R-2R, чтобы точность повысить.

    • @R1CBU
      @R1CBU ปีที่แล้ว

      @@SIM31r почему она поплывет если фазу считать правильно, изменяя только ее приращение. Ну и небольшой oversample не помешает.

    • @SIM31r
      @SIM31r ปีที่แล้ว

      @@R1CBU ну если нужно от 0 до максимального уровня быстро фронт сделать, дельта-сигма не сможет, будет плавно поднимать напряжение, что аналогично сдвигу по фазе выходного сигнала. Для медленных сигналов да, всё хорошо будет.

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว

      Случайно удалил здесь чей-то интересный комментарий, хотел ответить, нажал не на ту кнопку... Там было про PWM. Можно его использовать, но там свои проблемы с быстродействием и т.д. Все современные промышленные генераторы используют DDS как самый точный метод установки частоты.

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว

      У простых DDS синтезаторов вроде этого есть проблема с дрожанием фазы. Это легко проследить, если посмотреть как он пропускает ячейки таблицы (либо по несколько раз выводит одну и ту же на низких частотах). С этим приходится мириться. Там где важна высокая стабильность фазы, такой генератор применять нельзя.

  • @Olaf72KOG
    @Olaf72KOG ปีที่แล้ว

    Простите? А зачем искать в интернетах таблицу для синусоиды если можешь посчитать ее сам? Более того можешь посчитать любую функцию.

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว

      Всё уже посчитано за нас)

    • @MbsElectronics
      @MbsElectronics  ปีที่แล้ว

      Конечно можно было бы рассчитать массив в начале работы программы. Но зачем тратить память контроллера, если есть готовая.

    • @Olaf72KOG
      @Olaf72KOG ปีที่แล้ว

      @@MbsElectronics я про дельфийский вариант.
      И ещё, таблицу на Дельфи позволить редактировать, и тогда можно dds произвольной формы, передавая массив в ардуинку через ком.
      Из предопределенных пилы, шумы, Син с крутилкой, квадрат с двумя крутилками (ШИМ), правда не знаю что с ним на звуковом диапазоне делать, но в качестве примера, более чем.
      Эмм, спасибо большое за Ваш труд.
      С уважением и благодарностью.

    • @R1CBU
      @R1CBU ปีที่แล้ว

      А можно вообще не считать таблицу, а пользоваться CORDIC и считать на лету. Для DDS самое то.

    • @Olaf72KOG
      @Olaf72KOG ปีที่แล้ว

      ​@@R1CBU На восьмибитной атмеге в Си есть сдвиг ствола? или уйдем в асм?
      Кордик для квадрата в первой итерации и для сина в 4-5. а для остального все равно массив?
      Но вопрос целесообразности не в этом.
      Практически большинство дешевых DDS предлагают захардкодженные синусоиду, пилу, квадрат, белый и розовый шум, шахматку и полоску для тв.
      Зачем что то вычислять?
      ИМХО Прикольно в связке с компом на компе готовить массив а на адуинке генерить.
      Прошивка для ардуинки в таком раскладе должна быть весьма простой.
      а значит место под массив будет более чем достаточным.
      Вопрос в производительности ардуинки и точности R2R реализации.