1. 程式人生 > >【STM32】ADC的基本原理、暫存器(超基礎、詳細版)

【STM32】ADC的基本原理、暫存器(超基礎、詳細版)

STM32F1xx官方資料:

《STM32中文參考手冊V10》-第11章 模擬/數字轉換(ADC)

ADC的基本介紹

ADC的基本定義

Analog-to-Digital Converter的縮寫。指模/數轉換器或者模擬/數字轉換器。是指將連續變數的模擬訊號轉換為離散的數字訊號的器件。

典型的模擬數字轉換器將模擬訊號轉換為表示一定比例電壓值的數字訊號。

ADC的主要特徵

  • 12位逐次逼近型的模擬數字轉換器;
  • 最多帶3個ADC控制器,可以單獨使用,也可以使用雙重模式提高取樣率
  • 最多支援23個通道,可最多測量21個外部和2個內部訊號源;
  • 支援單次和連續轉換模式;
  • 轉換結束,注入轉換結束,和發生模擬看門狗事件時產生中斷;
  • 通道0到通道n的自動掃描模式;
  • 自動校準;
  • 取樣間隔可以按通道程式設計;
  • 規則通道和注入通道均有外部觸發選項;
  • 轉換結果支援左對齊或右對齊方式儲存在16位資料暫存器;
  • ADC轉換時間:最大轉換速率 1us(最大轉換速度為1MHz,在ADCCLK=14M,取樣週期為1.5個ADC時鐘下得到);
  • ADC供電要求:2.4V-3.6V;
  • ADC輸入範圍:VREF- ≤  VIN  ≤  VREF+。

STM32F10x系列晶片ADC通道和引腳對應關係


由上圖中可以看出,STM32F103ZET6帶3個ADC控制器,一共支援23個通道,包括21個外部和2個內部訊號源;但是每個ADC控制器最多隻可以有18個通道,包括16個外部和2個內部訊號源。

ADC的基本原理

ADC的工作框圖


ADC模組的框圖看起來比較複雜,接下來會一點一點地對它進行分析。

ADC引腳

在框圖中最左邊的一列是ADC的各個引腳,它們的名稱、訊號型別和作用見下圖:


一般情況下,VDD是3.3V,VSS接地,相對應的,VDDA是3.3V,VSSA也接地,模擬輸入訊號不要超過VDD(3.3V)。

ADC時鐘配置

框圖中標註的來自ADC預分頻器的ADCCLK是ADC模組的時鐘來源。通常,由時鐘控制器提供的ADCCLK時鐘和PCLK2(APB2時鐘)同步。RCC控制器為ADC時鐘提供一個專用的可程式設計預分頻器。


這裡需要注意一下,一般情況下:不要讓ADC時鐘超過14MHz,否則可能不準。

也就是說,如果按照預設設定PCLK2為72MHz,此時應為6分頻或者8分頻。

ADC中斷

在框圖中的最頂部,顯示ADC的各種中斷。很顯然可以看出:規則和注入組轉換結束時能產生中斷,當模擬看門狗狀態位被設定時也能產生中斷。它們都有獨立的中斷使能位。 

注: ADC1和ADC2的中斷對映在同一個中斷向量上,而ADC3的中斷有自己的中斷向量。


ADC中斷事件的具體型別有三種,具體見下圖:

ADC通道選擇

之前說到ADC規則組轉換轉換結束、注入組轉換結束可以產生中斷,那麼什麼是規則組、注入組呢?這就是框圖中的中間部位。

STM32的ADC控制器有很多通道,所以模組通過內部的模擬多路開關,可以切換到不同的輸入通道並進行轉換。STM32特別地加入了多種成組轉換的模式,可以由程式設定好之後,對多個模擬通道自動地進行逐個地取樣轉換。它們可以組織成兩組:規則通道組和注入通道組。

例如,可以如下順序完成轉換:通道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以轉換新選擇的組。

可能單從字面上還是不是很瞭解?我們可以通過圖形來更直觀地認知:


一個不太恰當的比喻是:規則通道組的轉換好比是程式的正常執行,而注入通道組的轉換則好比是程式正常執行之外的一箇中斷處理程式。

ADC轉換方式

STM32的ADC的各通道可以組成規則通道組或注入通道組,但是在轉換方式還可以有單次轉換、連續轉換、掃描轉換模式

單次轉換模式

單次轉換模式下,ADC只執行一次轉換。該模式既可通過設定ADC_CR2暫存器的ADON位(只適用於規則通道)啟動也可通過外部觸發啟動(適用於規則通道或注入通道),這時CONT位為0。 


連續轉換模式

在連續轉換模式中,當前面ADC轉換一結束馬上就啟動另一次轉換。此模式可通過外部觸發啟動或通過設定ADC_CR2暫存器上的ADON位啟動,此時CONT位是1。


掃描模式

此模式用來掃描一組模擬通道。

掃描模式可通過設定ADC_CR1暫存器的SCAN位來選擇。一旦這個位被設定,ADC掃描所有被ADC_SQRX暫存器(對規則通道)或ADC_JSQR(對注入通道)選中的所有通道。在每個組的每個通道上執行單次轉換。在每個轉換結束時,同一組的下一個通道被自動轉換。如果設定了CONT位,轉換不會在選擇組的最後一個通道上停止,而是再次從選擇組的第一個通道繼續轉換。


