Всем привет. Сегодня речь пойдет о моей старой отладочной плате STM32F4 discovery.
Мне захотелось поиграться с имеющимся MEMS микрофоном на плате. А именно вывести звук с этого микрофона напрямую на внешний набортный CS43L22 ЦАП. Готовых примеров я не нашёл, но смог разобраться и объединить разные проекты с гитхаба. Есть проекты от ST, но они морально устарели и не дают данного функционала. Хотя в них можно найти много чего интересно что можно использовать в своих проектах.
Проект сгенерирован в Cube с использованием библиотеки HAL и поддается любым доработкам.
На плате установлен все направленный микрофон MP45DT02, который на выходе выдает однобитный поток в виде импульсов разной плотности. Выглядит это следующим образом.
Частая смена логических уровней с одинаковой шириной соответствует нулевой амплитуде сигнала. Если ширина импульсов с логической единицей следующих друг за другом больше чем ширина импульса с логическим нулем, то можно говорить о положительном значении амплитуды сигнала. Чем больше ширина импульса с логической единицей, тем больше значение положительной амплитуды и на оборот при отрицательном значении амплитуды будет преобладать ширина импульса с логическим нулем.
Ранее мы работали с аналоговыми микрофонными модулями, с которых снимали сигнал c нужной частотой дискретизации при помощи 12 битного АЦП.
На выходе получали PCM выборки где определенному значению амплитуды аналогового сигнала соответствовало число в диапазоне от 0 до 4095.
Теперь же чтобы получить привычные для нас данные т.е. преобразовать PDM поток с микрофона в PCM .Необходимо подвергнуть их фильтрации и децимации. На стадии децимации частота выборки PDM сигнала снижается до необходимой частоты дискретизации в нашем случае 48kHz. Если частота с которой тактируется микрофон равна 3,072 мегагерца, то чтобы получить 48 килогерц берутся каждые 64 бит потока и из них получается одна PCM выборка. В этом случае говорят что коэффициент децимации равен 64. Ну и перед стадией децимации PDM данные проходят через ФНЧ.
На самом деле не все так сложно как кажется, так-как ST предоставляет готовый скомпилированный черные ящик в виде модуля библиотеки который делает всю эту работу и настраивается прямо из куба.
Подключение микрофона выполнено по интерфейсу I2s, который реализован в блоке SPI микроконтроллера.
У микрофона имеется два канала какой из них будет активен определяется логическими уровнями на входе LR микрофона.
В моем случае этот вход подключен к земле через нулевой резистор. Значит активен левый канал. Данные читаются на низком уровне клока первые пол периода, другие пол выход микрофона находится в высокоимпедансном состоянии.
Можно подключить еще один микрофон соединив линии данных и тактирования вместе. При условии что у другого микрофона будет активен правый канал. Данные правого канала будут читаться на высоком уровне клока.
Настройка интерфейса выглядит следующим образом. Режим работы полу duplex. Режим передачи – приемник(будем принимать PDM поток с микрофона). Хочу отметить, что у нас не знаковые значения передаются, а поток бит поэтому следующая настройка может быть изменена на другие. 32 бита на 32битный фрейм , но можно установить 24 бита на 32битный фрейм и тоже будет работать. Частота дискретизации аудио - 48 килогерц. Полярность клока низкий.
Настройка ДМА .ДМА1 поток 3.Направление передачи из периферии в память, размер данных половина слова.
Для воспроизведения задействован внешний набортный ЦАП CS43L22 интерфейс передачи аудио тоже I2s .Его настройка выглядит следующим образом. Режим работы полудуплекс мастер. Активирован выход тактирования. Настроен на передачу. Стандарт обмена данными I2S филипс.24 бита на 32битный фрейм. Частота аудио 48 килогерц. Полярность клока низкая.
Частота тактирования для микрофона и i2s2 получается следующим образом. Частота дискретизации выбрана 48 килогерц данные на один канал 24 бита, но передаются они 32 битным фреймом. У нас два канала, умножаем на 48 килогерц и получаем около 3 мегагерц.
Настройка ДМА - ДМА1 поток 5.Направление передачи из памяти в периферию. Размер данных половина слова.
Настройка PDM фильтра. Чтобы можно было задействовать библиотеку для начала необходимо задействовать блок вычисления контрольной суммы. После этого можно будет задействовать PDM фильтр. Где необходимо определить порядок байт и бит. Кол-во каналов. Так-как частота тактирования у микрофона 3.072 мегагерца, чтобы получить 48 килогерц коэффициент децимации должен быть 64. Кол-во семплов на выходе фильтра = 16. Определяет сколько PCM сэмплов мы получим на выходе, а также сколько нужно на основании этого скормить фильтру бит входного PDM потока. При 16 PCM сэмплах на выходе, на вход мы должны скормить 64-16 битных выборки. На каждые 64 бита PDM фильт выдаст один PCM семпл.
Найти продолжение и скачать программную реализацию можно будет на канале автора ElecroHobby Борис Ильковец .