Найти тему
Terrabyte

Воспроизведение звука на ATtiny13 или вызов для программиста - 2

Оглавление

Друзья, привет!

Новая мозголомная задача, которую буду решать сегодня - создание компактного устройства воспроизведения звуковых фрагментов на базе любимого мною микроконтроллера ATtiny13. Почему мозголомная? Да потому, что этот микроконтроллер (один из самых слабых в семействе Atmel) ни разу для этих задач не предназначен! Один килобайт памяти программ и 64 байта оперативной - какой звук! Тем интереснее будет поковыряться как с инженерными решениями, так и с программной поддержкой.

В прошлый раз я получил поистине колоссальное удовлетворение, решая задачу управления FM-микроприемником при помощи этого контроллера. Вот и сейчас, в предвкушении очередных сложностей я ощущаю особый инженерный зуд где-то в подкорке головного мозга. Значит, беремся за дело!

Поехали!

Да, будет много текста и фотографий. А в конце еще и архив с документацией и примеры работы!

Постановка задачи. Общие соображения

Для чего нужно воспроизводить звук? Хм... А действительно, для чего? Ну во-первых, разумеется, для инженерного самоудовлетворения (зудит, да). Во-вторых, потому, что простое решение для озвучивания игрушек и робототехнических поделок всегда должно быть под рукой. Шутка-ли, сейчас даже пылесосы разговаривают. А в-третьих, возможности "железа" раскрываются только, когда пытаешься выжать из них максимум. Так что пусть этот проект будет не только приятным и полезным, но и развивающим!

И так, задача - научить ATtiny13 воспроизводить звуковые фрагменты. Пусть, для начала, хотя бы один звуковой фрагмент.

Звук, аналоговый по своей природе, в цифровых устройствах представляется в виде последовательности оцифрованных отсчетов, получаемых при помощи аналогово-цифрового преобразователя (АЦП). Такой в ATtiny13 есть, но задействовать его мы не будем. Задачу записи, будем решать в рамках другого проекта (подписывайтесь, если интересно). Звук записать можно и на компьютере, при помощи микрофона. Мы же будем только воспроизводить. И первая задача, которую нужно будет решить - задача хранения звука.

Задача №1: Хранение звука. Для качественной записи звука в компьютере обычно используются следующие параметры его дискретизации: частота оцифровки - 44100 отсчетов в секунду или 44,1 кГц. Точность оцифровки - 16 бит (2 байта) на отсчет или 65536 уровней квантования сигнала. Такие показатели позволяют хранить звуковой сигнал с высокой точностью (качеством). Однако для хранения одной секунды звука потребуется 44100 * 2 = 88200 байт или более 86 килобайт памяти. В ATtiny13 этого и близко нет. Нужны внешние устройства хранения. В принципе, это не объем для современных чипов памяти, но вот насколько современные устройства памяти подходят к нашему слабому микроконтроллеру - вопрос! А еще и цену хотелось бы подешевле...

Задача №2: Воспроизведение звука. Для воспроизведения звука по цифровым отсчетам нужна обратная операция - цифро-аналоговое преобразование. (ЦАП). Такого устройства в контроллере нет. Значит, снова потребуется внешнее решение. Не много ли внешних решений для контроллера с 8-ю ножками из которых две - это питание? Ладно, тем интереснее!

Задача №3: Управление. Действительно, воспроизведением звука надо управлять, запуская проигрывание когда это нужно, а также выбирая нужный фрагмент из числа записанных в память. А для этого тоже нужны ножки для подач управляющих сигналов или чтобы кнопки повесить. Беда прямо с ножками-то выходит!

На фоне этих трех основных задач остальные, вроде вывода звука на динамик, кажутся тривиальными.

Решаем задачу хранения звука

Итак, в микроконтроллере звук хранить невозможно из-за его малой памяти. Судите сами. В памяти программ помещается лишь 1 килобайт, а выше мы говорили о десятках килобайт даже для хранения одной секунды звука! Значит, требуется внешний чип памяти.

