STM32 ADC #1 基礎功能介紹與重點整理

可根據Reference Manual(RM0008 Page.215),ADC全名是Analog-to-Digital Converter,中文是類比轉數位轉換器。

Outline

ADC Introduction

在下圖Figure-1中,整理出:

  • 使用的是12-bit Resolution的ADC。
  • ADC是successive approximation類型的。
  • 一組ADC能夠依序Measure最多18組的Channel,其中有16個Channel是外部的、2個Channel是內部的。
  • 它擁有4種模式Signal、Continuous、Scan、Discontinuous。
  • 還擁有Analog Watchdog,來偵測輸入電壓是否高於最大值或是小於最小值。
  • ADC Clock是由PCLK2分頻而來的,其不能夠超過14MHz。

ADC main features

接下來會稍微解釋在圖Figure-2中,ADC的主要功能,如下:

12-bit resolution.

ADC會將量測出的結果存於12個bit中,假設 0V <= Vin <= 3.3V,3.3V / (212 – 1) = Volt per step ~= 0.806 mV per step,在12-bit中假如值是4000,則ADC量測到的電壓為4000 x 0.806 mV = 3.2 V。

Interrupt generation at End of Conversion, End of Injected conversion.

不管在Regular或是Injected的轉換結束後,都能夠產生中斷。

Interrupt generation at Analog watchdog event.

當Analog Watchdog event發生,能夠產生中斷。

Signal and continuous conversion modes.

Signal conversion mode是在所選擇的Channel 有一次EOC的事件,並產生Interrupt。

Continuous conversion mode是ADC會連續的轉換,也就是所有選擇到的Channel都會進行轉換,且在每個EOC之後能夠有Interrupt產生。

Scan mode for automatic conversion of channel 0 to channel ‘n’.

當Scan mode被設置時,在Register所選擇之Channels的轉換會依序的轉換下去。(詳細解釋在文章後面)

Self-calibration.

內建校正功能,透過校正能夠提升量測的準確率。

Data alignment with in-built data coherency.

在16-bit Register中,其中有12-bit是量測值,其能夠向左對齊或向右對齊。

Channel by channel programmable sampling time.

可程式化取樣頻率。

External trigger option for both regular and injected conversion.

Regular和Injected的轉換可透過外部觸發。

Discontinuous mode.

與Continuous mode相反,每次的觸發轉換的轉換數量,由使用者決定。

Dual mode (on devices with 2 ADCs or more).

同時間可多個ADC進行轉換。

ADC conversion time.

ADC Clock 是由 PCLK2 分頻,分頻只能夠是2的倍數(2、4、6…),所以當 PCLK2 是 56 MHz,則最快能夠是14 MHz ( = 56 / 4 ),但是當 PCLK2 是72 MHz,ADC Clock最快只能夠是12 MHz ( = 72 / 6 )。(至於為什麼當ADC Clock是14 MHz時轉換時間是1 uS,而 ADC Clock 是12 MHz的時候是1.17 uS,文章後面會在解釋。)

ADC supply requirement: 2.4 V to 3.6 V.

啟用ADC功能必須以2.4 V到3.6 V之間的電壓。

ADC input range: VREF- <= VIN <= VREF+.

ADC量測電壓需大於等於VREF-和小於等於VREF+

DMA request generation during regular channel conversion.

須注意到,在Regular Channel轉換完畢之後,都是儲存於一個獨立的16-bit Register內,所以在連續轉換的情況下,需要以啟用DMA功能將每一筆資料存於使用者指定的地方。

Note: Interrupt和Event區別,以我目前理解為有Event不一定有Interrupt,但有Interrupt一定有Event發生。


Single ADC block Diagram

接下來會對ADC block Diagram加以說明。

在圖Figure-3中,主要分成六個部分,分別為Analog Input、Triggers、ADC、Interrupt、Analog Watchdog、Data Registers。

