Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Low Cost воспроизведение звука на паре выходов PWM
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
GetSmart
Хочу поделиться идеей воспроизведения звука на процессоре почти без аналогового тракта. Может уже где-то было. Класс D. Полный мост. У NXP CM0/CM3 и на других линейках есть таймеры с 4-мя MATCH регистрами. На две ножки процессора можно вывести два MATCH-сигнала в режиме PWM, работающих в противофазе от некоторого центра периода. Ещё один MATCH-регистр задаёт период PWM. И ещё один задаёт задержку входа в прерывание таймера для оптимальной позиции перезагрузки двух MATCH-регистров - перед самым обнулением счётчика таймера. Прерывание, конечно же, пишется на ассемблере. Работающих в противофазе это, например, когда при выводе сэмпла, равного 0 будет PWM1=X, PWM2=X, где X примерно половина периода. То есть переключение выходов будет одновременно и в середине и в конце периода. При выводе сэмпла, равного 1 будет PWM1=X+1, PWM2=X. При выводе сэмпла, равного -1 будет PWM1=X-1, PWM2=X. При выводе сэмпла, равного 2 будет PWM1=X+1, PWM2=X-1. При выводе сэмпла, равного -2 будет PWM1=X-1, PWM2=X+1.

Принципиальная схема:
к ножкам MATCH подключаётся (ключевой) драйвер на нужное напряжение, а между парой выходов драйвера - один или два LC-фильтра последовательно, и далее громкоговоритель. Громкость регулируется программно.
zltigo
QUOTE (GetSmart @ Dec 4 2016, 13:57) *
Хочу поделиться идеей воспроизведения звука....

Идея, как идея. Класс D сами-же написали. Ничего необычного. Тут имеет стоимость конкретная реализация. Если сделаете реализацию моноканала ватт на 25-50 в речевом диапазоне, то можем поговорить о стоимости sm.gif. Хотя, пожалуй сначала устроит и "линейный выход" нагруженный на трансформатор.

Сергей Борщ
QUOTE (GetSmart @ Dec 4 2016, 14:57) *
Прерывание, конечно же, пишется на ассемблере.
Ужас. А что, разве у NXP CM0/CM3 нет буфера на регистры сравнения и обновления рабочих регистров из буфера по событию переполнения?
Ydaloj
в чём преимущество по отношению к ШИМ-2, которая на одном выходе?
ноль - открыта одна диагональ моста
единица - другая диагональ
скважность =2 - диагонали работают попеременно, нет звука
GetSmart
Цитата(zltigo @ Dec 4 2016, 16:23) *
Ничего необычного. Тут имеет стоимость конкретная реализация.

Это же лазер полный мост. При одинаковом питании и сопротивлении нагрузки - выходная мощь выше в 4 раза. Относительно класса D на одном PWM-выходе. Но из-за полного моста динамик нежелательно (из-за ЭМИ) далеко располагать от выходных ключей. И эта схема не для т.н. линейного выхода, а для управления относительно мощной нагрузкой с предельно высоким КПД. Стоимость схемотехники как раз минимальна.
zltigo
QUOTE (GetSmart @ Dec 4 2016, 15:28) *
И эта схема не для т.н. линейного выхода, а для управления относительно мощной нагрузкой с предельно высоким КПД.

Я же написал "сначала устроит" - так сказать для отработки идеи. А про уровень мощности, которая интересует, тоже уже писал. Но для мощи надо уже уже реализовывать и защиты, ибо голые ключи для реальной жизни негодны. Простота резко уменьшится sad.gif
Alexashka
Искажений будет целый вагон. Посмотрите область применения класса Д - это сабвуферы, т.е частоты на порядки ниже частоты ШИМ.
А в усилителях в интегральном исполнении применяются различные методы для снижения КНИ, как например ООС.
А так достаточно одного канала ШИМ, второй получается в противофазе обычным драйвером MOSFET, т.е берется двухканальный драйвер, один канал у которого прямой, другой инверсный (вы ведь не предполагаете качать MOSFET напрямую ножкой контроллера?)
zltigo
QUOTE (Alexashka @ Dec 4 2016, 17:37) *
Посмотрите область применения класса Д - это сабвуферы.

Да ну? sm.gif. Значит, например, у меня в машине один сплошной сабвуфер на 605W JBL впихнул sm.gif, а про 7.1 и 14 динамиков наврал sm.gif
Ydaloj
zltigo, +1. У известной IRS2092 тактовая частота 800кГц, она весь звуководй диапазон с лёгкостью переплюнет
Alexashka
Цитата(Ydaloj @ Dec 4 2016, 22:35) *
У известной IRS2092 тактовая частота 800кГц, она весь звуководй диапазон с лёгкостью переплюнет

Ну ок. Только у него способ формирования ШИМ несколько иной - аналоговый, и охвачен глубокой ООС. Да и я бы не ставил его в ряд с усилителями Hi-Fi класса, ну да на 1кГц уровень искажений довольно низкий 0,01%, но вот что там на 20кГц производитель скромно умалчивает rolleyes.gif