Какую память выбрать? Сразу придется отклонить варианты с параллельной адресацией данных. Например, 28-ю или 79-ю серии электрически стираемых чипов памяти (EEPROM). Они, конечно же потенциально имеют большие объемы хранения и высокую скорость доступа к произвольной ячейке, но потребуют от контроллера не менее 20 выводов для задания адреса ячейки и управления логикой устройства, а то и более! Значит, автоматически приходим к памяти с последовательным интерфейсом. Здесь есть недорогие 24-я и 25-я серии EEPROM, широко использующиеся в цифровой технике и обладающие невысокой ценой. Последовательный же интерфейс доступа к ячейкам памяти резко сокращает количество ножек контроллера, необходимых для управления.

Между собой 24-я и 25-я серии отличаются, главным образом, протоколом последовательной передачи данных. 24-я использует протокол IIC (другое обозначение - I2C), а 25-я - протокол SPI. Первый - симплексный (возможна либо работа на передачу, либо на прием) с невысокой скоростью обмена, второй - дуплексный (можно одновременно передавать и принимать данные). Но, для нас главное отличие заключается в количестве линий интерфейса. Серия 24 (I2C-протокол), требует лишь 2 линии для обмена данными, тогда как 25-я потребует 4-х контактов микроконтроллера. Кроме того, дуплексный режим нам не особенно и нужен, а скорости интерфейса I2C должно, по-идее хватить для наших целей. Позже мы проверим это расчетами, а пока остановимся на этом варианте.

Теперь объем памяти. Здесь я сделаю два допущения. Первое - я не буду стараться запихнуть в память длинные семплы. Полагаю, что для многих случаев несколько секунд звука будет достаточно. Например, чтобы озвучить несколько слов, оживляющих робота, аплодисменты игровой консоли, или, скажем, "Вау" или "ма-ма" для игрушки. Второе допущение - не буду гнаться за Hi-End или Hi-Fi качеством.

С первым требованием все понятно. Меньше длина семпла - меньше памяти и дешевле чип. А вот что с качеством? Здесь так. Для передачи смысла речи вполне достаточно передать сигнал с верхней частотой 3 кГц. Чтобы передать такой сигнал потребуется частота дискретизации как минимум вдвое превышающая его верхнюю частоту (теорема Котельникова). Учитывая ряд допущений можно сказать, что разборчивый сигнал можно передать при частоте дискретизации 8 кГц. Что касается количества уровней квантования, то их снижение слабо сказывается на разборчивости, хотя и увеличивает уровень шумов. А что если хранить сигнал не в двухбайтовом слове а в однобайтовом (8 бит вместо 16-ти)? Тогда для хранения одной секунды звука понадобится 8000 байт. С этим справится, например, чип 24C08. Однако, 1 секунда - это совсем не серьезно, да и качество, наверное, хотелось бы повыше. Тем кто слышал разговоры радиолюбителей будет понятно, о чем я говорю.

Что если увеличить частоту дискретизации в 2 раза (16 кГц)? Тогда верхняя частота передаваемого диапазона теоретически увеличится до 8 кГц. Это уже неплохо, но, естественно, потребует вдвое больше памяти. Теперь для одной секунды потребуется чип 24C16. А еще больше? Что у нас там с доступными микросхемами?

Идем в известный магазин радиодеталей и обнаруживаем, что 24С512 стоит менее 80 рублей. Эта микросхема позволит хранить в памяти 65536 отсчетов сигнала, что при частоте дискретизации 16 кГц позволит хранить около 4-х секунд звука. Для многих целей достаточно! На этом чипе и остановимся.

Пару слов про реализацию I2C. Аппаратной поддержки этого интерфейса в ATtiny13 не предусмотрено. Стандартные же библиотеки занимают много памяти программ. Однако у меня уже есть опыт софтовой реализации этого протокола, который я получил при подключении OLED-дисплея и радиочипа RDA5807M к тому же микроконтроллеру. Там получилась упрощенная, но вполне функциональная версия протокола. Ею же и воспользуемся.