下方Table是ADC Pins的說明:

  • VREF+,是輸入類型類比訊號,條件 2.4 V <= VREF+ <= VDDA
  • VDDA,是輸入類型類比訊號,條件 2.4 V <= VDDA <= 3.6 V。
  • VREF-,是輸入類型類比訊號,條件 VREF- = VSSA
  • VSSA,是輸入類型類比訊號,條件 VSSA = VSS
  • ADCx_IN[15:0],類比訊號,最多有21個類比Channel。
Table-1 Analog Signal Type & Remarks

Analog Inputs

在下方圖Figure-4以紅框1.中:

ADCx_IN’n’是外部輸入的Analog Signal,輸入至GPIO Ports,再經由Analog MUX輸出給Analog to digital converter。除了外部輸入外,還有兩個內部Analog Signal,分別為Temp. sensor以及VREFINT

ADC Block

ADC

在Figure-5紅框2.中,前面經由Analog MUX,最多可將4個Channel配置成Injected channels、最多16個Channel配置成Regular channels。

其中左上方有4條Signal輸入,分別為VREF+、VREF-、VDDA、VSSA,詳細描述在上方的Table-1中。

ADCCLK來自ADC prescaler再輸入到Analog to digital converter。

還能夠有DMA的請求,直接透過硬體放置到指定的空間。

Triggers

在Figure-6紅框3.中,是Injected Channel的Trigger block擁有外部Trigger EXTI_15以及Timer來Trigger Injected channels的轉換動作。

同樣Figure-6紅框4.中,是Regular Channel德Trigger block擁有外部Trigger EXTI_11以及Timer來Trigger Regular channels的轉換動作。

Data Registers

在Figure-6 ADC block中的Injected(5.) / Regular(6.) Channels轉換出的Data,分別存於Figure-7 Injected data registers以及Regular data register。這裡心細的人就會注意到,Injected channels能夠儲存的register一共有四組(4 x 16-bits),但是Regular channels卻只能夠使用一組的register,這部分會在文章後面,會提到可透過DMA或其他方式,將在Regular channels多個Channel的轉換出的值存於指定空間。

Interrupts

在Figure-8 紅框7.中,是ADC Interrupt block,可看出在圖下方Injected data registers和Regular data register,轉換完成部分分別有EOC和JEOC兩部分,其中Injected或是Regular data register(s)轉換完成之後,都會產生EOC,但是JEOC是針對Injected channels才擁有的Interrupt。

在Figure-8 籃框8.,是Analog watchdog block,有兩組Register分別為High Threshold和Low Threshold主要是用來偵測輸入電位,不能夠高於High Threshold和不能夠小於Low Threshold,當超過指定的範圍,則會產生Interrupt。


ADC Main Functional Description

這小節會對ADC的基本功能,進行更進一步的描述,以及如何使用。

ADC on-off control

  • 啟用ADC : 需設置ADC_CR2 Register中的 ADON bit,如Figure-10和Figure-11。
  • 關閉ADC : 需重置ADC_CR2 Register中的 ADON bit,如Figure-10和Figure-11。
  • 在啟用ADC後,需要等待 ADC power-up time (tSTAB),以STM32F103xC系列,Max- tSTAB = 1 us,如Table-2。
  • ADC轉換過程中,是能夠被停止的,只須重置ADON bit。

ADC Clock

  • ADC Clock是由APB2 clock經RCC controller程式化分頻,如Figure-12。

Channel Selection

  • 一共有16個Channel。
  • 轉換類型分為兩組,Regular & Injected。
  • 任何一組都可以指定轉換的Channel與轉換的順序。

The regular group :

  • 最多可有16個轉換。
  • 對於轉換的Channel與順序需經由ADC_SQRx Registers進行定義,如Figure-14藍框部分。
  • 轉換數量需經由ADC_SQR1中的L[3:0]定義,如Figure-14紅框部分。

The injected group:

  • 最多可有4個轉換。
  • 對於轉換的Channel與順序需經由ADC_JSQR Register進行定義,如Figure-15籃框部分。
  • 轉換數量需經由ADC_JSQR中的L[1:0]定義,如Figure-15紅框部分。

