ADC介紹
12位ADC是一種逐次逼近型模拟數字轉換器。它有多達18個通道,可測量16個外部和2個内部 信号源。各通道的A/D轉換可以單次、連續、掃描或間斷模式執行。ADC的結果可以左對齊或右 對齊方式存儲在16位資料寄存器中。
模拟看門狗特性允許應用程式檢測輸入電壓是否超出使用者定義的高/低閥值。
ADC的輸入時鐘不得超過14MHz,它是由PCLK2經分頻産生。
ADC特性
● 12位分辨率
● 轉換結束、注入轉換結束和發生模拟看門狗事件時産生中斷
● 單次和連續轉換模式
● 從通道0到通道n的自動掃描模式
● 自校準 ● 帶内嵌資料一緻性的資料對齊
● 采樣間隔可以按通道分别程式設計
● 規則轉換和注入轉換均有外部觸發選項
● 間斷模式
● 雙重模式(帶2個或以上ADC的器件)
● ADC轉換時間:
─ STM32F103xx增強型産品:時鐘為56MHz時為1μs(時鐘為72MHz為1.17μs)
● ADC供電要求:2.4V到3.6V
● ADC輸入範圍:VREF- ≤ VIN ≤ VREF+
● 規則通道轉換期間有DMA請求産生。
ADC功能描述
1.ADC電壓輸入範圍
ADC所能測量的電壓範圍就是VREF- ≤ VIN ≤ VREF+,把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的輸入電壓範圍為: 0~3.3V。
2.輸入通道
ADC的信号輸入就是通過通道來實作的,信号通過通道輸入到單片機中,單片機經過轉換後,将模拟信号輸出為數字信号。STM32中的ADC有着18個通道,其中外部的16個通道已經在框圖中标出,如下:
ADC的全部通道:
外部的16個通道在轉換時又分為規則通道和注入通道,其中規則通道最多有16路,注入通道最多有4路。
規則通道
規則通道顧名思義即最常用的通道,單個使用ADC轉換都是用規則通道實作的。
注入通道
規則通道相當于你正常運作的程式,而注入通道呢,就相當于"中斷"。在你的程式正常執行的時候,中斷是可以打斷你的執行的。同這個類似,注入通道的轉換可以打斷規則通道的轉換,在注入通道被轉換完成之後,規則通道才得以繼續轉換。
3.轉換順序
有16個多路通道。可以把轉換組織成兩組:規則組和注入組。在任意多個通道上以任意順序進 行的一系列轉換構成成組轉換。例如,可以如下順序完成轉換:通道3、通道8、通道2、通道 2、通道0、通道2、通道2、通道15。
● 規則組由多達16個轉換組成。規則通道和它們的轉換順序在ADC_SQRx寄存器中選擇。規 則組中轉換的總數應寫入ADC_SQR1寄存器的L[3:0]位中。
● 注入組由多達4個轉換組成。注入通道和它們的轉換順序在ADC_JSQR寄存器中選擇。注入 組裡的轉換總數目應寫入ADC_JSQR寄存器的L[1:0]位中。
如果ADC_SQRx或ADC_JSQR寄存器在轉換期間被更改,目前的轉換被清除,一個新的啟動脈 沖将發送到ADC以轉換新選擇的組。
規則通道轉換順序
規則通道中的轉換順序由三個寄存器控制:SQR1、SQR2、SQR3,它們都是32位寄存器。SQR寄存器控制着轉換通道的數目和轉換順序,隻要在對應的寄存器位SQx中寫入相應的通道,這個通道就是第x個轉換。
注入通道轉換順序
和規則通道轉換順序的控制一樣,注入通道的轉換也是通過注入寄存器來控制,隻不過隻有一個JSQR寄存器來控制,控制關系如下:
需要注意的是,隻有當JL=4的時候,注入通道的轉換順序才會按照JSQ1、JSQ2、JSQ3、JSQ4的順序執行。當JL=3時,執行順序為:JSQ2、JSQ3、JSQ4。當JL=2時,執行順序為:JSQ3、JSQ4。當JL=1時,執行順序為:JSQ4。
4.觸發源
ADC轉換的輸入、通道、轉換順序都已經說明了,但ADC轉換是怎麼觸發的呢?就像通信協定一樣,都要規定一個起始信号才能傳輸資訊,ADC也需要一個觸發信号來實行模/數轉換。
其一就是通過直接配置寄存器觸發,通過配置控制寄存器CR2的ADON位,寫1時開始轉換,寫0時停止轉換。在程式運作過程中隻要調用庫函數,将CR2寄存器的ADON位置1就可以進行轉換,比較好了解。
另外,還可以通過内部定時器或者外部IO觸發轉換,也就是說可以利用内部時鐘讓ADC進行周期性的轉換,也可以利用外部IO使ADC在需要時轉換,具體的觸發由控制寄存器CR2決定。
ADC_CR2寄存器的詳情如下:
5.轉換時間
ADC的每一次信号轉換都要時間,這個時間就是轉換時間,轉換時間由輸入時鐘和采樣周期來決定。
輸入時鐘
由于ADC在STM32中是挂載在APB2總線上的,是以ADC得時鐘是由PCLK2(72MHz)經過分頻得到的,分頻因子由 RCC 時鐘配置寄存器RCC_CFGR 的位 15:14 ADCPRE[1:0]設定,可以是 2/4/6/8 分頻。(ADC的輸入時鐘不得超過14MHz)
采樣周期
ADC使用若幹個ADC_CLK周期對輸入電壓采樣,采樣周期數目可以通過ADC_SMPR1和 ADC_SMPR2寄存器中的SMP[2:0]位更改。ADC_SMPR2 控制的是通道 0~9, ADC_SMPR1 控制的是通道 10~17。
每個通道可以分别用不同的時間采樣,但最小的采樣周期是1.5個周期,也就是說如果想最快時間采樣就設定采樣周期為1.5.
轉換時間
轉換時間= 采樣時間+ 12.5個周期
例:當ADCCLK=14MHz,采樣時間為1.5周期 TCONV = 1.5 + 12.5 = 14周期 = 1μs
6.資料寄存器
轉換完成後的資料就存放在資料寄存器中,但資料的存放也分為規則通道轉換資料和注入通道轉換資料的。
規則資料寄存器
規則資料寄存器負責存放規則通道轉換的資料,通過32位寄存器ADC_DR來存放。
當使用ADC獨立模式(也就是隻使用一個ADC,可以使用多個通道)時,資料存放在低16位中,當使用ADC多模式時高16位存放ADC2的資料。需要注意的是ADC轉換的精度是12位,而寄存器中有16個位來存放資料,是以要規定資料存放是左對齊還是右對齊。
當使用多個通道轉換資料時,會産生多個轉換資料,然鵝資料寄存器隻有一個,多個資料存放在一個寄存器中會覆寫資料導緻ADC轉換錯誤,是以我們經常在一個通道轉換完成之後就立刻将資料取出來,友善下一個資料存放。一般開啟DMA模式将轉換的資料,傳輸在一個數組中,程式對數組讀操作就可以得到轉換的結果。
注入資料寄存器
注入通道轉換的資料寄存器有4個,由于注入通道最多有4個,是以注入通道轉換的資料都有固定的存放位置,不會跟規則寄存器那樣産生資料覆寫的問題。 ADC_JDRx 是 32 位的,低 16 位有效,高 16 位保留,資料同樣分為左對齊和右對齊,具體是以哪一種方式存放,由ADC_CR2 的 11 位 ALIGN 設定。
7.中斷
從框圖中可以知道資料轉換完成之後可以産生中斷,有三種情況:
規則通道轉換完成中斷
規則通道資料轉換完成之後,可以産生一個中斷,可以在中斷函數中讀取規則資料寄存器的值。這也是單通道時讀取資料的一種方法。
注入通道轉換完成中斷
注入通道資料轉換完成之後,可以産生一個中斷,并且也可以在中斷中讀取注入資料寄存器的值,達到讀取資料的作用。
模拟看門狗事件
當輸入的模拟量(電壓)不再門檻值範圍内就會産生看門狗事件,就是用來監視輸入的模拟量是否正常。
以上中斷的配置都由ADC_SR寄存器決定:
規則和注入組轉換結束時能産生中斷,當模拟看門狗狀态位被設定時也能産生中斷。它們都有 獨立的中斷使能位。
注: ADC1和ADC2的中斷映射在同一個中斷向量上,而ADC3的中斷有自己的中斷向量。 ADC_SR寄存器中有2個其他标志,但是它們沒有相關聯的中斷:
● JSTRT(注入組通道轉換的啟動)
● STRT(規則組通道轉換的啟動)
8.電壓轉換
轉換後的資料是一個12位的二進制數,我們需要把這個二進制數代表的模拟量(電壓)用數字表示出來。
比如測量的電壓範圍是0~3.3V,轉換後的二進制數是x,因為12位ADC在轉換時将電壓的範圍大小也就是3.3分為4096份,是以真實電壓的計算方法就是:y=3.3* x / 4096
9.資料對齊
ADC_CR2寄存器中的ALIGN位選擇轉換後資料儲存的對齊方式。資料可以左對齊或右對齊。
注入組通道轉換的資料值已經減去了在ADC_JOFRx寄存器中定義的偏移量,是以結果可以是一 個負值。
SEXT位是擴充的符号值。 對于規則組通道,不需減去偏移值,是以隻有12個位有效。
ADC初始化
ADC配置函數
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //禁止掃描模式,多通道時使用
hadc1.Init.ContinuousConvMode = DISABLE; //禁止連續轉換模式
hadc1.Init.DiscontinuousConvMode = DISABLE; //禁止間斷模式
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;//不使用外部觸發轉換,采用軟體觸發
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //資料結構右對齊
hadc1.Init.NbrOfConversion = 1; //一個轉換通道
HAL_ADC_Init(&hadc1)
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; // ADC内部通道(裝置引腳上沒有連接配接)
sConfig.Rank = ADC_REGULAR_RANK_1; //規則通道1
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; //采樣時間1.5 ADC時鐘周期
HAL_ADC_ConfigChannel(&hadc1, &sConfig)
}
ADC函數
(1)HAL_ADC_Start
功能:開啟ADC
例:HAL_ADC_Start(&hadc1);
說明:hadc1由STM32Cube自動生成,為結構體變量
(2)HAL_ADC_PollForConversion
功能:等待轉化完成,完成跳過
例:HAL_ADC_PollForConversion(&hadc1,100);
說明:表示等待轉換完成.第一空填寫第個ADC,第二個填寫逾時時間或最多等多久(機關為毫秒)
(3)HAL_ADC_GetValue(&hadc1)
功能:讀取ADC轉換資料,資料為12位(最大為4096)。
(4)HAL_ADC_GetState(&hadc1)
功能:為換取ADC狀态,
(5)HAL_ADC_STATE_REG_EOC
功能:表示轉換完成标志位,轉換資料可用。
(6)HAL_IS_BIT_SET(XX, XX)
例:HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)
說明:就是判斷轉換完成标志位是否設定。