這裡需要注意的是:如果在使用掃描模式的情況下使用中斷,會在最後一個通道轉換完畢後才會產生中斷。而連續轉換,是在每次轉換後,都會產生中斷。

如果設定了DMA位,在每次EOC後,DMA控制器把規則組通道的轉換資料傳輸到SRAM中。而注入通道轉換的資料總是儲存在ADC_JDRx暫存器中。

模擬看門狗

ADC中斷的產生方式除了規則組轉換完成、注入組轉換完成之外,還有模擬看門狗事件。

如果被ADC轉換的模擬電壓低於低閥值或高於高閥值,AWD模擬看門狗狀態位被設定。閥值位於ADC_HTR和ADC_LTR暫存器的最低12個有效位中。通過設定ADC_CR1暫存器的AWDIE位以允許產生相應中斷。

需要注意的是:閥值獨立於由ADC_CR2暫存器上的ALIGN位選擇的資料對齊模式。比較是在對齊之前完成的。也就是說,在資料儲存到資料暫存器之前,就已經完成了比較(資料對齊在下文中有講解)!

通過配置ADC_CR1暫存器,模擬看門狗可以作用於1個或多個通道:


外部觸發轉換

在框圖的下方,顯示了規則轉換、注入轉換可以由外部事件觸發(比如定時器捕捉、EXTI線)。如果設定了EXTTRIG控制位,則外部事件就能夠觸發轉換。EXTSEL[2:0]和JEXTSEL2:0]控制位允許應用程式選擇8個可能的事件中的某一個,可以觸發規則和注入組的取樣。

注意: 當外部觸發訊號被選為ADC規則或注入轉換時,只有它的上升沿可以啟動轉換

自動校準

校準ADC有一個內建自校準模式。校準可大幅減小因內部電容器組的變化而造成的準精度誤差。在校準期間,在每個電容器上都會計算出一個誤差修正碼(數字值),這個碼用於消除在隨後的轉換中每個電容器上產生的誤差。

通過設定ADC_CR2暫存器的CAL位啟動校準。一旦校準結束,CAL位被硬體復位,可以開始正常轉換。建議在上電時執行一次ADC校準。校準階段結束後,校準碼儲存在ADC_DR中。


注意:建議在每次上電後執行一次校準。同時啟動校準前,ADC必須處於關電狀態(ADON=0)超過至少兩個ADC時鐘週期。

資料對齊

由於STM32的ADC是12位逐次逼近型的模擬數字轉換器,而資料儲存在16位暫存器中。所以,ADC_CR2暫存器中的ALIGN位選擇轉換後資料儲存的對齊方式。資料可以左對齊或右對齊,如下圖所示:


  • 注入組通道轉換的資料值已經減去了在ADC_JOFRx暫存器中定義的偏移量,因此結果可以是一個負值。SEXT位是擴充套件的符號值。 
  • 對於規則組通道,不需減去偏移值,因此只有12個位有效。

通道取樣時間

ADC使用若干個ADC_CLK週期對輸入電壓取樣,取樣週期數目可以通過ADC_SMPR1和ADC_SMPR2暫存器中的SMP[2:0]位更改。每個通道可以分別用不同的時間取樣。

總轉換時間如下計算:

TCONV = 取樣時間+ 12.5個週期

例如:當ADCCLK=14MHz,取樣時間為1.5週期時,TCONV =1.5+12.5=14週期=1μs。

故而,ADC的最小取樣時間1us(ADC時鐘=14MHz,取樣週期為1.5週期下得到)

ADC相關配置暫存器

ADC控制暫存器1(ADC_CR1)


作用:設定掃描模式、中斷允許(轉換結束、注入轉換結束、模擬看門狗)、雙模式選擇(一般選用獨立模式)等。

注意:在掃描模式下,由ADC_SQRx或者ADC_JSQRx暫存器選中的通道被轉換。如果設定了EOCIE或者JEOCIE,在最後一個通道轉換完畢後才會產生EOC或者JEOC中斷。

ADC控制暫存器2(ADC_CR2)


作用:設定資料對齊方式、連續轉換位、ADC啟動位、外部觸發轉換(一般選用軟體轉換SWSTART、JSWSTART)

ADC取樣時間暫存器x(ADC_SMPRx)


作用:設定ADC各通道的取樣時間。

ADC注入通道資料偏移暫存器x (ADC_JOFRx)


作用:設定ADC注入通道資料偏移。

ADC看門狗高/低閥值暫存器(ADC_HTR、ADC_LRT)


作用:設定ADC模擬看門狗的高低閾值。

ADC規則序列暫存器x(ADC_SQRx)


作用:設定規則通道序列長度、對應序列中各個轉換的通道編號(最多16個)

ADC注入序列暫存器(ADC_JSQR)


作用:設定注入通道序列長度、對應序列中各個轉換的通道編號(最多4個)

ADC注入資料暫存器x(ADC_JDRx)


作用:存放ADC注入轉換的資料。

ADC規則資料暫存器(ADC_DR)


作用:存放ADC規則轉換的資料。

ADC狀態暫存器(ADC_SR)


作用:存放ADC轉換過程中的各種狀態位。