在MCU內部有Temperature sensor,可供使用者使用,如Figure-16。

啟用方式 : 只需將ADC_CR2 register中第23 bit的位置進行設置,即可啟用。


Single conversion mode

  • 進行一次的轉換。
  • CONT bit必須是0。
  • 可透過設置ADC_CR2 register中的ADON bit或是透過外部觸發進行轉換。
  • 在所選的channel轉換完成之後:
    • 當regular channel轉換完成:
      • 資料會存於16-bit ADC_DR register內。
      • EOC flag被硬體設置。
      • 如果EOCIE被設置,則中斷將會產生。
    • 當injected channel轉換完成:
      • 資料會存於16-bit ADC_DRJ1 register內。
      • JEOC flag被硬體設置。
      • 如果JEOCIE被設置,則中斷將會產生。
  • 最後,ADC停止。

Continuous conversion mode

  • 連續的進行轉換。
  • CONT bit必須是1。
  • 可透過設置ADC_CR2 register中的ADON bit或是透過外部觸發進行轉換。
  • 在每次的channel轉換完成之後:
    • 當一個regular channel轉換完成:
      • 資料會存於16-bit ADC_DR register內。
      • EOC flag被硬體設置。
      • 如果EOCIE被設置,則中斷將會產生。
    • 當一個injected channel轉換完成:
      • 資料會存於16-bit ADC_DRJ1 register內。
      • JEOC flag被硬體設置。
      • 如果JEOCIE被設置,則中斷將會產生。

Timing diagram

  • 啟用ADC時,需等待穩定時間tSTAB完畢之後,可開始ADC conversion的動作。(籃框)
  • 在ADC SWSTART / JSWSTART bit設置後,會開始ADC conversion,同時硬體將其bit重置,ADC conversion過程中需等待tCONV。(紅框)
  • 轉換完畢,EOC會被硬體設置,需透過軟體清除,方能下一個Channel轉換。(綠框)

Analog watchdog

  • 當AWD bit被設置,則表示類比電壓以被ADC轉換,並且低於Lower threshold或高於Higher threshold。
  • 這些thresholds是可在ADC_HTR和ADC_LTR的16-bit registers中被程式化。
  • 可設置在ADC_CR1中的AWDIE bit,啟用Interrupt功能。
  • 透過ADC_CR1 register的設置,Analog watchdog能夠使用在單一或多個channels。

Scan mode

  • 這個模式是被用來轉換一群Channel。
  • 透過在ADC_CR1 register中設置SCAN bit,Scan mode 能夠被啟用。
  • 當SCAN bit被設置,ADC會透過在ADC_SQRx registers之中,所設置的regular channels,以及在ADC_JSQRx registers之中,所設置的injected channels,將其所有進行轉換。
  • 轉換方式是一個Group中所有Channel EOC之後,自動地轉換下一組Group中所有的Channel。
  • 當CONT bit被設置,ADC轉換動作會不斷執行的,且不會停止在最後一個Group轉換完畢,而是繼續向第一個Group進行轉換。
  • 當Regular channel在使用Scan mode時,DMA是必須要啟用的,每次EOC資料會存入SRAM中,以免資料遺漏。

Injected channel management

Triggered injection

  • 為了使用Triggered injection,在ADC_CR1 register中JAUTO bit必須是清除得以及SCAN bit必須是設置的。
  • 可透過外部觸發或是對ADC_CR2 register中的ADON bit設置,即可開始轉換Regular channels。
  • 如果在轉換Regular group channels過程中,外部觸發發生了,目前轉換的Channel會被重置,且在Scan once mode中injected channel 會依照順序轉換完畢。
  • 然後,剛剛轉換的Regular group channel轉換程序將會恢復。如果injected group channel在轉換的過程中,使無法被regular group channel 事件Interrupt的。但是,他會在injected group channel轉換完畢後,轉換regular group channel。

