Я прочел о цифровом синтезе из википедии, но толком ничего непонял. Каким образом возможно получать сигнал синуса, треугольника, пилы из прямоугольника? Хочу попробовать сделать его на микроконтроллере. Не могли бы вы помочь в объяснении как он работает?
Добавлено after 1 hour 55 minutes 16 seconds:
Как я понял, есть два источника частоты. Опорная частота - постоянна. И частота приращения фазы. Получается что значение амплитуды сигнала будет формироваться с частотой приращения фазы, а так же она будет формироваться на опорной частоте, я правильно понял? Например у нас есть ШИМ генератор импульсов на 10 кГц, он будет опорным, то есть его частота не меняется, но может изменяться длительность импульсов. Второй генератор настраиваемый, его частота меняется от 0 до 10 Гц. Получается что если я буду задавать ширину импульсов ШИМ генератора вторым генератором (возьмем 5 Гц) по определенному закону, то выходной сигнал будет представлять собой ШИМ частотой 10 кГц, с изменяющейся длительностью импульсов равной 5 Гц?
Каким образом работает DDS?
-
izolenta1801
- Родился
- Сообщения: 10
- Зарегистрирован: Вт июн 04, 2019 09:35:37
- Реклама
- B@R5uk
- Собутыльник Кота
- Сообщения: 2896
- Зарегистрирован: Сб ноя 13, 2010 12:53:25
- Откуда: приходит весна?
Re: Каким образом работает DDS?
DDS расшифровывается Direct Digital Synthesis и переводится как прямой цифровой синтез. Это означает, что синтезируемый сигнал сначала рассчитывается в цифровом виде, а потом сразу же преобразуется в аналоговую форму с помощью быстродействующего ЦАП. Как правило, когда говорят о DDS, то подразумевают частоты синтезируемого сигнала в десятки и сотни МГц, а частоту дискретизации ЦАП порядка ГГц. Разумеется, на таких частотах о ШИМ никакой речи быть не может.
Если я правильно понял ваш вопрос, то вы хотите сделать низкочастотный генератор с регулируемой частотой 0-10 Гц, причём в качестве АЦП использовать ШИМ на 10 кГц с фильтрацией. Всё верно? Если да, то тогда уточните, хотите ли вы это делать это на МК, на цифровой рассыпухе или же ещё как-то?
Если я правильно понял ваш вопрос, то вы хотите сделать низкочастотный генератор с регулируемой частотой 0-10 Гц, причём в качестве АЦП использовать ШИМ на 10 кГц с фильтрацией. Всё верно? Если да, то тогда уточните, хотите ли вы это делать это на МК, на цифровой рассыпухе или же ещё как-то?
-
izolenta1801
- Родился
- Сообщения: 10
- Зарегистрирован: Вт июн 04, 2019 09:35:37
Re: Каким образом работает DDS?
Да все верно, хочу попробовать написать программу DDS синтезатора на микроконтроллере Atmega328. Я не прошу какого либо кода, я бы просто хотел бы узнать принцип работы подобного рода синтезатора, алгоритм, по которому он работает. Как я знаю самый популярный метод DDS синтеза на МК - табличный метод. И на этом мои знания оканчиваются.
- B@R5uk
- Собутыльник Кота
- Сообщения: 2896
- Зарегистрирован: Сб ноя 13, 2010 12:53:25
- Откуда: приходит весна?
Re: Каким образом работает DDS?
Ну так освойте потихоньку работу с таймерами в МК. Разберитесь как работать с ШИМ, научитесь выдавать синус фиксированной частоты для начала. Если нужно управление частоты кнопками, то нужно научиться без ошибок считывать нажатие. Если ещё хотите, чтобы генератор отображал частоту на семисегментнике, то почитайте, какие методы отображения есть. Самый сложный и эффективный — это динамическая индикация. Когда отработаете и отладите все эти технические решения, то можно будет скомпоновать их в единое устройство. Я просто не знаю ваш уровень: то ли советовать читать статейки в обучалке, то ли предложить что-то по-серьёзнее.
А вообще, вы не тот вопрос задали и не в той теме. У нас есть специальный раздел форума, посвящённый микроконтроллерам AVR. Советую заглянуть туда и поискать упомянутые мной темы.
Если хотите ШИМ в 10 кГц, выдающий синус фиксированной частоты в 5 Гц, то это действительно легко сделать таблицей. Если сделать по одному отсчёту на каждый импульс ШИМ, то синус будет иметь 10 кГц / 5 Гц = 2000 отсчётов. В меге-328 16-битный таймер-1, который позволяет сделать ШИМ с настраиваемым периодом. Если вы будете использовать кварц частотой, например, 16 МГц, то длительность периода будет 16 МГц / 10 кГц = 1600 тактов. Это величина будет амплитудой табличного синуса. То есть вам надо воспользоваться формулой:
S[n] = round(1599 * (1 + sin(2 * п * n / 2000)) / 2), n = 0...1999
Чтобы построить таблицу синуса. Каждый элемент таблицы будет дву-байтным числом. Вся таблица займёт чуть меньше 4 КБ. Даже без всяких изощрений для сокращения её размера (а такие есть: отображение всего периода синуса первую четверть периода) эта таблица вместиться в ПЗУ МК.
Дальше всё просто: настраиваете таймер на ШИМ, включаете прерывание, и по прерыванию запихиваете в таймер каждый следующий элемент из таблицы.
А вообще, вы не тот вопрос задали и не в той теме. У нас есть специальный раздел форума, посвящённый микроконтроллерам AVR. Советую заглянуть туда и поискать упомянутые мной темы.
Если хотите ШИМ в 10 кГц, выдающий синус фиксированной частоты в 5 Гц, то это действительно легко сделать таблицей. Если сделать по одному отсчёту на каждый импульс ШИМ, то синус будет иметь 10 кГц / 5 Гц = 2000 отсчётов. В меге-328 16-битный таймер-1, который позволяет сделать ШИМ с настраиваемым периодом. Если вы будете использовать кварц частотой, например, 16 МГц, то длительность периода будет 16 МГц / 10 кГц = 1600 тактов. Это величина будет амплитудой табличного синуса. То есть вам надо воспользоваться формулой:
S[n] = round(1599 * (1 + sin(2 * п * n / 2000)) / 2), n = 0...1999
Чтобы построить таблицу синуса. Каждый элемент таблицы будет дву-байтным числом. Вся таблица займёт чуть меньше 4 КБ. Даже без всяких изощрений для сокращения её размера (а такие есть: отображение всего периода синуса первую четверть периода) эта таблица вместиться в ПЗУ МК.
Дальше всё просто: настраиваете таймер на ШИМ, включаете прерывание, и по прерыванию запихиваете в таймер каждый следующий элемент из таблицы.
-
izolenta1801
- Родился
- Сообщения: 10
- Зарегистрирован: Вт июн 04, 2019 09:35:37
Re: Каким образом работает DDS?
Спасибо, все что вы описали выше, про кнопки, семисегментники, динамическую индикацию на регистрах я уже встречал, на PROTEUS е эти вопросы так же решал успешно. Синус фиксированой частоты так же получилось вывести с шим выхода через RC фильтр. Меня больше удивило то что с помощью DDS синтеза можно добиваться большой точности частоты выходного сигнала, плюс его быстрая перестройка. На мк, как я знаю, можно получить только фиксированые частоты через делители. Причем чем выше частота, тем меньше точность. Но я обязательно забегу в раздел AVR.
- Реклама
- B@R5uk
- Собутыльник Кота
- Сообщения: 2896
- Зарегистрирован: Сб ноя 13, 2010 12:53:25
- Откуда: приходит весна?
Re: Каким образом работает DDS?
[uquote="izolenta1801",url="/forum/viewtopic.php?p=3654187#p3654187"]Меня больше удивило то что с помощью DDS синтеза можно добиваться большой точности частоты выходного сигнала, плюс его быстрая перестройка. На мк, как я знаю, можно получить только фиксированые частоты через делители. Причем чем выше частота, тем меньше точность.[/uquote]
А, тогда я не совсем правильно понял что вас интересует! Вся фишка в том, что делители частоты — это одно, а прямой синтез работает совсем на другом принципе. Хотя оба подхода к получению частоты в качестве гаранта точности этой частоты используют одно и то же: опорный кварцевый генератор. Стабильность кварцевого генератора высока (порядка 6 знаков) и может быть улучшена термостабилизацией.
Проблема обычных делителей частоты (в том числе тех, что находятся в МК) заключается в том, что их коэффициент деления должен являться целым числом. Это приводит к компромиссу: либо частота высокая, а шаг частоты грубый, либо, наоборот, шаг точный, а частота маленькая. В прямом цифровом синтезе эта проблема не возникает в связи с тем, что реально коэффициент деления частоты является дробным числом, поэтому нет никаких преград к уменьшению шага регулировки частоты.
Такую же систему, в принципе, можно было бы реализовать и для цифровых делителей частоты: в счётчики надо добавить некоторое количество дополнительных разрядов и инрементировать счётчик не на единицу каждый такт, а на некоторое фиксированное число. Технически это приведёт к замене счётчика-делителя на два регистра и сумматор. В одном регистре будет храниться величина инкремента, в другом — инкрементируемая величина, "цифровая фаза".
Для примера представьте себе 8-битный регистр инкремента хранит величину 201. Эта величина подаётся на цифровой сумматор, на этот же сумматор подаётся текущая величина цифровой фазы со второго регистра. Результат суммирования подаётся назад на второй регистр. По фронту сигнала с тактового генератора в 16 МГц второй регистр запоминает эту сумму, после чего на него с сумматора поступает уже следующая цифровая фаза, которая будет запомнена по фронту следующего тактового импульса. В результате за 2 ^ 8 = 256 тактовых импульсов сумматор переполнится 201 раз. Это будет означать, что результирующая частота получилась 16 МГц * 201 / 256 ≈ 12,56 МГц и шаг частоты будет 16 МГц / 256 ≈ 0,06 МГц. Если использовать не 8-битные регистры и сумматор, а, например, 24-битные, то шаг частоты будет 16 МГц / 2 ^ 24 ≈ 1.0 Гц. Эту процедуру, в принципе, не сложно реализовать на МК.
Однако, в отличие от прямого цифрового синтеза синусоидальных сигналов, описанная выше схема будет иметь один огромный недостаток: фронты результирующего цифрового сигнала будут синхронны с сигналом от тактового генератора. Это будет означать, что временные длительности единиц и нулей синтезируемого сигнала будут сильно отличаться в различные моменты времени. Этот недостаток цифрового сигнала называется джиттер. И для высоких частот, полученных способом, описанным выше, этот джиттер будет просто недопустимо огромным. Поэтому в таких случаях для синтеза цифрового сигнала произвольной частоты, привязанного к заданной опорной, применяют вспомогательный генератор с ФАПЧ. Ну или DDS с гигагерцовыми частотами дискретизации. Технически схема с ФАПЧ сложнее, но выходит дешевле в плане стоимости компонентов. DDS — это тяжёлая артиллерия.
Описанная проблема с джиттером не возникает в случае синтеза синуса. Вернее она там перерождается в другую проблему: шумы дискретизации по амплитуде и времени. Однако, реально это не вызывает каких-либо трудностей, поскольку после всякого АЦП всегда стоит ФНЧ, эти самые шумы фильтрующий.
А, тогда я не совсем правильно понял что вас интересует! Вся фишка в том, что делители частоты — это одно, а прямой синтез работает совсем на другом принципе. Хотя оба подхода к получению частоты в качестве гаранта точности этой частоты используют одно и то же: опорный кварцевый генератор. Стабильность кварцевого генератора высока (порядка 6 знаков) и может быть улучшена термостабилизацией.
Проблема обычных делителей частоты (в том числе тех, что находятся в МК) заключается в том, что их коэффициент деления должен являться целым числом. Это приводит к компромиссу: либо частота высокая, а шаг частоты грубый, либо, наоборот, шаг точный, а частота маленькая. В прямом цифровом синтезе эта проблема не возникает в связи с тем, что реально коэффициент деления частоты является дробным числом, поэтому нет никаких преград к уменьшению шага регулировки частоты.
Такую же систему, в принципе, можно было бы реализовать и для цифровых делителей частоты: в счётчики надо добавить некоторое количество дополнительных разрядов и инрементировать счётчик не на единицу каждый такт, а на некоторое фиксированное число. Технически это приведёт к замене счётчика-делителя на два регистра и сумматор. В одном регистре будет храниться величина инкремента, в другом — инкрементируемая величина, "цифровая фаза".
Спойлер
Однако, в отличие от прямого цифрового синтеза синусоидальных сигналов, описанная выше схема будет иметь один огромный недостаток: фронты результирующего цифрового сигнала будут синхронны с сигналом от тактового генератора. Это будет означать, что временные длительности единиц и нулей синтезируемого сигнала будут сильно отличаться в различные моменты времени. Этот недостаток цифрового сигнала называется джиттер. И для высоких частот, полученных способом, описанным выше, этот джиттер будет просто недопустимо огромным. Поэтому в таких случаях для синтеза цифрового сигнала произвольной частоты, привязанного к заданной опорной, применяют вспомогательный генератор с ФАПЧ. Ну или DDS с гигагерцовыми частотами дискретизации. Технически схема с ФАПЧ сложнее, но выходит дешевле в плане стоимости компонентов. DDS — это тяжёлая артиллерия.
Описанная проблема с джиттером не возникает в случае синтеза синуса. Вернее она там перерождается в другую проблему: шумы дискретизации по амплитуде и времени. Однако, реально это не вызывает каких-либо трудностей, поскольку после всякого АЦП всегда стоит ФНЧ, эти самые шумы фильтрующий.
- Вложения
-
- FreqGen.png
- (11.53 КБ) 293 скачивания
-
izolenta1801
- Родился
- Сообщения: 10
- Зарегистрирован: Вт июн 04, 2019 09:35:37
Re: Каким образом работает DDS?
Вот такое подробное объяснение мне и нужно было. Огромное вам спасибо.
- КРАМ
- Друг Кота
- Сообщения: 25387
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Каким образом работает DDS?
[uquote="B@R5uk",url="/forum/viewtopic.php?p=3654228#p3654228"]в отличие от прямого цифрового синтеза синусоидальных сигналов, описанная выше схема будет иметь один огромный недостаток[/uquote]
Добавлю.
Этот недостаток происходит от того, что спектр прямоугольного сигнала (меандра) уходит в область дискретизации, что делает невозможным отделить спектр связанный с процессом синтеза (комбинационные частоты сигнала и накачки) от собственно сигнала. Чем более узкий спектр у синтезируемого сигнала, тем проще выходным фильтром обеспечить подавление комбинационных частот.
По сути, синтезируемый синус произвольной частоты В ОБЩЕМ СЛУЧАЕ имеет плывущую фазу отсчетов относительно фазы синтезируемого синуса.
Добавлю.
Этот недостаток происходит от того, что спектр прямоугольного сигнала (меандра) уходит в область дискретизации, что делает невозможным отделить спектр связанный с процессом синтеза (комбинационные частоты сигнала и накачки) от собственно сигнала. Чем более узкий спектр у синтезируемого сигнала, тем проще выходным фильтром обеспечить подавление комбинационных частот.
По сути, синтезируемый синус произвольной частоты В ОБЩЕМ СЛУЧАЕ имеет плывущую фазу отсчетов относительно фазы синтезируемого синуса.