Решаем задачу воспроизведения звука

Сохраненный звук нужно воспроизвести. Для этого нам нужен цифро-аналоговый преобразователь. Простейший ЦАП - это набор взвешивающих резисторов. По конструкции просто, но при попытке его реализации в лоб мы сразу же столкнемся с необходимостью задействовать аж 8 выходов микроконтроллера. Ведь разрядность отсчетов сигнала, как мы договорились ранее, будет равна 8. Столько свободных ножек у нас нет! А что, если использовать ЦАП с передачей данных по последовательному интерфейсу. Например, по тому-же I2C. Такие ЦАП-ы в природе есть. Например, компактный MCP4725, примерно за 80 рублей, если покупать в Китае. Для подключения такого ЦАП нам не потребуются дополнительные ноги, поскольку по интерфейсу I2C можно параллельно подключить до 128 устройств. Значит всего лишь по 2-м ногам можно как передавать сигнал из памяти, так и выводить его на ЦАП!

Теоретически да. Однако, расчет скоростных характеристик показал, что не все так гладко. Дело в том, что исходя из периодичности отсчетов в 16 кГц и скорости передачи интерфейса I2C в 400 кГц (можно попробовать и больше, но гарантии работы без сбоев нет), получаем, что каждый отсчет сигнала по шине интерфейса можно передать максимум 400/16 = 25 бит информации. Нам при этом потребуется:

  • Установить адрес чтения (3 байта)
  • Считать по установленному адресу (2 байта)
  • Передать данные на ЦАП (2 байта)

Итого - 7 байт. С учетом того, что на каждый байт идет еще бит подтверждения получаем 7*(8+1) = 63 бита. Это потребует скорости интерфейса более 1 МГц! I2C устройства обычно на такое не рассчитаны. Как минимум, нужно повышенное напряжение питания. Нет, так не пойдет! Ищем другой путь.

Тут я вспомнил про усилители класса D. В этих усилителях выходной каскад работает в ключевом режиме под управлением (барабанная дробь) ШИМ-сигнала в который преобразован входной звук. Это выход! Ведь наш малыш ATtiny13 умеет формировать ШИМ на основе аппаратного таймера. А что, если мы будем считывать отсчет из памяти и использовать его для модуляции ШИМ-сигнала? Разрядность счетчика у нашего контроллера - 8 бит, но ведь и отсчеты мы договорились кодировать с такой же разрядностью. Значит преобразование будет без потерь. Останется лишь сделать выходной каскад для ключевого режима и установить фильтр нижних частот (ФНЧ) подобно тому, как это делается, в усилителях D-класса или регуляторах напряжения. Правда частота ШИМ сигнала в этих усилителях доходит до нескольких Мегагерц и может быть легко отфильтрована. Такой роскоши мы себе вряд ли сможем позволить. Максимум - частота дискретизации. Но, поскольку и эта частота (16 кГц) находится за пределом слуха обычного человека, то ничего страшного произойти не должно.

Нечто подобное проделывал и я, когда делал устройство управления оборотами 3-пинового вентилятора. Так воспользуемся имеющимся опытом!

Решаем задачу управления выводом звука

Задача управления решается более тривиальным путем. Сколько там ножек у нас остается?

Итак, всего 8. Две - это питание. Одна - сигнал сброса (при желании его можно тоже задействовать). Две - сигнал I2C. Одна - выход звукового ШИМ-сигнала. Итого: 8 - 6 = 2. Остается целых две ножки, на которые можно повесить, например кнопки или завести сигналы от датчиков... Для экспериментов воспользуемся кнопочным вариантом.

Самое время начать чертить схемы...

Разрабатываем принципиальную схему цифровой части