Да и по реализации...никаких ассемблерных вставок не должно быть. Это сразу на порядок (если не на 2) увеличит КНИ и С/Ш. Делается это через DMA и регистры автоматической перезагрузки, тогда все времена будут жесткими, т.к перезагрузка будет происходить сразу после переполнения таймера.
AlexandrY
Цитата(Alexashka @ Dec 5 2016, 08:39) *
Да и по реализации...никаких ассемблерных вставок не должно быть. Это сразу на порядок (если не на 2) увеличит КНИ и С/Ш. Делается это через DMA и регистры автоматической перезагрузки, тогда все времена будут жесткими, т.к перезагрузка будет происходить сразу после переполнения таймера.


Какие-то прерывания все равно будут. Ассемблер только не сильно поможет.
Я бы уже думал над фазовым ругилированием многканальных PWM. Чтобы делать направленный звук.
Скажем 8-мь динамиков и отслеживать слушателя по сигналу Bluetooth с его смартфона. biggrin.gif
jcxz
Цитата(Сергей Борщ @ Dec 4 2016, 15:46) *
Ужас. А что, разве у NXP CM0/CM3 нет буфера на регистры сравнения и обновления рабочих регистров из буфера по событию переполнения?

Не знаю какой NXP имеется в виду автором, но у LPC17xx вполне себе есть DMA, принимающий события от таймеров. Вероятно просто ТС "не умеет его готовить"... wink.gif
В таких задачах - это самое то - заранее просчитать последовательность необходимых значений, сложить в буфер DMA и спокойно заниматься другими полезными делами, вместо того чтобы дёргаться в прерываниях.

Цитата(AlexandrY @ Dec 5 2016, 10:20) *
Какие-то прерывания все равно будут. Ассемблер только не сильно поможет.

Их будет на порядки меньше.
Всё что можно делать пакетно, надо делать пакетно. А дёргаться в прерываниях только чтобы загружать данные в регистры периферии - это подход сродни реализации интерфейсов методом ногодрыга.
Это лучший способ угробить производительность ARM-ов до уровня какого-нить AVR.
Jenya7
как раз сегодня прочитал это.
iosifk
Цитата(GetSmart @ Dec 4 2016, 14:57) *
Хочу поделиться идеей воспроизведения звука на процессоре почти без аналогового тракта. Может уже где-то было. Класс D. Полный мост. ...

Принципиальная схема:
к ножкам MATCH подключаётся (ключевой) драйвер на нужное напряжение, а между парой выходов драйвера - один или два LC-фильтра последовательно, и далее громкоговоритель. Громкость регулируется программно.


Давайте посчитаем...
"один или два LC-фильтра последовательно" дадут наклон АЧХ либо -40 либо -80 дб/дек. Это значит, что для того чтобы подавить частоту квантования в 1000 раз нам нужно иметь 60 дб. Это значит что "по горизонтали" нам надо иметь пару декад. Да, еще неплохо учесть "горбик", который даст LC-фильтр... Чтобы на него не попасть.. И чем лучше добротность, тем этот горбик больше... Так вот, сколько там процессор сможет дать период у ШИМ? Если тактовая счетчика 50 Мгц (я точно не знаю, пусть хоть так), то при 1 % ошибки это будет 127 или 7 разрядов... А реально наверное, что регистры имеют 8 разрядов... Следовательно период ШИМ - не лучше чем 5 Мгц, а на самом деле и наверняка не будет выше 1 Мгц. Тогда от этого отступаем влево 2 декады - получим 10 Кгц, это то, что пройдет через фильтр без подавления.... Правда можно наверное программно делать подъем высоких частот...
GetSmart
Цитата(zltigo @ Dec 4 2016, 17:50) *
Но для мощи надо уже уже реализовывать и защиты, ибо голые ключи для реальной жизни негодны. Простота резко уменьшится sad.gif

У меня пока предохранитель по питанию стоит. Не знаю, надо ли усложнять. Динамик рядом. От КЗ защитит предохранитель, а от обрыва ничего не надо. Защищать не ключи надо, а динамик, - от постоянки. Это если лоукостить даже на ёмкости последовательно с динамиком )))

Упд.
Хотя, для защиты от обрыва тоже паралельно ёмкости в LC-фильтре нужно что-то ставить. Резисторы, супрессор или что-то ещё.
Для мощных схем актуально иметь какой-то детектор обрыва.
zltigo
Цитата(GetSmart @ Dec 10 2016, 05:58) *
У меня пока предохранитель по питанию стоит.

Предохранители защищают только от пожара.
Цитата
Не знаю, надо ли усложнять.

А что, есть какой-то результат?
Rst7
QUOTE (iosifk @ Dec 8 2016, 13:45) *
Давайте посчитаем...


Ну это если пролезание частоты дискретизации сильно вредит здоровью. На обычный динамик пусть лезет, все равно не воспроизведет.
Ydaloj
воспроизвести не воспроизведёт, но катушку звуковую погреет точно.

