STM32F4學(xué)習(xí)筆記13——ADC part1
ADC 簡介
12 位 ADC 是逐次趨近型模數(shù)轉(zhuǎn)換器。它具有多達(dá) 19 個(gè)復(fù)用通道,可測量來自 16 個(gè)外部 源、兩個(gè)內(nèi)部源和 VBAT 通道的信號(hào)。這些通道的 A/D 轉(zhuǎn)換可在單次、連續(xù)、掃描或不連續(xù) 采樣模式下進(jìn)行。ADC 的結(jié)果存儲(chǔ)在一個(gè)左對齊或右對齊的 16 位數(shù)據(jù)寄存器中。
ADC 具有模擬看門狗特性,允許應(yīng)用檢測輸入電壓是否超過了用戶自定義的閾值上限或下限。
ADC 主要特性
● 可配置 12 位、10 位、8 位或 6 位分辨率
● 在轉(zhuǎn)換結(jié)束、注入轉(zhuǎn)換結(jié)束以及發(fā)生模擬看門狗或溢出事件時(shí)產(chǎn)生中斷
● 單次和連續(xù)轉(zhuǎn)換模式
● 用于自動(dòng)將通道 0 轉(zhuǎn)換為通道“n”的掃描模式
● 數(shù)據(jù)對齊以保持內(nèi)置數(shù)據(jù)一致性
● 可獨(dú)立設(shè)置各通道采樣時(shí)間
● 外部觸發(fā)器選項(xiàng),可為規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換配置極性
● 不連續(xù)采樣模式
● 雙重/三重模式(具有 2 個(gè)或更多 ADC 的器件提供)
● 雙重/三重 ADC 模式下可配置的 DMA 數(shù)據(jù)存儲(chǔ)
● 雙重/三重交替模式下可配置的轉(zhuǎn)換間延遲
● ADC 轉(zhuǎn)換類型(參見數(shù)據(jù)手冊)
● ADC 電源要求:全速運(yùn)行時(shí)為 2.4 V 到 3.6 V,慢速運(yùn)行時(shí)為 1.8 V
● ADC 輸入范圍:VREF— ? VIN ? VREF+
● 規(guī)則通道轉(zhuǎn)換期間可產(chǎn)生 DMA 請求
圖 34 顯示了 ADC 的框圖。
注意:VREF— 如果可用(取決于封裝),則必須將其連接到 VSSA
ADC 功能說明
ADC 開關(guān)控制
可通過將 ADC_CR2 寄存器中的 ADON 位置 1 來為 ADC 供電。首次將 ADON 位置 1 時(shí), 會(huì)將 ADC 從掉電模式中喚醒。
SWSTART 或 JSWSTART 位置 1 時(shí),啟動(dòng) AD 轉(zhuǎn)換。
可通過將 ADON 位清零來停止轉(zhuǎn)換并使 ADC 進(jìn)入掉電模式。在此模式下,ADC 幾乎不耗電 (只有幾 μA)。
ADC 時(shí)鐘
ADC 具有兩個(gè)時(shí)鐘方案:
● 用于模擬電路的時(shí)鐘:ADCCLK,所有 ADC 共用
此時(shí)鐘來自于經(jīng)可編程預(yù)分頻器分頻的 APB2 時(shí)鐘,該預(yù)分頻器允許 ADC 在 fPCLK2/2、/4、/6 或 /8 下工作。有關(guān) ADCCLK 的最大值,請參見數(shù)據(jù)手冊。
● 用于數(shù)字接口的時(shí)鐘(用于寄存器讀/寫訪問)
此時(shí)鐘等效于 APB2 時(shí)鐘??梢酝ㄟ^ RCC APB2 外設(shè)時(shí)鐘使能寄存器 (RCC_APB2ENR)分別為每個(gè) ADC 使能/禁止數(shù)字接口時(shí)鐘。
通道選擇
有 16 條復(fù)用通道??梢詫⑥D(zhuǎn)換分為兩組:規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換。每個(gè)組包含一個(gè)轉(zhuǎn)換序列, 該序列可按任意順序在任意通道上完成。例如,可按以下順序?qū)π蛄羞M(jìn)行轉(zhuǎn)換:ADC_IN3、ADC_IN8、ADC_IN2、ADC_IN2、ADC_IN0、ADC_IN2、ADC_IN2、ADC_IN15。
● 一個(gè)規(guī)則轉(zhuǎn)換組最多由 16 個(gè)轉(zhuǎn)換構(gòu)成。必須在 ADC_SQRx 寄存器中選擇轉(zhuǎn)換序列的規(guī)
則通道及其順序。規(guī)則轉(zhuǎn)換組中的轉(zhuǎn)換總數(shù)必須寫入 ADC_SQR1 寄存器中的 L[3:0] 位。
● 一個(gè)注入轉(zhuǎn)換組最多由 4 個(gè)轉(zhuǎn)換構(gòu)成。必須在 ADC_JSQR 寄存器中選擇轉(zhuǎn)換序列的注入
通道及其順序。注入轉(zhuǎn)換組中的轉(zhuǎn)換總數(shù)必須寫入 ADC_JSQR 寄存器中的 L[1:0] 位。
如果在轉(zhuǎn)換期間修改 ADC_SQRx 或 ADC_JJSQR 寄存器,將復(fù)位當(dāng)前轉(zhuǎn)換并向 ADC 發(fā)送一個(gè)新的啟動(dòng)脈沖,以轉(zhuǎn)換新選擇的組。
溫度傳感器、VREFINT 和 VBAT 內(nèi)部通道
● 對于 STM32F40x 和 STM32F41x 器件,溫度傳感器內(nèi)部連接到通道 ADC1_IN16。
內(nèi)部參考電壓 VREFINT 連接到 ADC1_IN17。
● 對于 STM23F42x 和 STM32F43x 器件,溫度傳感器內(nèi)部連接到與 VBAT 共用的通道ADC1_IN18。一次只能選擇一個(gè)轉(zhuǎn)換(溫度傳感器或 VBAT)。同時(shí)設(shè)置了溫度傳感器和 VBAT 轉(zhuǎn)換時(shí),將只進(jìn)行 VBAT 轉(zhuǎn)換。
內(nèi)部參考電壓 VREFINT 連接到 ADC1_IN17。
VBAT 通道連接到通道 ADC1_IN18。該通道也可轉(zhuǎn)換為注入通道或規(guī)則通道。
注意:溫度傳感器、VREFINT 和 VBAT 通道只在主 ADC1 外設(shè)上可用。
單次轉(zhuǎn)換模式
在單次轉(zhuǎn)換模式下,ADC 執(zhí)行一次轉(zhuǎn)換。CONT 位為 0 時(shí),可通過以下方式啟動(dòng)此模式:
● 將 ADC_CR2 寄存器中的 SWSTART 位置 1(僅適用于規(guī)則通道)
● 將 JSWSTART 位置 1(適用于注入通道)
● 外部觸發(fā)(適用于規(guī)則通道或注入通道)
完成所選通道的轉(zhuǎn)換之后:
● 如果轉(zhuǎn)換了規(guī)則通道:
— 轉(zhuǎn)換數(shù)據(jù)存儲(chǔ)在 16 位 ADC_DR 寄存器中
— EOC(轉(zhuǎn)換結(jié)束)標(biāo)志置 1
— EOCIE 位置 1 時(shí)將產(chǎn)生中斷
● 如果轉(zhuǎn)換了注入通道:
— 轉(zhuǎn)換數(shù)據(jù)存儲(chǔ)在 16 位 ADC_JDR1 寄存器中
— JEOC(注入轉(zhuǎn)換結(jié)束)標(biāo)志置 1
— JEOCIE 位置 1 時(shí)將產(chǎn)生中斷
然后,ADC 停止。
連續(xù)轉(zhuǎn)換模式
在連續(xù)轉(zhuǎn)換模式下,ADC 結(jié)束一個(gè)轉(zhuǎn)換后立即啟動(dòng)一個(gè)新的轉(zhuǎn)換。CONT 位為 1 時(shí),可通過外部觸發(fā)或?qū)?ADC_CR2 寄存器中的 SWSTRT 位置 1 來啟動(dòng)此模式(僅適用于規(guī)則通道)。
每次轉(zhuǎn)換之后:
● 如果轉(zhuǎn)換了規(guī)則通道組:
— 上次轉(zhuǎn)換的數(shù)據(jù)存儲(chǔ)在 16 位 ADC_DR 寄存器中
— EOC(轉(zhuǎn)換結(jié)束)標(biāo)志置 1
— EOCIE 位置 1 時(shí)將產(chǎn)生中斷
注意:無法連續(xù)轉(zhuǎn)換注入通道。連續(xù)模式下唯一的例外情況是,注入通道配置為在規(guī)則通道之后自動(dòng)轉(zhuǎn)換(使用 JAUTO 位),請參見自動(dòng)注入一節(jié)。
時(shí)序圖
ADC 在開始精確轉(zhuǎn)換之前需要一段穩(wěn)定時(shí)間 tSTAB。ADC 開始轉(zhuǎn)換并經(jīng)過 15 個(gè) 時(shí)鐘周期后,EOC 標(biāo)志置 1,轉(zhuǎn)換結(jié)果存放在 16 位 ADC 數(shù)據(jù)寄存器中。
模擬看門狗
如果 ADC 轉(zhuǎn)換的模擬電壓低于閾值下限或高于閾值上限,則 AWD 模擬看門狗狀態(tài)位會(huì)置 1。這些閾值在 ADC_HTR 和 ADC_LTR 16 位寄存器的 12 個(gè)最低有效位中進(jìn)行編程??梢?使用 ADC_CR1 寄存器中的 AWDIE 位使能中斷。
閾值與 ADC_CR2 寄存器中的 ALIGN 位的所選對齊方式無關(guān)。在對齊之前,會(huì)將模擬電壓 與閾值上限和下限進(jìn)行比較。
下表介紹了應(yīng)如何配置 ADC_CR1 寄存器才能在一個(gè)或多個(gè)通道上使能模擬看門狗。
掃描模式
此模式用于掃描一組模擬通道。
通過將 ADC_CR1 寄存器中的 SCAN 位置 1 來選擇掃描模式。將此位置 1 后,ADC 會(huì)掃描 在 ADC_SQRx 寄存器(對于規(guī)則通道)或 ADC_JSQR 寄存器(對于注入通道)中選擇的 所有通道。為組中的每個(gè)通道都執(zhí)行一次轉(zhuǎn)換。每次轉(zhuǎn)換結(jié)束后,會(huì)自動(dòng)轉(zhuǎn)換該組中的下一個(gè)通道。如果將 CONT 位置 1,規(guī)則通道轉(zhuǎn)換不會(huì)在組中最后一個(gè)所選通道處停止,而是再 次從第一個(gè)所選通道繼續(xù)轉(zhuǎn)換。
如果將 DMA 位置 1,則在每次規(guī)則通道轉(zhuǎn)換之后,均使用直接存儲(chǔ)器訪問 (DMA) 控制器將 轉(zhuǎn)換自規(guī)則通道組的數(shù)據(jù)(存儲(chǔ)在 ADC_DR 寄存器中)傳輸?shù)?SRAM。
在以下情況下,ADC_SR 寄存器中的 EOC 位置 1:
● 如果 EOCS 位清零,在每個(gè)規(guī)則組序列轉(zhuǎn)換結(jié)束時(shí)
● 如果 EOCS 位置 1,在每個(gè)規(guī)則通道轉(zhuǎn)換結(jié)束時(shí)
從注入通道轉(zhuǎn)換的數(shù)據(jù)始終存儲(chǔ)在 ADC_JDRx 寄存器中。
注入通道管理
觸發(fā)注入
要使用觸發(fā)注入,必須將 ADC_CR1 寄存器中的 JAUTO 位清零。
1.通過外部觸發(fā)或?qū)?ADC_CR2 寄存器中的 SWSTART 位置 1 來啟動(dòng)規(guī)則通道組轉(zhuǎn)換。
2. 如果在規(guī)則通道組轉(zhuǎn)換期間出現(xiàn)外部注入觸發(fā)或者 JSWSTART 位置 1,則當(dāng)前的轉(zhuǎn)換 會(huì)復(fù)位,并且注入通道序列會(huì)切換為單次掃描模式。
3. 然后,規(guī)則通道組的規(guī)則轉(zhuǎn)換會(huì)從上次中斷的規(guī)則轉(zhuǎn)換處恢復(fù)。
如果在注入轉(zhuǎn)換期間出現(xiàn)規(guī)則事件,注入轉(zhuǎn)換不會(huì)中斷,但在注入序列結(jié)束時(shí)會(huì)執(zhí)行規(guī)則序列。圖 37 顯示了相應(yīng)的時(shí)序圖。
注意:使用觸發(fā)注入時(shí),必須確保觸發(fā)事件之間的間隔長于注入序列。例如,如果序列長度為 30 個(gè) ADC 時(shí)鐘周期(即,采樣時(shí)間為 3 個(gè)時(shí)鐘周期的兩次轉(zhuǎn)換),則觸發(fā)事件的最小間隔不能 小于 31 個(gè) ADC 時(shí)鐘周期。
自動(dòng)注入
如果將 JAUTO 位置 1,則注入組中的通道會(huì)在規(guī)則組通道之后自動(dòng)轉(zhuǎn)換。這可用于轉(zhuǎn)換最 多由 20 個(gè)轉(zhuǎn)換構(gòu)成的序列,這些轉(zhuǎn)換在 ADC_SQRx 和 ADC_JSQR 寄存器中編程。
在此模式下,必須禁止注入通道上的外部觸發(fā)。
如果 CONT 位和 JAUTO 位均已置 1,則在轉(zhuǎn)換規(guī)則通道之后會(huì)繼續(xù)轉(zhuǎn)換注入通道。
注意:不能同時(shí)使用自動(dòng)注入和不連續(xù)采樣模式。
不連續(xù)采樣模式
規(guī)則組
可將 ADC_CR1 寄存器中的 DISCEN 位置 1 來使能此模式。該模式可用于轉(zhuǎn)換含有 n (n ? 8) 個(gè)轉(zhuǎn)換的短序列,該短序列是在 ADC_SQRx 寄存器中選擇的轉(zhuǎn)換序列的一部分??赏ㄟ^寫 入 ADC_CR1 寄存器中的 DISCNUM[2:0] 位來指定 n 的值。
出現(xiàn)外部觸發(fā)時(shí),將啟動(dòng)在 ADC_SQRx 寄存器中選擇的接下來 n 個(gè)轉(zhuǎn)換,直到序列中的所 有轉(zhuǎn)換均完成為止。通過 ADC_SQR1 寄存器中的 L[3:0] 位定義總序列長度。
示例:
n = 3,要轉(zhuǎn)換的通道 = 0、1、2、3、6、7、9、10?
第 1 次觸發(fā):轉(zhuǎn)換序列 0、1、2?
第 2 次觸發(fā):轉(zhuǎn)換序列 3、6、7?
第 3 次觸發(fā):轉(zhuǎn)換序列 9、10 并生成 EOC 事件
第 4 次觸發(fā):轉(zhuǎn)換序列 0、1、2
注意:在不連續(xù)采樣模式下轉(zhuǎn)換規(guī)則組時(shí),不會(huì)出現(xiàn)翻轉(zhuǎn)。
轉(zhuǎn)換完所有子組后,下一個(gè)觸發(fā)信號(hào)將啟動(dòng)第一個(gè)子組的轉(zhuǎn)換。在上述示例中,第 4 次觸發(fā) 重新轉(zhuǎn)換了第 1 個(gè)子組中的通道 0、1 和 2。
注入組
可將 ADC_CR1 寄存器中的 JDISCEN 位置 1 來使能此模式。在出現(xiàn)外部觸發(fā)事件之后,可 使用該模式逐通道轉(zhuǎn)換在 ADC_JSQR 寄存器中選擇的序列。
出現(xiàn)外部觸發(fā)時(shí),將啟動(dòng)在 ADC_JSQR 寄存器中選擇的下一個(gè)通道轉(zhuǎn)換,直到序列中的所 有轉(zhuǎn)換均完成為止。通過 ADC_JSQR 寄存器中的 JL[1:0] 位定義總序列長度。
示例:
n = 1,要轉(zhuǎn)換的通道 = 1、2、3
第 1 次觸發(fā):轉(zhuǎn)換通道 1 、2、3
第 2 次觸發(fā):轉(zhuǎn)換通道 2
第 3 次觸發(fā):轉(zhuǎn)換通道 3 并生成 EOC 和 JEOC 事件
第 4 次觸發(fā):通道 1
注意:轉(zhuǎn)換完所有注入通道后,下一個(gè)觸發(fā)信號(hào)將啟動(dòng)第一個(gè)注入通道的轉(zhuǎn)換。在上述示例中,第 4 次觸發(fā)重新轉(zhuǎn)換了第 1 個(gè)注入通道。
不能同時(shí)使用自動(dòng)注入和不連續(xù)采樣模式。
不得同時(shí)為規(guī)則組和注入組設(shè)置不連續(xù)采樣模式。只能針對一個(gè)組使能不連續(xù)采樣模式。