數字麥克風采用MEMS技術,將聲波信號轉換為數字采樣信號,由單芯片實現采樣量化編碼,一般而言數字麥克風的輸出有PDM麥克風和PCM麥克風,由於PDM麥克風結構、工藝簡單而大量應用,在使用中要注意這二者的區別,尤其是STM32 MCU的文檔在I2S接口章節,對此區別含糊不清,比如采樣率配置,WS管腳的用法,單聲道雙聲道的配置,很多地方無法從文檔中得到准確信息,需要一邊摸索一邊研究文檔。本文就是對這些問題的一個研究筆記。
一、數字麥克風通信方式
數字麥克風管教很簡單,如下面的圖示。

電源和地,時鍾腳CLK,左右聲道選擇L/R,信號管教SD或DOUT。區別是WS管教,這個管教對數據采集和分辨率配置有很大影響。STM32芯片手冊這樣描述對應的這三個管教:

信號時序圖如下:

上面描述了STM32芯片關於I2S的麥克風的數據讀取時序,而麥克風廠家如何處理輸出信號,有自己的方式,這里就是I2S接口應用的第一個需要主要的點。
例子1:INMP441
INMP441是具有WS管腳的數字麥克風,它的時序圖如下,立體聲模式下,WS=0時輸出左聲道,WS=1時輸出右聲道。

單聲道模式下,LR=0時一個WS周期內只有低電平輸出信號,另外一半周期輸出為高組,LR=1時輸出時序相反。

例子2:MP45DT02
MP45DT02是沒有WS管腳的數字麥克風,它的時序圖如下,該器件根據LR電平,分別在CLK的低電平和高電平時間輸出左右聲道信號,實現信號的分時復用。
二、采樣時鍾配置
如果用此類麥克風的單聲道應用,就需要考慮數據采集在WS另外半休眠周期的影響。下面就是此麥克風的一個STM32F407芯片下的配置。
/* I2S2 init function */ void MX_I2S2_Init(void) { hi2s2.Instance = SPI2; hi2s2.Init.Mode = I2S_MODE_MASTER_RX; hi2s2.Init.Standard = I2S_STANDARD_MSB; hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B; hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE; hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_16K; hi2s2.Init.CPOL = I2S_CPOL_LOW; hi2s2.Init.ClockSource = I2S_CLOCK_PLL; hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE; if (HAL_I2S_Init(&hi2s2) != HAL_OK) { Error_Handler(); } }
該模式下,麥克風的輸出信號圖如下。由於LR=0,所以在WS低電平半周期輸出信號,高電平半周期內無數據。可以發現CLK時鍾為512khz,我們配置的是16bit數據模式,16khz采樣,為什么CLK輸出為512khz呢?原因是左右聲道各自占用半個周期,當WS信號為16khz時,時鍾頻率是16bit*16khz*2=512khz,實際上單麥克風系統中有效采樣時間只有一半,相當於一個采集周期內采集一半休息一半,其聲音特性被這樣采一半截取一半會有什么變化呢,需要試驗驗證。

上面的問題是由WS管腳引起的,若選用無WS管腳的其他信號,比如MP34DT04,則是另一種時序,芯片手冊時序圖如下。
如果LR管腳接地,則在CLK的低電平半周期輸出信號,如果LR接VCC,則在CLK的高電平半周期輸出信號,在一個數據線上實現雙聲道采集。

這種麥克風對於單聲道應用,會在CLK一半時間內輸出信號,另一半高組。在立體聲應用中,使用一根數據線傳輸左右聲道,分時復用傳輸信號。

麥克風芯片要求的時鍾頻率范圍一般是1—3Mhz,把上面代碼的采樣率設置為32Khz,則采集信號如下圖。CLK時鍾頻率為1Mhz,為什么會出現這種情況呢?

麥克風輸出PDM信號,PDM調制器將緩沖模擬信號轉換為串行脈沖密度調制信號。時鍾輸入( CLK)用於控制PDM調制器。常見的數字麥克風的時鍾頻率范圍在1 MHz至3.25 MHz之間。該頻率將定義生成離散時間表示( PDM比特流)的放大器模擬輸出信號采樣頻率。同樣的分析方法,ST芯片是按照雙聲道WS區分左右聲道配置的芯片,那么WS低電平是左聲道,高電平是右聲道,因此軟件配置一個16it采樣的信號,一個周期需要2*16bit=32個時鍾脈沖,而配置的采樣率為32khz,這就使得CLK輸出達到了32bit*32khz=1024khz,所以下面測量到clk為1.024Mhz。WS信號的頻率為32Khz,就是采樣率信號的頻率。這里是數字麥克風計算PDM采樣率的另一個易錯點,上面的計算方法是對於有SW管腳的麥克風傳感器而言的,對於沒有SW管腳的麥克風芯片,則實際PDM采樣率為STM32 MCU配置的分辨率的二倍。

參考文檔:
1、如何將PDM數字麥克風連接到STM32單片機
AN5027 使用STM32 32位Arm® Cortex® MCU連接PDM數字麥克風
數字麥克風PDM信號采集與STM32 I2S接口應用--筆記目錄:
數字麥克風PDM信號采集與STM32 I2S接口應用(一)
https://www.cnblogs.com/pingwen/p/11298675.html
數字麥克風PDM信號采集與STM32 I2S接口應用(二)
https://www.cnblogs.com/pingwen/p/11301935.html
數字麥克風PDM信號采集與STM32 I2S接口應用(三)
https://www.cnblogs.com/pingwen/p/11794081.html
數字麥克風PDM轉PCM與STM32 I2S接口應用----重要文檔列表
https://www.cnblogs.com/pingwen/p/11302452.html
數字麥克風PDM信號采集與STM32 I2S接口應用(四)--單片機源碼
https://www.cnblogs.com/pingwen/p/13371144.html
尊重原創技術文章,轉載請注明。