Приблизительные расчёты от iosifk можно с такой же приблизительностью подвинуть в сторонку, и перекрыть тем самым всю полосу до 20кГц.
Rst7
QUOTE (Ydaloj @ Dec 10 2016, 19:07) *
воспроизвести не воспроизведёт, но катушку звуковую погреет точно.


Не погреет в силу индуктивного характера нагрузки на ВЧ.
Ydaloj
ну да, конечно, катушки плавятся только так

у катушек слишком маленькая индуктивность
Rst7
QUOTE (Ydaloj @ Dec 10 2016, 21:38) *
ну да, конечно, катушки плавятся только так

у катушек слишком маленькая индуктивность


Да, пожалуй для ВЧ-драйверов актуально. Прикидочный расчет показывает, что для среднепотолочного драйвера с эквивалентным сопротивлением 500ом на частоте 500кГц (ну пусть будет такая частота ШИМа) для усилителя с мощностью в 1кВт отсутствие фильтрации несущей приведет к рассеиванию где-то 15-20Вт на драйвере. Это много, все таки один LC фильтр снимет вопрос полностью, подавив несущую, скажем, на 40дБ (это всего 1.5-2мВт останется).
Plain
Процессор, к нему аж на высшем приоритете два синхронных драйвера, к ним четыре транзистора, к ним защита на россыпи, и т.д. — реально каша из топора, но третьесортная, потому как частота никакая.
GetSmart
На 50 мипсах можно сделать частоту ШИМ = 300 кгц и более. Точнее, частоту перезагрузок двух MATCH-регистров.
Plain
Если речь об озвучке чего-то стандартного, типа 48 ksps, то эту "частоту ШИМ" выдавать интерполятору — вот его прикиньте в MIPS'ах.
GetSmart
48 кгц, 16 бит, hi-fi — в этой теме не об этом. Тема о лоукост, полный мост, "предельно высоким КПД" и можно ещё райл-ту-райл. Под управлением микроконтроллера.

Критиков класса D прошу отойти в другую ветку.
Rst7
Да в общем-то нет проблем с 16ю битами с 48к. Сигма-дельта второго порядка и вот уже подавление шумов квантования 40дБ/декада. Сам по себе 8-бит шим - это -48дБ, да еще, скажем, 500кГц/20кГц=-42дБ, всего -90. Вполне себе хайфай.
Corner
Давайте посчитаем...
Чтобы получить 8 бит, нужно иметь частоту ШИМ не более 1/256 от частоты тактирования модуля ШИМ. Для 50 МГц контролера это порядка 200 кГц. Специальные МК для этих целей в расчет не берем - уже не лоукост. Если берем, то есть семейства с частотой тактирования ШИМ до сотен МГц.
Чтобы отфильтровать частоту ШИМ от 20 кГц на 80 дБ требуется фильтр 4 порядка в теории и, реально 5 на практике, чтобы корректировать нелинейные искажения на лету.
Alexashka
Кстати есть простой способ как из 8 бит сделать 10 sm.gif
1 лишний бит получается благодаря тому, что мы управляем полным мостом, т.е по сути у нас 2 независимых канала управления.
2 лишний бит получаем за счет добавления псевдослучайной последовательности.
GetSmart
Шум в слышимой полосе даже в младшем бите будет неприятен и неоптимален. Если мипсы некуда девать, то лучше сделать аналог сигма-дельта модуляции младшего бита, через суммирование ошибки округления в каждом сэмпле.

По какчеству уточню: на 10 мипсах получалось 44К * 9 бит и при этом половина мипсов оставалась для других дел. Это без сигма-дельта наворотов. На 45 мипсах можно иметь 44К * 11 бит и 40 мипсов для других дел.
Слесарь
Иметь хоть малую часть аналогового тракта уже как-то неприлично, покупали как-то лет пять тому назад недорогой музыкальный центр с выходом по 100 Вт на канал, после того как мне понравилось его звучание я решил и себе сделать что-то подобное, в решении этого центра ничего аналогового от считывателя блю-рей, до выходного чипа УМ, не нашел. Между центральным процем и платой с чипами УМ передавалась цифра.
Alexashka
Цитата(GetSmart @ Jan 11 2017, 15:03) *
Шум в слышимой полосе даже в младшем бите будет неприятен и неоптимален.

А Вы шум от квантования не слышите?
А он есть sm.gif

Цитата
Если мипсы некуда девать, то лучше сделать аналог сигма-дельта модуляции младшего бита, через суммирование ошибки округления в каждом сэмпле.

Да, да, именно так там и делается...
GetSmart
Напишуздесь. чтобы не создавать микротему.

Однотактный ногодрыг на LPC111x. На других линейках не работает, т.к. юзает оригинальную особенность GPIO LPC111x.
Не прерывается прерыванием. Можно дрыгнуть одновременно несколько ножек, кроме нулевого пина порта (до 11-ти одновременно), хоть в противофазе.

Код
r0 = адрес GPIO_MASK_ACCESS[]
stmia    r0,[r1,r2]


Второе обращение к памяти будет по адресу с установленным битом 0-ого пина выбранного порта GPIO. Это надо учитывать, если этот пин работает на выход в режиме GPIO.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.