Библиотеку для генерации звука (функции pwm_audio_*) и пример её использования можно найти в ESP-IoT-Solution [2].
Функция генерации звука с помощью ШИМ (PWM audio) использует внутреннее периферийное устройство LEDC, которое имеется на борту большинства чипов семейства ESP32. Такой способ формирования звука не требует внешней микросхемы кодека audio, что используется во многих недорогих приложениях, когда не требуется высокое качество звука.
Функциональные возможности PWM audio:
● Позволяет формировать ШИМ на любом выводе порта GIPO. ● Поддерживает разрешающую способность ШИМ 8 .. 10 бит (PWM resolution). ● Поддерживает stereo. ● Поддерживает частоту выборок 8 .. 48 кГц (sampling rate).
Рис. 1. Пример типовой структуры приложения на основе PWM audio.
Как это работает:
1. Сначала данные звука записываются в буфер (или подготавливаются на лету, runtime) таким образом, чтобы они удовлетворяли входным требованиям библиотеки (PWM input) включая сдвиг и смещение данных. 2. Данные посылаются в функцию ISR (Interrupt Service Routines) группы таймера (Timer Group) через кольцевой буфер (Ring Buffer). 3. Timer Group читает данные из Ring Buffer в соответствии с предварительно установленной частотой дискретизации выборок звука (sampling rate), и записывает данные в периферийное устройство LEDC.
Примечание: поскольку вывод звука осуществляется модуляцией ШИМ (PWM), необходим ФНЧ для получения звукового сигнала сглаженной формы. Во многих недорогих приложениях в случае частоты дискретизации свыше 15 кГц такой фильтр опускается, и сигнал ШИМ сразу подается на звуковой излучатель (динамик) с помощью ключей на транзисторах.
[Частота PWM]
Частота выходных импульсов PWM не может конфигурироваться напрямую, она должна быть вычислена конфигурированием количества бит разрешающей способности ШИМ (PWM resolution) как показано в следующей формуле:
Здесь частота fAPB_CLK равна 80 МГц, а res_bits это количество бит (разрешающая способность) PWM. Когда разрешающая способность установлена LEDC_TIMER_10_BIT, частота PWM получится 78 кГц. Как известно, чем выше частота PWM, тем проще воспроизвести звуковой сигнал, и тем проще может быть ФНЧ для импульсов ШИМ. Однако по этой формуле видно, что увеличение частоты PWM означает снижение разрешающей способности, и наоборот, повышение разрешающей способности требует понижения частоты PWM. Здесь требуется найти разумный компромисс. Поэтому настройте эти параметры в соответствии с реальным сценарием использования вашего приложения.
Пример программы (полный рабочий пример проекта см. в папке examples/audio/wav_player/ каталога установки ESP-IoT-Solution [2]):
В следующей таблице приведена общая справка по функциям библиотеки PWM audio. Полное описание функций, используемых структур и типов см. в оригинальной документации [1].
Функция
Описание
pwm_audio_init
Инициализирует и конфигурирует pwm audio.
pwm_audio_deinit
Отменяет инициализацию LEDC timer_group и порта вывода gpio.
pwm_audio_start
Подготовительный запуск для генерации pwm audio.
pwm_audio_stop
Остановка pwm audio.
pwm_audio_write
Запись звуковых данных для проигрывания.
pwm_audio_set_param
Установка параметров audio, наподобие pwm_audio_set_sample_rate(), но также устанавливает разрядность выборок звука.
Ниже показан пример использования компонента PWM Audio для формирования синусоидального непрерывного сигнала на частоте дискретизации 48000 Гц с помощью технологии прямого цифрового синтеза (Direct Digital Synthesis, DDS).
[Предварительные операции]
Для того, чтобы можно было использовать компонент PWM Audio, нужно:
1. Скачать ESP-IoT-Solution [2] где есть компонент PWM Audio.
2. Добавить переменную окружения IOT_SOLUTION_PATH, указывающую место на диске, куда вы скопировали ESP-IoT-Solution.
3. Добавить в проект зависимость pwm_audio:
$ idf.py add-dependency pwm_audio
После этого можно в проекте подключить заголовочный файл pwm_audio.h, и использовать API-функции pwm_audio_* библиотеки.
Примечание: остановить генерацию можно, если сбросить в false флаг playing. Пример проигрывания стереофонического файла можно посмотреть в папке examples\audio\wav_player\ каталога установки ESP-IoT-Solution (обычно папка esp-iot-solution).