Что касается цифровой части устройства, то здесь никакой сложности нет. Любые выходы контроллера можно использовать для любых целей за исключением одного нюанса - вывода ШИМ сигнала. Поскольку для формирования аппаратного ШИМ мы будем использовать встроенный счетчик, следует учесть, что он привязан только к двум ножкам контроллера. Вывод 5 - сигнал OC0A или вывод 6 - сигнал OC0B. С учетом сказанного схема цифровой части была спроектирована в следующем виде.

Схема цифровой части устройства воспроизведения звука на ATtiny13
Схема цифровой части устройства воспроизведения звука на ATtiny13

Сигнал сброса (ножка 1 микроконтроллера U1) подтянут к напряжению питания (VCC). Кнопка подключена к выводу PB3 (ножка 2), который программно будет также подтянут к питанию. Выводы PB1 и PB2 (ножки 6 и 7) использованы для организации интерфейса I2C (SDA - шина данных, SCL - синхросигнал). Вывод PB0, а точнее OC0A (ножка 5) служит выходом сигнала ШИМ, модулированного звуком, записанным в память.

Память, в которой хранится звук это та самая микросхема AT24C512 у которой используются только выходы последовательного интерфейса. Для расширения возможностей устройства можно параллельно подключить еще 7 аналогичных микросхем, задав индивидуальный программный адрес каждой из них при помощи выводов A0-A2 путем подтягивания их к земле.

Линии интерфейса I2C подтянуты к напряжению питания через резисторы R1, R2. Это необходимо, поскольку выводы I2C-устройств спроектированы с открытым коллектором.

По питанию установлены два фильтрующих конденсатора большой и малой емкости. Большая емкость позволяет скомпенсировать просадки напряжения от ключей усилителя мощности, которые работают в режиме D, пропуская довольно высокий ток. Малая емкость - защита от импульсных помех, характерных для цифровых схем.

Аналоговая часть схемы

А вот с аналоговой частью схемы я проделал множество экспериментов, добиваясь наилучшего результата.

Началось все с того, что я решил для упрощения схемотехники применить однотактную схему усилителя, подобно той, что была мной использована в регуляторе оборотов. Первый вариант, который я нарисовал выглядел так.

Однотактный усилитель сигнала с фильтром
Однотактный усилитель сигнала с фильтром

Ключ на MOSFET-транзисторе с P-каналом предназначен для управления нагрузкой в виде динамика сопротивлением 8 Ом. Для ограничения тока заряда входной емкости транзистора установлен резистор R9. Для разряда этой же емкости служит диод D1. ФНЧ Баттерворта 2-го порядка выполнен на индуктивности L1 и емкости C2. Этот фильтр должен обеспечивать крутизну спада частотной характеристики до 12 дБ на октаву при условии хорошего согласования с нагрузкой. Параметры катушки и емкости рассчитаны исходя именно из этих соображений.

Диод D2 обеспечивает непрерывное протекание тока через индуктивность при закрывании транзистора.

Транзистор выбран из числа недорогих (рублей 5 в известном радиомагазине) с низким сопротивлением перехода исток-сток и рабочим током более 2-х Ампер.

Недостаток схемы тоже понятен - через динамическую головку будет протекать постоянный ток, средний уровень которого равен половине напряжения питания. Это не так страшно, если будет происходить лишь во время воспроизведения звука. Чтобы ток не протекал через динамик постоянно нужно программно устанавливать на входе схемы высокий потенциал в нерабочие периоды. P-канальный транзистор закрывается именно высоким потенциалом на его входе. Это будет сделано программно.

Изготовление устройства

Для экспериментов я решил сделать небольшую печатную плату в которой установить DIP-панельку для микроконтроллера. Да, получится громоздко, но зато нет проблем с перепрошивкой.

Печатная плата проектировалась в SprintLayout. Ее чертеж будет в архиве (ссылка в конце статьи).

Печатная плата прототипа устройства
Печатная плата прототипа устройства

