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

  Рет қаралды 8,321

Mbs Electronics

Mbs Electronics

Күн бұрын

Пікірлер: 50
@MbsElectronics
@MbsElectronics Жыл бұрын
Донаты для канала: 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
@CREATOR_AVR
@CREATOR_AVR 4 ай бұрын
Подскажи пожалуйста как побороть джиттер(фазовое дрожание частоты). Есть 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
@ihtiandr9
@ihtiandr9 8 ай бұрын
как всегда все доступно и понятно .. нормальным человеческим языком
@akademiklime9266
@akademiklime9266 Жыл бұрын
Гениально маэстро! Лайк и подписка!
@safocl9768
@safocl9768 10 ай бұрын
2:05 -- а можно представить ассемблерный код, который будет быстрее работать чем сгенерированный компилятором?
@rmatveev
@rmatveev Жыл бұрын
А не рассматривали вариант PWM выход + двойной (или даже тройной) RC фильтр? Линейность лучше, компонентов меньше.
@SIM31r
@SIM31r Жыл бұрын
1:30 точность особо важна для старших разрядов резисторов, младшие особо не важны уже. Если есть куча резисторов, можно отобрать самые точные (одинаковые) в старшие разряды, а в младшие любые.
@iloverobotics113
@iloverobotics113 Жыл бұрын
Добрый день, Олег. Спасибо за интересное видео. Быть может вы знаете как подключить камеру к микроконтроллеру с радиомодулем и передать на другой микроконтроллер видеосигнал?
@gimeron-db
@gimeron-db Жыл бұрын
Из ардуинки напрашивается сделать синтезатор. Вместо потенциометра прикрутить линейку резисторов, под капотом частоту вычислить как 440 * 2^(K*R/12), а "инструменты" зашить в виде таблиц для синтеза сигнала. Для поддержки одновременного нажатия клавиш придётся усложнять клавиатуру и процедуру синтеза (считать сумму всех сигналов для каждой клавиши). Клавиатуру можно сделать матричную, только для каждой кнопке добавить по диоду, чтобы не было ложных срабатываний.
@SIM31r
@SIM31r Жыл бұрын
Уже есть такой музыкальный синтезатор, он очень сложный. Так как оптимизирован каждый бит и такт микроконтроллера, малейшая правка кода рушит всю программу вызывая непонятные глюки. Лучше такое делать на более мощных МК с математическим сопроцессором. Там останется место и для оптимизации и результат будет лучше.
@MbsElectronics
@MbsElectronics Жыл бұрын
Есть проект AVRSynth, на 16-й меге. В одном из след. роликов выложу про DDS генератор на mega8 там до 300 кгц, но DDS функция на ассемблере а компилятор не ардуино, другой. Ассемблерные вставки в GCC на кортом основан Ардуино - это вынос мозга. Для проектов на самостоятельных контроллерах я юзаю другой (платный) компилятор. Там можно писать на обычном ассемблере без этих двоеточий, амперсандов и пустых точек...
@electronic7979
@electronic7979 Жыл бұрын
Nice video
@gimeron-db
@gimeron-db Жыл бұрын
38:35 - Кажется, вместо goto можно было бы использовать простой бесконечный цикл for (;;) { ... }
@MbsElectronics
@MbsElectronics Жыл бұрын
можно попробовать по разному и сравнить быстродействие
@Johnny_0007
@Johnny_0007 5 ай бұрын
Надо вычислять фазовую прибавку не в самом цикле, а в обработке прерывания ацп. Зачем ее каждый раз перевычислять? Один раз вычислили в прерывании,записали в переменную и все. А цикле просто прибавляете готовую переменную. Тогда цикл будет работать гораздо быстрее
@goldirus
@goldirus Жыл бұрын
работа алгоритма понятно. Но из неё следует, что чем выше частота, тем ниже сигнал становиться похож на оригинал (синусоиду). Тоже собственно и при снижении частоты ниже исходной
@SIM31r
@SIM31r Жыл бұрын
При снижении частоты вроде нормально всё, осциллограф просто не показал сразу синусоиду, так как интервал маленький был в настройках.
@MbsElectronics
@MbsElectronics Жыл бұрын
Естественно, так как при повышении частоты пропускаются отсчеты в таблице. Но это компенсируется ФНЧ на выходе.
@Johnny_0007
@Johnny_0007 5 ай бұрын
Более того, что будет, если при повышении частоты пропускаться будет больше четверти периода? А вообще лажа будет. А если период пропускаться будет, то вообще постоянка будет. И на полпериода постоянка будет. Лучше такие алгоритмы использовать только на понижение частоты
@AtlantisRouTou
@AtlantisRouTou Жыл бұрын
Офигеть, МБС перестал паузить между словами )
@goldirus
@goldirus Жыл бұрын
так и не понял как работает этот цап на делителя напряжения, и для чего использовать столько выходов
@MbsElectronics
@MbsElectronics Жыл бұрын
Про то как работает цап нужно делать отдельный ролик. Для данного же видео нужно просто принять тот факт что на выходе ЦАП мы имеем напряжение, пропорциональное двоечному числу в регистре порта D микроконтроллера
@MbsElectronics
@MbsElectronics Жыл бұрын
Можете погуглить на тему "Цифроаналоговые преобразователи (ЦАП) с суммированием токов"
@goodwill7643
@goodwill7643 Жыл бұрын
kzbin.info/www/bejne/f3XViKedicdmepY
@SIM31r
@SIM31r Жыл бұрын
тут длинная лекция kzbin.info/www/bejne/g4LIfGibmp2NnM0
@SIM31r
@SIM31r Жыл бұрын
@@MbsElectronics несколько часов назад вышел ролик, Ютуб в рекомендации вывел, сумматор на резисторах: kzbin.info/www/bejne/ioGvcn1rfruBe7s
@antisoveticus
@antisoveticus Жыл бұрын
Простой хитроумный - это оксюморон.
@ВалерийХаритонов-д9я
@ВалерийХаритонов-д9я Жыл бұрын
В следующем видео надо будет прикрутить сюда однобитный ЦАП
@SIM31r
@SIM31r Жыл бұрын
@@R1CBU в динамике там сложно всё. Синусоида может по фазе поплыть и т.п. Можно и комбинировать дельта преобразователь и R-2R, чтобы точность повысить.
@R1CBU
@R1CBU Жыл бұрын
@@SIM31r почему она поплывет если фазу считать правильно, изменяя только ее приращение. Ну и небольшой oversample не помешает.
@SIM31r
@SIM31r Жыл бұрын
@@R1CBU ну если нужно от 0 до максимального уровня быстро фронт сделать, дельта-сигма не сможет, будет плавно поднимать напряжение, что аналогично сдвигу по фазе выходного сигнала. Для медленных сигналов да, всё хорошо будет.
@MbsElectronics
@MbsElectronics Жыл бұрын
Случайно удалил здесь чей-то интересный комментарий, хотел ответить, нажал не на ту кнопку... Там было про PWM. Можно его использовать, но там свои проблемы с быстродействием и т.д. Все современные промышленные генераторы используют DDS как самый точный метод установки частоты.
@MbsElectronics
@MbsElectronics Жыл бұрын
У простых DDS синтезаторов вроде этого есть проблема с дрожанием фазы. Это легко проследить, если посмотреть как он пропускает ячейки таблицы (либо по несколько раз выводит одну и ту же на низких частотах). С этим приходится мириться. Там где важна высокая стабильность фазы, такой генератор применять нельзя.
@donatasf9496
@donatasf9496 Жыл бұрын
Вместо потенциометра конечно, и проще и лучше энкодер влупить..... есть библиотека GyverEncoder, работает очень хорошо - проверено....
@MbsElectronics
@MbsElectronics Жыл бұрын
Конечно, но потенциометр бесплатно. И можно поупражняться в прерываниях от АЦП. Вообще можно хоть две кнопки использовать
@Olaf72KOG
@Olaf72KOG Жыл бұрын
Простите? А зачем искать в интернетах таблицу для синусоиды если можешь посчитать ее сам? Более того можешь посчитать любую функцию.
@MbsElectronics
@MbsElectronics Жыл бұрын
Всё уже посчитано за нас)
@MbsElectronics
@MbsElectronics Жыл бұрын
Конечно можно было бы рассчитать массив в начале работы программы. Но зачем тратить память контроллера, если есть готовая.
@Olaf72KOG
@Olaf72KOG Жыл бұрын
@@MbsElectronics я про дельфийский вариант. И ещё, таблицу на Дельфи позволить редактировать, и тогда можно dds произвольной формы, передавая массив в ардуинку через ком. Из предопределенных пилы, шумы, Син с крутилкой, квадрат с двумя крутилками (ШИМ), правда не знаю что с ним на звуковом диапазоне делать, но в качестве примера, более чем. Эмм, спасибо большое за Ваш труд. С уважением и благодарностью.
@R1CBU
@R1CBU Жыл бұрын
А можно вообще не считать таблицу, а пользоваться CORDIC и считать на лету. Для DDS самое то.
@Olaf72KOG
@Olaf72KOG Жыл бұрын
​@@R1CBU На восьмибитной атмеге в Си есть сдвиг ствола? или уйдем в асм? Кордик для квадрата в первой итерации и для сина в 4-5. а для остального все равно массив? Но вопрос целесообразности не в этом. Практически большинство дешевых DDS предлагают захардкодженные синусоиду, пилу, квадрат, белый и розовый шум, шахматку и полоску для тв. Зачем что то вычислять? ИМХО Прикольно в связке с компом на компе готовить массив а на адуинке генерить. Прошивка для ардуинки в таком раскладе должна быть весьма простой. а значит место под массив будет более чем достаточным. Вопрос в производительности ардуинки и точности R2R реализации.
LM3886 Mono Board Unboxing
5:08
Boknoy Naruto
Рет қаралды 1 М.
99.9% IMPOSSIBLE
00:24
STORROR
Рет қаралды 31 МЛН
My scorpion was taken away from me 😢
00:55
TyphoonFast 5
Рет қаралды 2,7 МЛН
BAYGUYSTAN | 1 СЕРИЯ | bayGUYS
36:55
bayGUYS
Рет қаралды 1,9 МЛН
ATtiny26 - новый король бомж самоделок?
10:40
Заметки Ардуинщика
Рет қаралды 333 М.
Вольтметр  INA226 , просто ФАНТАСТИКА !!!!!
6:45
Ідея Інженера
Рет қаралды 71 М.
Крутейший генератор сигналов на Arduino!
13:24
Заметки Ардуинщика
Рет қаралды 152 М.
🤖Я в шоке! ChatGPT пишет Arduino проекты
28:24
3D Printed Back Horn Speakers + Aiyima Speakers. How Do They Sound?
24:56
99.9% IMPOSSIBLE
00:24
STORROR
Рет қаралды 31 МЛН