• Усилитель звука для микроконтроллера, нормальное ли решение?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Обычно так не делают, но если вы тяготеете к предельной простоте, то да, так можно. Тем не менее кое-что нуждается в комментариях.
    качественный звук
    Качество звука этой схемой не определяется, а зависит сугубо от того, что скрывается внутри esp32 (я имею ввиду и софт, и железо, т.е. ЦАП).
    максимальный ток через динамик -- около 1 А, мощность на динамике -- до 4 Вт
    Вот так в лоб это не рассчитывается. Вы забыли, во-первых, про действующее значение переменного напряжения, и во-вторых, двойную амплитуду, т.е. размах. Чтобы получить 4 ватта, вам надо иметь амплитуду звука на динамике около 6 вольт, соответственно размах около 12 вольт. От эмиттерного повторителя при 5-вольтовом питании это не получится.
    Для минимального потребления во время простоя держать на аналоговом выходе в это время 0.
    Я не программист, но если вы уверены, что сможете написать софт, распознающий паузы в звуке и не создающий на паузах щелчков... в общем, вам виднее. Аналоговая техника решает вопросы экономичности иначе, да и цифровая тоже (ШИМ).
    Чтобы не было искажений выводимый сигнал программно сжать и сдвинуть так, чтобы его амплитуда была в диапазоне +0.5...+3.3 вольта.
    Тут опять неверная прикидка. В диапазон 0,5...3,3 вольт должна помещаться не амплитуда, а размах. Если он в пределе составляет 2,8 вольт, то пиковая амплитуда - 1,4 вольт, действующее значение - около 1 вольт, и при токе 1 ампер получается всего около 1 ватт.
    Тем не менее получить 4 ватта при 5 вольтах питания можно. Для этого надо либо уменьшить сопротивление динамика до 2 Ом (транзистор изменить на более мощный с бОльшим коэфф.усиления по току базы), либо усложнить схему (сделать её 2-тактной или с трансформаторным выходом).
    Ответ написан
    2 комментария
  • Можно ли/как получить хвост вывода sprintf?

    @forspamonly2
    интересный вопрос, редкость тут.

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

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

    второй вариант: можно сделать свой стрим (man fopencookie). для вашей цели достаточно написать только обработчик записи, который собственно и будет закольцовывать буфер: копировать сколько влезло в конец, а остальное в начало. и выводить всё в этот стрим fsprinf-ами и прочими функциями работы с потоками. может быть даже получится перенаправить stdout в этот самодельный поток, тогда и обычные printf'ы заработают.
    Ответ написан
    2 комментария