Кнопка 2-й контакт контроллера заведена SMD-кнопка, которая распаяна на плате. 3-й контакт выведен на внешнюю контактную колодку (ряд отверстий справа) для подключения еще одной кнопки или какого-либо другого управляющего сигнала. Здесь я не предусмотрел место под фильтрующие конденсаторы. Потом допаял их навесным монтажом в удобных местах.

Индуктивность была намотана на гантельке 12*10 мм из под дросселя на 1 мГн, с которого я смотал обмотку и намотал новую - около 110 витков провода диаметром 0,25...0,3 мм.

Готовая плата с дорожками, покрытыми сплавом Розе выглядела так.

Готовая печатная плата прототипа устройства воспроизведения звука.
Готовая печатная плата прототипа устройства воспроизведения звука.

Плата изготовлена на моем домашнем фрезерном станочке CNC1610.

После монтажа получилась вот такая конструкция.

Смонтированная печатная плата, вид со стороны основных деталей
Смонтированная печатная плата, вид со стороны основных деталей

Слева выводы разъема для динамика,справа - для подачи питания. Конденсатор справа - тот самый, фильтрующий. В принципе, хватает и 47 и даже 22 мкФ, но 100 мкФ я поставил предвидя различные эксперименты, о которых расскажу дальше.

Вид с обратной стороны.

Смонтированная печатная плата, вид со стороны DIP-компонентов
Смонтированная печатная плата, вид со стороны DIP-компонентов

DIP-версий контроллеров у меня нет, поэтому использовал переходную панельку.

Перед установкой микросхемы памяти на нее нужно "залить" звуковой файл. Но прежде я решил уточнить, смогу ли я достичь заданных параметров воспроизведения звука.

Настройка микроконтроллера ATtiny13

Дело в том, что аппаратный таймер микроконтроллера ATtiny13, который я решил использовать для формирования ШИМ-сигнала, тактируется от частоты самого микроконтроллера. При этом выбор коэффициентов деления тактовой частоты крайне ограничен. То есть я не могу тактировать таймер произвольной частотой. А какая частота мне нужна? Давайте считать.

Частота отсчетов сигнала - 16 кГц. Разрядность отсчетов - 8 бит или 256 уровней. Если представлять этот сигнал в виде импульсов ШИМ, то между каждыми двумя импульсами с частотой 16 кГц должно укладываться 256 уровней квантования. Для этого таймер должен тактироваться частотой 16000 * 256 = 4096000 Гц = 4,096 МГц. Но ближайшая тактовая частота встроенного генератора составляет 4,8 МГц. Если тактировать таймер с этой частотой, то частота отсчетов будет составлять 4800000 / 256 = 18750 Гц = 18,75 кГц. Это выше той частоты, которую я запланировал. С одной стороны это хорошо, поскольку положительно скажется на качестве воспроизводимого звука. С другой стороны, это снижает длительность звука, который можно уместить в памяти. 65536 / 18750 = 3,495... То есть длительность звука сократится с 4-х до 3,5 секунд. Придется с этим смириться. Тем не менее, напомню, что всегда есть возможность расширить объем памяти путем установки дополнительных микросхем.

Создаем нужный звук и готовим файл для прошивки

Конечно же можно просто записать звук с микрофона. Это если вас полностью устраивает свой голос. А если нужен особый акцент? А если нужен женский или детский голос? Вот бы раньше я поискал подходящего диктора!

Сейчас все проще! В интернете можно найти много бесплатных ресурсов, которые позволяют озвучить произвольный текст голосом, который вас больше всего устроит. Например TTSMaker или VoiceBot. У последнего очень большой выбор дикторов. Я использовал первый просто потому, что так получилось!

Машинный перевод текста в речь выбранным голосом
Машинный перевод текста в речь выбранным голосом

Естественно, длительность записанного фрагмента не должна превышать 3,5 секунд. Файл нужно загрузить на компьютер и... Все только начинается!

Дело в том, что для достижения максимальной громкости и требуемой частоты дискретизации файл необходимо подготовить. Даже если вы запишите файл с микрофона, этой процедуры не избежать. Для работы со звуком я использую опенсорсную программу - AudaCity. Программа обладает потрясающими возможностями для работы со звуком, которые нам не понадобятся. Достаточно будет лишь базовых функций.

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

