Тема: Arduino
Показать сообщение отдельно
Старый 01.02.2017, 20:16   #55
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: Статика

Сообщение от L-ee-X Посмотреть сообщение
ШИМ можно написать и программный, если нет аппаратного. И прикрутить его к любой ноге.

Где то видео видел тип управлял 760 светодиодами на атмеге 16 вроде бы вот это да, я даже боюсь на код взглянуть)))
И получится у тебя либо низкая разрядность, либо стробоскоп, либо не останется тактов на выполнение другой полезной работы. И если для всяких мигалок это ещё может сгодиться (мне приходилось делать программный ШИМ, например, на 12 каналов для гирлянды), то для чего-то вроде воспроизведения звука или регулировки яркости светодиодного освещения это никаким образом не применимо.

В большинстве микроконтроллеров AVR 8-битный ШИМ работает максимум на 62.5 килогерц. Согласно википедии в усилителях D класса используется ШИМ на частоте 500 килогерц, но я подозреваю, что бывает и больше. Если реализовать программный ШИМ, то частота будет в разы меньше 62.5 килогерц. Ну а если вспомнить рекомендации товарища Найквиста, то мы поймём, что максимальная частота воспроизводимого звука будет в два раза ниже, чем частота дискретизации (а частота дискретизации не может быть выше, чем частота ШИМ, в идеале частота ШИМ должна быть в разы выше). И в итоге мы не получим никаких стандартных 44100 герц дискретизации, да даже 8000 герц не получим!

В предыдущем посте я упоминал микроконтроллер ATtiny85 (есть варианты: ATtiny25/45/85), в котором есть уникальная фича (среди микроконтроллеров Atmel по крайней мере) умножения частоты. Это позволяет использовать восьмибитный ШИМ на частоте 250 килогерц, что уже теоретически может дать неплохое качество воспроизведения звука. Чтобы не быть голословным, вот вам таблица:


извиняюсь за качество, хостинг картинок такой

В самой последней колонке находим разрешение 8 полных бит, а в самой левой колонке смотрим частоту.

Но у этого микроконтроллера проблема в том, что несмотря на умножитель частоты, он урезан по всем остальным фронтам: он восьмивыводной, пинов катастрофически ни на что не хватает, нет аппаратного SPI. Я не понимаю, почему Atmel не реализовал эту фичу в популярных моделях ATmega, наверно, здесь скрывается какой-то маркетинг.

Но на самом деле, как показывают мои эксперименты, даже частота 62.5 килогерца обеспечивает очень приличный звук, который сгодится для многих целей. А на дешёвых колонках я даже разницу особо не услышал между внешней звуковухой саундбластер и ШИМом AVR (подробности ниже).

Но есть нюанс.

8-битный звук звучит очень паршиво, тут дело уже не в ШИМ, а просто в потере информации об амплитуде. Можно увеличить разрядность путём уменьшения частоты ШИМ, но на каждый выигранный бит разрядности мы теряем в частоте вдвое. Мы не можем себе позволить потерять в частоте даже в два раза, так как 62.5 / 2 = 31.25 килогерц, а это меньше стандартных 44.1 (а ведь мы стремимся хотя бы к минимальным стандартам).

Поэтому можно использовать два ШИМ канала для теоретического увеличения разрядности вдвое! На практике невозможно добиться точного 16-битного звука из-за существующего сопротивления переходов выходных ключевых транзисторов внутри микроконтроллера, разброса параметров и прочего несовершенства этого мира, но тем не менее при помощи многооборотного подстроечного резистора мне удалось получить достаточно чистый звук без артефактов, пусть с точностью не в 16 бит, но по крайней мере в 13-14 я так думаю.

Вы думаете, что это всё? Нифига подобного, если разогнать микроконтроллер путём подключения внешнего генератора или заменой резонатора эдак на 24-25 мегагерц, то получится реализовать 1613(14)-битный стерео звук! Кроме того таким образом ещё и частота ШИМ увеличится в полтора раза. Жаль у меня ATmega стабильно не заработала на 25 мегагерц. Возможно с внешним генератором вышло бы лучше, но не хочется плодить сущности. Тем более стерео звук мне пока не нужен. Поэтому эти эксперименты я пока отложил.

В соседней теме я рассуждаю о том, что хочу попробовать воспроизводить звук ЦАПом MCP4725. Он дешёвый, но 12-битный. В этом варианте я вижу плюсы в том, что не потребуется точная настройка конечного устройства по сравнению с двумя 8-битными ШИМ каналами, и кроме того здесь вообще не будет ШИМ, а значит не нужно фильтровать несущую частоту, да и настоящий ЦАП - это всегда лучше, чем ШИМ.

Начинал пост как ответ, а в итоге почти статья получилась.
(Offline)
 
Ответить с цитированием