1. 程式人生 > >數字麥克風PDM訊號採集與STM32 I2S介面應用

數字麥克風PDM訊號採集與STM32 I2S介面應用

      數字麥克風採用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,就是取樣率訊號的頻率。

 

 

參考文件:

1、如何將PDM數字麥克風連線到STM32微控制器

AN5027 使用STM32 32位Arm® Cortex® MCU連線PDM數字麥克風

&n