Звуковой файл, загруженный в AudaCity
Звуковой файл, загруженный в AudaCity

Первая операция, которую нам нужно будет проделать - усилить звук для максимального использования всего динамического диапазона. Для этого идем в меню "Эффекты" -> "Громкость и компрессия" и выбираем пункт "Нормализация". После чего амплитуда файла будет растянута на весь динамический диапазон.

Нормализованный звук
Нормализованный звук

Продвинутые пользователи могут "поиграть" с компрессором. Это позволит еще увеличить звуковую отдачу файла.

Далее приступаем к изменению частоты дискретизации (семплирования). Выбираем пункт меню "Треки", нажимаем "Ресемплинг". В появившемся окне видна текущая частота семплирования. Меняем ее на ту, которая требуется нам - 18750 Гц.

Изменяем частоту семплирования звука
Изменяем частоту семплирования звука

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

Теперь можно убрать лишние паузы, сначала в начале звука, затем в конце. Выделяем нужный фрагмент мышью и жмем DEL. Я паузу в начале не убирал.

Удаляем избыточные паузы
Удаляем избыточные паузы

Ничего, если файл все равно будет длиннее по времени, чем нам это нужно. Потом избавимся от излишков. Лучше немного длиннее, чем короче.

Звук примерно нужной продолжительности
Звук примерно нужной продолжительности

Теперь экспортируем наш аудио-фрагмент в подходящий для Записи на EEPROM формат. Для этого идем в меню "Файл" и выбираем "Экспорт аудио".

Экспорт записи в файл
Экспорт записи в файл

В появившемся меню выбираем "Экспорт на компьютер".

Выбор назначения
Выбор назначения

В выпадающем списке форматов выбираем "Прочие несжатые файлы".

Формат  файла
Формат файла

А в списке "Заголовок" выбираем "RAW (header-less)" - файл без заголовочной информации.

Файл без заголовка
Файл без заголовка

Последний шаг - выбор формата кодирования. Выбираем "Unsigned 8-bit PCM". Это простейший формат без сжатия с 8-битным представлением отсчетов. PCM расшифровывается как Pulse Code Modulation - импульсно-кодовая модуляция. Информация кодируется высотой импульса. Остается нажать "Экспорт" и файл с заданным именем будет сохранен на диск в указанный каталог.

Если теперь посмотреть информацию о файле, то наверняка его длина будет превышать нужные нам 65536 байт. Конечно можно обрезать его до нужной дины в самой AudaCity, но на мой взгляд удобнее это сделать в любом HEX-редакторе. Я обычно использую плагин для Notepad++.

Загружаем наш файл в редактор. Видим примерно такую картину.

Звуковой файл в HEX-редакторе
Звуковой файл в HEX-редакторе

Слева - колонка адресов (указан адрес первого байта в строке), в середине - данные в 16-ричном формате, а справа - их символьное представление. Больше всего нам нужна 1-я колонка с адресами. Находим последний нужный нам адрес строки - FFF0. Все данные, которые находятся дальше этой строки адреса следует удалить. Выделяем, удаляем.

Удаление данных, расположенных выше FFFF
Удаление данных, расположенных выше FFFF

После сохранения файла его размер должен быть ровно 65536 байт.

Корректный размер файла
Корректный размер файла

Подготовленный файл можно записать на EEPROM при помощи подходящего программатора. Я использую китайский клон USB-программатора CH341A. Пишет пишет как 24-е, так и 25-е серии ПЗУ без проблем.

После программирования микросхему можно установить на плату. Перепрограммировать можно при помощи "прищепки" или подпаяв проводки к ее выводам.

Программное обеспечение

Софт для микроконтроллера написан на языке Си в среде ArduinoIDE. Файл с программой будет вложен в архив, находящийся в конце статьи. Все необходимые комментарии там есть. Программа не очень большая. В скомпилированном виде занимает около 400 байт. Еще около 600 байт остается для реализации дополнительной логики.

