STM32 ADC #3 基礎應用 – Continuous Conversion Mode (連續轉換模式)

本文將深入探討STM32 ADC的Continuous Conversion Mode(連續轉換模式)。這種模式,正如其名,支持連續的資料轉換。文章首先解釋連續轉換模式的概念、操作方法以及資料提取過程。其次,我們將探討Scan Mode與連續轉換模式之間的關聯,並設置如何透過DMA將資料存放至SRAM內。瞭解這些功能後,我們會設計一個實驗來展示連續轉換模式的應用,並通過程式碼與實驗電路來完成此實驗。此篇的目的是為了確保讀者能夠有效利用此模式,同時避免任何非預期的結果。

Outline

ADC 連續轉換模式介紹

在連續轉換模式下,ADC一完成一次轉換就立即開始另一次。這種模式可以通過外部觸發啟動,或者在ADC_CR2寄存器中設置ADON位,同時CONT位為1。 每次轉換完成後:

  • 如果轉換的是regular channel:
    • 轉換後的數據存儲在16位的ADC_DR寄存器中
    • EOC(轉換結束)標誌被設置
    • 如果設置了EOCIE,則會生成一個中斷。
  • 如果轉換的是injected channel:
    • 轉換後的數據存儲在16位的ADC_DRJ1寄存器中
    • JEOC(注入轉換結束)標誌被設置
    • 如果設置了JEOCIE位,則會生成一個中斷。

Scan Mode介紹

此模式用於掃描一組analog channel。 通過設置ADC_CR1寄存器中的SCAN bit來選擇掃描模式。一旦設置了,ADC就會掃描在ADC_SQRx寄存器中選擇的所有通道(for regular channel)或在ADC_JSQR中選擇的通道(injeceted channel)。對組中的每個通道進行單次轉換。每次轉換結束後,該組的下一個通道會自動轉換。如果設置了CONT bit,轉換不會在選擇的最後一個組通道處停止,而是會從第一個選擇的組通道重新開始。 使用掃描模式時,必須設置DMA bit,並使用直接內存訪問控制器在每次更新ADC_DR寄存器後將常規組通道的轉換數據傳輸到SRAM。 注入通道的轉換數據總是存儲在ADC_JDRx寄存器中。

ADC 連續轉換模式實驗規劃

實驗目的: 熟悉ADC連續轉換程式碼應用之方式,並利用DMA將資料放置指定位置。

實驗描述: 以軟體觸發方式,進行ADC的轉換,再透過DMA將ADC_DR將放置指定位置,以避免資料覆蓋。

實驗條件:

以ADC1進行實驗,設定參數如下圖

ADC Configuration
ADC Configuration

在DMA Settings中需要注意一點,DMA中斷需要關閉。(如將Interrupt開啟會導致STM32會不斷處理發生中斷的函數內容)

DMA Settinigs
DMA Settings
Disable DMA Interrupt
Disable DMA Interrupt功能

實驗電路圖:

下面是一個串聯電路的電路圖,其量測點分別在兩電阻之間(IN1)和地(IN0)。

Experimental Circuit Diagram
實驗電路圖

接下來看看程式碼和實驗的結果。

ADC 連續轉換模式實驗結果

程式碼:

在CubeMX專案建立完成後,需加入的程式碼如下

需要將上述程式碼放置Global的指定位置。其中IN_CH結構是方便在程式碼中呼叫和查看的數據結構,等等觀察結果能夠一次性的看出量測出ADC的值和換算成電壓的值。Cal_ADC_Values函數是用來保存和計算ADC Channel所量測出來的數值。

下方是ADC初始化函數的內容:

在上方ADC初始化函數中,第54行是HAL函數庫啟動ADC開始量測的函數,其不同之處是在ADC1轉換完成之後會將在ADC_DR中的數值透過內部硬體DMA的方式將資料傳至指定的SRAM位置中(u32_ADC_Data)。

下方是main函數內部需修改的部分。

在main函數中將u32_ADC_Data轉換成16 bit的陣列。(寫法有很多種方式,沒有一定)

在while迴圈中將量測的值和ADC_IN數據結構位置個別帶入Cal_ADC_Values函數內,用於計算電壓值和儲存ADC數值。

接下來看看實驗結果。

Values of two channels measured through ADC1 and the voltage values upon completion of conversion
透過ADC1量測的兩個通道的數值和轉換完成的電壓值

注意到在ADC此模式中,一旦啟動了就會不段的運行,時時刻刻的將ADC中的每個channel的數值更新到SRAM內,且能夠將其作運用,以達到不斷監視的作用等等。

結論

在本篇文章中,介紹了STM32 ADC Continuous Conversion Mode的使用方式,並且規劃了簡單易懂的實驗內容,利用ADC1透過兩個Channnel執行參數的設置,最後在實驗部分確實的展現出實驗的結果,其中還強調需要注意的部分如:DMA Settings中,為何Interrupt需要關閉等等。

在學習此篇文章的內容,希望程序猿們需要理解的部分:

  • STM32 ADC Continuous Mode/Scan Mode的關係
  • STM32 DMA的概念
  • 以程式碼實現Continuous Mode並利用DMA將數據傳至指定的SRAM內

以上細節可參考reference manual以加深學習內容。

發表迴響

返回頂端