Auto-injection

  • 當JAUTO bit被設置,在regular group channels轉換完畢後,injected group channels將會自動的被轉換。
  • 可透過auto-injection的方式,將在ADC_SQRx 和 ADC_JSQR registers中20個的channel依順序的轉換。
  • 在使用這模式時,對於外部觸發injected channels的方式是不可被使用的。
  • 當CONT bit和 JAUTO bit都被設置時,在injected channels轉換完成後,會接續轉換regular channels,不斷循環進行。
  • 當regular 切換成injected channel轉換時,ADC一定會 delay 1 clock,但是當ADC clock prescaler被設置成2時,會有2 ADC clock delay 的週期。

Discontinuous mode

Regular Group

  • 如果要使用此模式,須設置ADC_CR1 register中的DISCEN bit。
  • 他能夠被用來依順序轉換在ADC_SQRx所設定的一部分Channel。
  • 每觸發一次所轉換的Channel數量,需在ADC_CR1中的L[2:0] bits中設定,最多一次8個Channel依順序轉換。

Injected Group

  • 如果要使用此模式,須設置ADC_CR1 register中的JDISCEN bit。
  • 他能夠被用來依順序轉換在ADC_JSQRx所設定的一部分Channel。
  • 每觸發一次所轉換的Channel數量,需在ADC_JCR1中的JL[2:0] bits中設定,最多一次4個Channel依順序轉換。

Calibration

  • ADC有者自我校正模式。
  • 可設置ADC_CR2 register中的CAL bit,啟用Calibration。
  • 一旦校正完畢,CAL bit將會被硬體重置。
  • 建議在ADC啟動後,進行校正動作。
  • 校正完畢後,校正代碼會存在ADC_DR中。

Data alignment (資料對齊)

Data alignment方式有分兩種,一是靠左對齊,另一是靠右對齊,可透過在ADC_CR2中ALIGN bit進行設定。

Channel-by-channel programmable sample time

  • 對於ADC取樣的Cycle數量,可透過ADC_SMPR1和ADC_SMPR2中的SMP[2:0] bits進行修改。
  • 其中每個Channel可設置不同的Sample time。

DMA Request

  • 因為Regular channels所轉換的值是存於獨立的register中,所以需要透過DMA來儲存更多的Regular channel的轉換值。
  • 只有在Regular channel的EOC才會產生DMA request,且使用者能夠設定將ADC_DR register中的值存於指定空間。

Temperature sensor

  • 能夠量測出環境周圍溫度。
  • 溫度感測器是與ADCx_IN16 input channel相互連接,能夠輸出電壓至ADC並轉換成數位邏輯值。
  • 建議Sampling time為17.1 us。
  • 當未使用,能夠將其電源關閉。

Reading the temperature

使用步驟:

  1. 選擇ADCx_IN16 channel。
  2. 將Sample time設為17.1 us。
  3. 在ADC_CR2中設置TSVREFE bit,將Temperature sensor上電。
  4. 可透過ADON bit或外部觸發來轉換ADC。
  5. 讀取在ADC data register中的VSENSE資料。
  6. 使用以下公式來獲得溫度:
    • Temperature = { (V25 – VSENSE) / Avg_Slope } + 25。
Figure-32 Reading the temperature

ADC Interrupts

  • 不管是regular或是injected group都能夠在EOC之後產生中斷。
  • Analog watchdog也能夠產生中斷。

ADC Modes Colletion

ModeDescription
Signal Conversion只轉換一次,且能夠在轉換完成後發生中斷,最後停止。
Continuous Conversion連續轉換,在每一次的Channel轉換,能夠發生中斷。
Scan用來轉換多個Channel。
Discontinuous在每一次的觸發,依指定Channel數量轉換,且能夠產生中斷。
ADC模式種類

以上是關於STM32 ADC的基本介紹。後面文章會以ADC的所有模式進行使用和測試,最後寫出一個針對STM32 的ADC Monitor。

發表迴響

返回頂端