Микроконтроллер я прошиваю при помощи самодельного программатора на основе Arduino-nano и платы Digispark, подключенной для удобства. Останавливаться на этом не буду, все хорошо документировано ардуинщиками.

Теперь самое интересное!

Эксперименты с выводом звука

В ходе экспериментов я постарался найти условия при которых достигается максимальные качество-громкость звука. Для этого были использованы как различные устройства вывода, так и несколько схемотехнических решений.

Прежде всего динамики. Вот те, которые я использовал. Все 8-омные кроме крайней левой пищалки. Эта 16-омная.

8-омные динамики для воспроизведения
8-омные динамики для воспроизведения

Можно было бы попробовать и с 4-омными (по току транзистор проходит - около 1 ампера при 4 вольтах питания), но таковых у меня под рукой не оказалось.

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

Вот так выглядел тестовый стенд.

Тестовый стенд
Тестовый стенд

Средний ток потребления составил 100...150 мА (для разных динамиков) в режиме воспроизведения при напряжении питания соответствующем среднему напряжению литий-ионного аккумулятора - 3,7 В.

Ток и напряжение во время воспроизведения
Ток и напряжение во время воспроизведения

Разумеется, пиковые значения для 8-омной головки могли достигать 3,7 / 8 = 0,46 А или 460 мА.

Посмотрим при помощи осциллографа на форму напряжения на динамике.

Осциллограмма звукового сигнала на выходе
Осциллограмма звукового сигнала на выходе

Видно, что средний уровень сигнала примерно 1,8 В, а на сигнал наложено высокочастотное колебание. Это гармоники частоты дискретизации сигнала, которые фильтр задавил не до конца. Те самые 18750 Гц. Тем не менее, это не страшно, поскольку чувствительность человеческого уха на этих частотах практически нулевая. Ухо просто их не слышит. Безусловно для усилителей класса D такие гармоники нежелательны во избежание избыточной утомляемости слухового аппарата, но для наших целей это не страшно. Нам долго не слушать! А китайцы в своих игрушках и страшнее звуки выводят!

Вот так выглядят эти колебания при большем разрешении временной шкалы.

Колебания с частотой ШИМ
Колебания с частотой ШИМ

Как видно, фильтр сделал свое дело, задушив высшие гармоники частоты ШИМ. Поэтому колебания не прямоугольные а ближе к гармоническим.

А теперь шальная, но обоснованная идея! А что если совсем убрать выходной фильтр? Ведь механическая система любого динамика, обладая инерционностью сама является фильтром! Динамик же не воспроизводит очень высокие частоты. Зачем это нужно? А чтобы избавится от громоздкого дросселя, который несколько ломает миниатюрность конструкции.

Тогда схема будет выглядеть так.

Схема усилителя без фильтра
Схема усилителя без фильтра

Избавились от 3-х компонентов: диода, индуктивности и конденсатора. Что получили? Вначале проверим форму напряжения на динамике.

Форма сигнала на динамике без фильтра
Форма сигнала на динамике без фильтра

Как и следовало ожидать на динамик поступает исходный ШИМ-сигнал. Видно, как меняется ширина импульсов. В более детальном разрешении.

ШИМ-сигнал на динамике
ШИМ-сигнал на динамике

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

А вот с динамиками поменьше все гораздо хуже. Звук гораздо тише и более свистящий. Получается, что для маленьких динамиков нужен громоздкий фильтр, а для больших - нет! Засада! Ничего, мы над этим еще поломаем голову.

Теперь подумаем над еще одной "занозой". Мне все же очень не нравится этот постоянный ток, который идет по динамику в момент воспроизведения. Почему? Сдается мне, что намагничивание головки в одном направлении может съедать ее динамический диапазон и уменьшать громкость. Неплохо бы проверить...

