STM32F407 ADC 模式詳解:單次轉換、連續轉換、掃描模式、非掃描模式
前言
在 STM32F407 中,ADC(模數轉換器)模塊常用于采集模擬信號,比如讀取光敏電阻、電壓、電流、溫度傳感器等。STM32 的 ADC 模式較多,初學者常常會混淆:
- 單次轉換和連續轉換的區別
- 掃描模式和非掃描模式分別用于什么場景
本篇文章將全面講解 STM32F407 中 ADC 的四種核心工作模式,帶你從概念到應用搞懂它們的配置和組合。
一、ADC 模式分類總覽
STM32F407 的 ADC 模式可以從兩個維度理解:
分類方向 | 模式名稱 | 功能說明 |
---|---|---|
轉換行為 | 單次轉換模式 | 轉換一次即停止,不自動繼續 |
連續轉換模式 | 一次啟動后自動不斷采樣 | |
通道采樣方式 | 掃描模式 | 支持多個通道依次采樣 |
非掃描模式 | 只采樣一個通道 |
這兩個方向的模式可以自由組合使用,形成不同的采樣邏輯,例如“連續+非掃描”、“單次+掃描”等。
二、單次轉換模式(Single Conversion Mode)
詳細解釋(通俗+專業)
在單次轉換模式下,ADC 只進行一次采樣與轉換,完成后會自動停止。
通俗理解:你按一下按鈕,它就采一口“模擬信號”,轉成數字值,然后就不動了,想要再采一次,必須手動再觸發。
專業說明:
- 控制寄存器:
ADC_CR2.CONT = 0
(關閉連續模式) - 觸發方式:軟件觸發或外部事件
- 一次轉換后,
EOC
(轉換完成標志)位置位,ADC停止工作
使用場景示例:
- 需要用戶操作或定時器觸發時才采樣一次,例如測量溫度、電壓快照等
三、連續轉換模式(Continuous Conversion Mode)
詳細解釋(通俗+專業)
在連續轉換模式下,ADC 在啟動后會自動不斷重復采樣,適用于實時性要求較高的場合。
通俗理解:你一打開開關,它就像一個不停喝水的家伙,一直把模擬信號喝進來轉成數字,除非你強行關掉它。
專業說明:
- 控制寄存器:
ADC_CR2.CONT = 1
(打開連續模式) - 啟動后,ADC 會在每次轉換完成后,自動立即開始下一次
- 通常配合 DMA 或中斷讀取,提高效率
使用場景示例:
- 實時電壓監控、傳感器數據流讀取等
四、掃描模式(Scan Mode)
詳細解釋(通俗+專業)
掃描模式允許 ADC 在一次觸發下,自動依次轉換多個通道的模擬信號,適用于同時采集多個傳感器數據的應用場景。
通俗理解:ADC 就像一個機器人,它按照你設定的清單,依次去采集第1個通道、第2個通道、第3個……直到完成一輪。
專業說明:
- 控制寄存器:
ADC_CR1.SCAN = 1
(打開掃描模式) - 轉換通道順序通過
SQR1~SQR3
配置,例如通道數量、通道順序等 - 每個通道轉換結果會順序寫入
ADC_DR
數據寄存器(通常配合 DMA 搬運)
使用場景示例:
- 項目中使用多個 ADC 輸入(如光敏、電壓、氣體、溫度傳感器),一次采樣全部獲取
五、非掃描模式(No Scan Mode)
詳細解釋(通俗+專業)
非掃描模式是默認模式,表示一次轉換只采樣一個通道的模擬電壓值,適用于只需要采一個信號源的應用場景。
通俗理解:ADC 盯著一個傳感器看,一次只測它,不關心其他通道。
專業說明:
- 控制寄存器:
ADC_CR1.SCAN = 0
(關閉掃描) - 采樣通道由
ADC_SQR3
指定,例如ADC_SQR3 = 5
表示采樣 ADC_IN5 - 數據輸出在
ADC_DR
寄存器中
使用場景示例:
- 項目中只有一個傳感器輸入,邏輯簡單,代碼結構清晰
六、四種模式組合行為匯總
STM32 的這兩類模式是可以任意組合的。以下是組合后的行為總結:
掃描模式 | 連續模式 | 行為描述 |
---|---|---|
關閉 | 關閉 | 只采一個通道,采一次停止 |
關閉 | 開啟 | 只采一個通道,自動不斷采樣 |
開啟 | 關閉 | 多個通道依次采樣,采一輪停止 |
開啟 | 開啟 | 多個通道依次采樣,不斷重復整個過程 |
這些組合中的“多通道自動輪詢”非常適合使用 DMA 自動搬數據,避免主循環里占用 CPU 資源。
七、常見應用組合推薦
實際需求 | 推薦配置 |
---|---|
讀取一個通道,一次采樣 | 非掃描 + 單次轉換 |
實時讀取一個通道 | 非掃描 + 連續轉換 |
輪流讀取多個通道(采一輪) | 掃描 + 單次轉換 |
連續輪流讀取多個通道 | 掃描 + 連續轉換 + DMA |
八、示例代碼(使用寄存器配置)
以下代碼展示了一個連續采樣 ADC_IN10 通道的最簡初始化配置:
void ADC1_Init(void)
{// 1. 打開時鐘RCC->APB2ENR |= (1 << 8); // ADC1 時鐘使能RCC->AHB1ENR |= (1 << 0); // GPIOA 時鐘使能// 2. 設置PA0為模擬模式(假設IN0)GPIOA->MODER |= (3 << (0 * 2)); // 模擬模式// 3. ADC 配置ADC1->CR1 &= ~(1 << 8); // 關閉掃描模式ADC1->CR2 |= (1 << 1); // 開啟連續轉換ADC1->SQR3 = 0; // 通道0ADC1->CR2 |= (1 << 0); // 使能ADCADC1->CR2 |= (1 << 30); // 軟件啟動
}
如果你需要掃描兩個通道,配合 DMA,還可以增加以下配置:
ADC1->CR1 |= (1 << 8); // 開啟掃描模式
ADC1->SQR1 = (2 - 1) << 20; // 轉換2個通道
ADC1->SQR3 = (10 << 0) | (11 << 5); // 第一個是IN10,第二個是IN11
九、結尾總結
STM32F407 的 ADC 模式雖然看起來復雜,但只要掌握以下兩點,就能靈活應對各種應用場景:
- 是否連續轉換?(轉換一次就停 or 一直采樣)
- 是否掃描多個通道?(單通道 or 多通道輪流)
掌握這兩對組合,就能輕松根據項目需求靈活配置 ADC。
如果你正在調試 ADC,建議一開始使用非掃描 + 單次轉換調試通道,然后逐步擴展到掃描 + DMA 模式,循序漸進、效率最高。
如果你需要后續內容如 DMA 配置講解、ADC 中斷讀取等,也可以留言告訴我,后續我會寫專門的篇章補充。希望本文對你有幫助,感謝閱讀。