ADC(Analog to Digital Converter)顧名思義是將類比訊號轉換成數位訊號的元件,現今多數 MCU 都會內建 ADC,而這也是相當基本且常用的功能。
STM32 中的 ADC 功能相當多樣,也造成它的使用有一定程度的複雜度,搭配組合很多,因此本文會以 STM32F446RE 爲主,簡單介紹各種基本的模式及設定。
STM32F446RE 擁有三個 12-bit 的 ADC,且擁有 19 個通道,其中包含 16 個來自外部、2 個來自內部,還有一個是 V_BAT
通道。ADC 的輸入電壓範圍爲 V_REF-
~ V_REF+
,也就是最大 0
~ 3.6
V。
▲ ADC 容許電壓範圍。取自 DS106893 Rev10 P.139。
▲ 單一 ADC 的方塊圖。取自 RM0390 Rev6 P.356。
ADC 有兩個 Clock:
V_DDA
= 1.7 ~ 2.4 V)或 36 MHz(V_DDA
= 2.4 ~ 3.6 V)。參考 DS10693 的 Table 74. ADC characteristics。在 STM32 中,ADC 通道可分爲 Regular(常規)和 Injected(注入)兩組。組,或著說序列(Sequence)是由一到數個 ADC 通道以任一順序組成。
Regular 與 Injected 的主要差異除了上面列的外,還有就是 Injected 有著類似中斷(Interrupt)的功能。一般狀態下,使用者可以將平常要量測的類比訊號源設爲「 Regular 常規組」,當特殊事件發生時,「Injected 注入組」可以中斷 Regular 的轉換,優先進行 A/D 轉換,完成後再回去進行 Regular 組的轉換。
Regular 比較常見翻譯成「規則」通道,但在此我認爲翻成「常規」比較能夠區分其與 Injected 的功能差異。
F446RE 中有 3 個內部通道:溫度感測器、內部參考電壓 V_REFINT
與電池 V_BAT
。
其中,溫度感測器與 V_BAT
共用 ADC1_IN18 通道。它們無法同時使用,若同時被啓用,那只有 V_BAT
的轉換會運作。而 V_REFINT
使用 ADC1_IN17 通道。
在此模式下,每次觸發 ADC 都只會進行一次轉換,轉換完成後就停止。
透過將 ADC_CR2 暫存器的 CONT 位元設爲 0
以使用此模式。
觸發源可以是:
1
,即軟體觸發轉換。僅限 Regular 通道。1
,即軟體觸發轉換。僅限 Injected 通道。在此模式下,ADC 在完成一次轉換後會儘快開始另一次新的轉換。
透過將 ADC_CR2 暫存器的 CONT 位元設爲 1
以使用此模式。
觸發源可以是:
1
,即軟體觸發轉換。僅限 Regular 通道。Injected 通道無法使用連續轉換,除非設定 JAUTO 位元以啓用 Auto-injection,在此就不詳細說明。
此模式用來以組爲單位,爲多個 ADC 通道進行轉換。Regular 和 Injected 通道都適用。
當其中一個通道轉換完成後,組(或序列 Sequence)中的下一個通道會自動開始進行轉換,若啓用了 Continuous conversion mode(CONT=1
),當 Regular 組的最後一個通道轉換完後,會繼續從組中的第一個通道重新開始另一輪轉換,不會停止。
由於 Regular 組只有一個 16 位元的資料暫存器,所以通常會搭配 DMA 來存取轉換完成的資料,避免資料被下一個通道的資料覆蓋。而 Injected 組的 4 個通道都有自己獨立且專用的 16 位元資料暫存器,故其轉換完成的資料會儲存進各自的資料暫存器中,不必擔心資料會被其它通道所覆蓋。
此模式透過設定 ADC_CR1 中的 SCAN 位元來啓用。
此模式的概念是可以將組(或序列 Sequence)再分成更短的小組,當觸發轉換時,會以小組爲單位進行轉換,也就是可以不一次轉換組內的全部通道,而是分批掃描。
例如設定 Regular 組所包含的通道依序爲「0,1,2,3,6,7,9,10」,並將小組的長度 n
設爲 3:
此模式透過設定 ADC_CR1 的 DISCEN(對於 Regular)或 JDISCEN(對於 Injected)位元來啓用。Regular 和 Injected 不能同時啓用 Discontinuous mode。
Auto-injected 與 Discontinuous mode 無法同時使用。
Discontinuous mode 與 Continuous conversion mode 雖然名稱相近但其「連續」的意義不同。前者是可以將組再細分成小組,後者是在每次轉換完成後自動觸發下一次的轉換。
ADC 的功能相當複雜與多元,以上也只是簡單介紹最基本的概念,還有很多進階的功能沒有提到,像是 ADC watchdog、Multi ADC 或電池監控等,這些進階的功能可以參考 RM0390(STM32F446RE)。
本文同步發表於我的 Blog。