Найти в Дзене
БоряЭлектрик

stm32f4 discovery PDM микрофон. Настройка I2s . Внешний ЦАП.

stm32f4discovery microphone
stm32f4discovery microphone

Всем привет. Сегодня речь пойдет о моей старой отладочной плате STM32F4 discovery.

stm32f4discovery
stm32f4discovery

Мне захотелось поиграться с имеющимся MEMS микрофоном на плате. А именно вывести звук с этого микрофона напрямую на внешний набортный CS43L22 ЦАП. Готовых примеров я не нашёл, но смог разобраться и объединить разные проекты с гитхаба. Есть проекты от ST, но они морально устарели и не дают данного функционала. Хотя в них можно найти много чего интересно что можно использовать в своих проектах.

Проект сгенерирован в Cube с использованием библиотеки HAL и поддается любым доработкам.

stm32cube
stm32cube

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

PDM сигнал
PDM сигнал

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

Ранее мы работали с аналоговыми микрофонными модулями, с которых снимали сигнал c нужной частотой дискретизации при помощи 12 битного АЦП.

На выходе получали PCM выборки где определенному значению амплитуды аналогового сигнала соответствовало число в диапазоне от 0 до 4095.

Аналоговый сигнал в PCM
Аналоговый сигнал в PCM

Теперь же чтобы получить привычные для нас данные т.е. преобразовать PDM поток с микрофона в PCM .Необходимо подвергнуть их фильтрации и децимации. На стадии децимации частота выборки PDM сигнала снижается до необходимой частоты дискретизации в нашем случае 48kHz. Если частота с которой тактируется микрофон равна 3,072 мегагерца, то чтобы получить 48 килогерц берутся каждые 64 бит потока и из них получается одна PCM выборка. В этом случае говорят что коэффициент децимации равен 64. Ну и перед стадией децимации PDM данные проходят через ФНЧ.

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

Подключение микрофона выполнено по интерфейсу I2s, который реализован в блоке SPI микроконтроллера.

Подключение микрофона к микроконтроллеру по интерфейсу I2S
Подключение микрофона к микроконтроллеру по интерфейсу I2S

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

Выбор стерео канала микрофона
Выбор стерео канала микрофона

В моем случае этот вход подключен к земле через нулевой резистор. Значит активен левый канал. Данные читаются на низком уровне клока первые пол периода, другие пол выход микрофона находится в высокоимпедансном состоянии.

Можно подключить еще один микрофон соединив линии данных и тактирования вместе. При условии что у другого микрофона будет активен правый канал. Данные правого канала будут читаться на высоком уровне клока.

Подключение двух PDM микрофонов от ST
Подключение двух PDM микрофонов от ST

Настройка интерфейса выглядит следующим образом. Режим работы полу duplex. Режим передачи – приемник(будем принимать PDM поток с микрофона). Хочу отметить, что у нас не знаковые значения передаются, а поток бит поэтому следующая настройка может быть изменена на другие. 32 бита на 32битный фрейм , но можно установить 24 бита на 32битный фрейм и тоже будет работать. Частота дискретизации аудио - 48 килогерц. Полярность клока низкий.

Настройка I2S2
Настройка I2S2

Настройка ДМА .ДМА1 поток 3.Направление передачи из периферии в память, размер данных половина слова.

настройка DMA
настройка DMA

Для воспроизведения задействован внешний набортный ЦАП CS43L22 интерфейс передачи аудио тоже I2s .Его настройка выглядит следующим образом. Режим работы полудуплекс мастер. Активирован выход тактирования. Настроен на передачу. Стандарт обмена данными I2S филипс.24 бита на 32битный фрейм. Частота аудио 48 килогерц. Полярность клока низкая.

настройка i2s3
настройка i2s3

Частота тактирования для микрофона и i2s2 получается следующим образом. Частота дискретизации выбрана 48 килогерц данные на один канал 24 бита, но передаются они 32 битным фреймом. У нас два канала, умножаем на 48 килогерц и получаем около 3 мегагерц.

расчет частоты тактирования
расчет частоты тактирования

Настройка ДМА - ДМА1 поток 5.Направление передачи из памяти в периферию. Размер данных половина слова.

настройка ДМА
настройка ДМА

Настройка PDM фильтра. Чтобы можно было задействовать библиотеку для начала необходимо задействовать блок вычисления контрольной суммы. После этого можно будет задействовать PDM фильтр. Где необходимо определить порядок байт и бит. Кол-во каналов. Так-как частота тактирования у микрофона 3.072 мегагерца, чтобы получить 48 килогерц коэффициент децимации должен быть 64. Кол-во семплов на выходе фильтра = 16. Определяет сколько PCM сэмплов мы получим на выходе, а также сколько нужно на основании этого скормить фильтру бит входного PDM потока. При 16 PCM сэмплах на выходе, на вход мы должны скормить 64-16 битных выборки. На каждые 64 бита PDM фильт выдаст один PCM семпл.

настройка PDM2PCM библиотеки
настройка PDM2PCM библиотеки

Найти продолжение и скачать программную реализацию можно будет на канале автора ElecroHobby Борис Ильковец .