Чтобы избавится от постоянного тока обычным разделительным конденсатором не обойтись. В схеме нашего простого усилителя ему просто некуда будет разряжаться в момент закрытия транзистора. Диод-то заперт для него! Значит нужна схема чуть сложнее. Делаем двухтактный каскад подобный тому, который используется в тех же усилителях класса D. Вот так.

Двухтактный выходной каскад
Двухтактный выходной каскад

В пару к нашему P-канальному MOSFET добавим N-канальный, работающий в противофазе. Это хорошая замена диоду, поскольку транзистор не запрещает течь току в любом направлении. Это значит, что наш динамик теперь можно включить через конденсатор, который отрежет постоянную составляющую.

Один очень важный нюанс такой схемы - транзисторы не должны срабатывать одновременно. Если это произойдет, то будет такой момент, когда оба транзисторы открыты и через них пойдет большой ток, который конечно же выведет их из строя! Эта проблема решается теми же резисторами и диодами. Резистор в цепи стока, ограничивая скорость заряда затворной емкости, делает ее заряд относительно медленным, снижая скорость открытия транзистора. Напротив, разряд емкости затвора происходит через диод, обладающий малым сопротивлением, что приводит к быстрому закрытию транзистора. Важно лишь, чтобы напряжение закрытия транзистора превышало падение напряжения на диоде. Для выбранных транзисторов это напряжение - около 1 Вольта. Падение напряжения на диодах же - 0,6 В.

Схема была собрана на дополнительной печатной плате, чертеж которой тоже есть в архиве.

печатная плата 2-тактного усилителя
печатная плата 2-тактного усилителя

На плате есть одна перемычка (чтобы не делать 2-стороннюю).

Теперь макет выглядел следующим образом.

-30

Видно, что дроссель перекочевал на плату с двухтактным усилителем. Кроме того, появился разделительный электролитический конденсатор (приличный, такой).

Посмотрим форму напряжения.

Форма напряжения на динамике в двухтактной схеме усилителя
Форма напряжения на динамике в двухтактной схеме усилителя

Форма очень похожа на таковую в простом варианте усилителя за исключением того, что теперь средний уровень равен нулю! Это хорошо и избавляет нас от необходимости принимать специальные программные меры для защиты динамика в моменты паузы. Этот факт экономит нам 28 байт памяти программ! Не мало для ATtiny13!

А вот звук, к сожалению, существенно громче не стал! Не оправдались мои ожидания! Остается, с горя, взять да и убрать выходной фильтр. Вот так.

Двухтактный усилитель мощности без фильтра
Двухтактный усилитель мощности без фильтра

Вполне ожидаемая форма напряжения на динамике.

-33

По качеству и громкости практически ни каких отличий от однотактного варианта усилителя без фильтра - нет.

Мне этот вариант понравился больше всего. Во-первых, нулем на динамике, а во-вторых, компактностью кода. Ну а конденсатор можно и маленький найти если на напряжение 6,3 В.

В качестве резюме

Использовать ATtiny13 для воспроизведения звука вполне себе можно! Да, не без обвеса и дополнительных схемотехнических решений, но ведь можно! Доказано Terrabyte и вашим покорным слугой - Дмитрием! Подобрать чип памяти, взять динамик с более-менее приличным диффузором и только в путь!

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

Тест усилителя 720p.mp4

Готов ответить на любые вопросы!

Спасибо, что читаете-смотрите Terrabyte! Подписывайтесь, если вам интересна радиолюбительская тематика, мини-ПК, необычные компьютерные решения и инновационные разработки! Спасибо всем, кто нас поддерживает своими комментариями и лайками!

Наша группа ВК: https://vk.com/terrabyte

Наш канал на YouTube: https://www.youtube.com/@TERRABYTE

Вам будет интересно:

Вызов для программиста: микро FM-радио на RDA5807M и ATtiny13A своими руками

Как я делал эксклюзивные наручные часы для "ботаников" (со всем уважением - сам такой)!

Райзер PCI-express для видеокарты своими руками!