welcom ! Handel home

2014年7月1日 星期二

ST32 ADC note

ADC 數位類比轉換器(Analog-to-digital coverter)
  • 用於將類比形式的連續訊號轉換為數位形式的離散訊號的一類設備。



















  • 當嵌入式電子產品必須根據週遭環境的物理條件如溫度、壓力等產生適當反應,就必須由 ADC 將感測器採得的類比訊號轉為數位訊號。
  • 自然界的訊號主要為類比訊號,時間與大小是連續的;adc 負責將類比訊號轉為數位訊號,時間與大小變成離散的。




根據取樣率解晰度決定產生的數位訊號在時間、大小的離散程度。
取樣率(Sampling rate)
  • 多久對輸入的類比訊號進行一次轉換。取樣率越高,所得到的數位訊號越連續,但要求較大空間存放資料及較快的資料處理速率。
解析度(Resolution)
  • 能將當下的類比值轉為多準確的數位值。解析度越高,所得的訊號越精准,但要求每筆資料佔更多的位元數。
  • 說明
  • 類比訊號圖:橫軸表示時間,縱軸表示大小。取樣率是對橫軸做切割,解析度則對縱軸做切割。
  • 因為訊號以二進位方式儲存,所以通常解析度會以位元作為單位。
  • 例如 8 位元解析度(假設電壓上限為 0~5V)
  • 則我們的訊號在接收時每個單位為(5V-0V)/(2^8-1)=0.0196V
  • 若所得到的值為100則其實際上的電壓為 100 × 0.0196 = 1.96V


  • 以一個解析度為12bits的ADC來說,電壓範圍為0-5V,其轉換公式如下
ConvertedVoltage = ConvertedValue * VDD/(2^12-1);
  • 共有3個12-bit ADC 在開發板上,且可量測16個外部訊號源及2個內部訊號源。
  • 有12-bit, 10-bit, 8-bit or 6-bit共4種可選擇的解析度。
  • 每個通道的A/D轉換可以使用單次、連續、掃描或間斷模式執行。
  • ADC的結果可以左對齊或右對齊的方式儲存於16-bit暫存器中。

1. Analog MUX 類比多工器:
將多個訊號源連接至 ADC, 可在上圖中的左下角看到有 16 組輸入 (ADCx_IN0~15), 經過類比多工器來做訊號源的選擇。
2. Injected/Regular data register:
每個 channel 都能配置成 injected or regular, regular 在啟動後 scan 時會依序進行轉換,而 injected 表示會等待外部訊號觸發轉換,觸發後以 injected 的轉換為優先處理。
3. External/Internal Reference Voltage:
ADC 所接受的電壓值在 GND 與參考電壓之間,注意其必須接上穩定的電壓源,否則計算上會不穩定。
4. GPIO Port:
當我們將GPIO Port設定成類比輸入的模式時,進來GPIO pin的原始訊號源在還沒經過施密特觸發器(Schmitt trigger)會有另一個線路將訊號做導向(導到ADC)
/* 將GPIO轉為類比用途 */
GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN;

 
5. Analog Watchdog:
用來監控採樣結果,如果超出預設範圍就打斷轉換並發出中斷。
  • ADC clock 來自 PCLK2 (APB2), 啟動 ADC 前須先設置好。
  • AHB for 記憶體
  • APB for 硬體周邊
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  • ADC 可設 ADON 打開電源,重設來關掉電源

  • 版子上共有 3 ADC, 可測量 16 個外部訊號源 2 個內部訊號源。每個外部訊號源對應一個通道。



  • 每個通道能自己設置不同的採樣時間,可根據不同的應用改變採樣時間。
  • 總轉換時間即採樣時間加上 ADC core 等其他元件(ex:溫度感測器的讀取)所需時間。
  • ADC 正式運作前必需做 calibration 以避免電容的狀態不是預期而造成誤差。
ADC_ResetCalibration(ADC1);
  • 由於有多個ADC與多個通道,因此可以排列組合出非常多變化的運作模式。

Independent-mode  Dual-modemulti-mode
Independent mode 表示此 ADC 獨立運作。
multi-mode 表示ADC同時合作執行。
ADC 通道配置 通道可分成 regularinjected 二組,每個通道能任意屬於哪一組。

[ Regular group]
  • 會依序被轉換,但順序可自由配置,最多 16 個。
  • 可以選擇 ADC 開始運作時就進行轉換或等待外來觸發轉換。
  • 有二種控制條件,組合出四種模式:

  • ADC_InitStruct->ADC_ScanConvMode = ENABLE or DISABLE ;
  • ADC_InitStruct->ADC_ContinuousConvMode = ENABLE or DISABLE;

1.Single Channel Single conversion mode: 單一通道進行一次轉換。
2.Single Channel Continuous conversion mode: 單一通道持續進行轉換。
3&4  .Scan mode: 也分為轉換一次與連續轉換,但因為 data register 只有一個,所以要用 DMA 避免資料遺失。
  • DMA: 每個通道轉換完成都發出一個 DMA request, 可設定為每當 DMA 發生就觸發一次中斷,即可讀出每個通道所轉換的值,也可以全部轉換後一次讀取全部通道的值。
[ Injected group ]
  • 最多 4 個通道,且只能設為等待觸發而轉換。(插隊)
  • 觸發時若正在轉換規則通道則會暫停而先處理注入通道,完畢後恢復原運作。
  • 如果轉換注入通道過程中規則通道轉換被觸發,不會中止注入通道轉換,而是轉換完畢才進行規則通道轉換。
  • Auto-injected mode 可設注入通道轉換於規則通道 scan 完成後,可實現一個 iteration 執行 20 次轉換。
  • < Discontinuous mode >
  • 允許 scan 時不是全部掃完,可以「分批」進行。
  • 兩種 group 皆可設為此模式,但同時只有最多一個 group 採用它。
  • 此模式必須配合「外部觸發轉換」方式使用。
  • 先設置每批有幾個通道,至多八個,但 injected group 強迫每批一個通道。
  • 之後各次訊號觸發時轉換一批。
  • 以每批三個 (n=3), 通道為 {1, 2, 3, 4, 5} 舉例:
  • 1st 觸發,轉換 {1, 2, 3}.
  • 2nd 觸發,轉換 {4, 5}, 並因為 scan 結束而發 EOC 中斷。
  • 3rd 觸發,轉換 {1, 2, 3}, 以此類推。
Multi Mode (Dual mode)
  • 有一組ADC是無法開啟dual mode,只能使用independent mode
  • 在我們的參考資料中ADC3只能開啟independent mode
  • 此資訊來自stm32 ADC mode and their application P9
  • ADC1, ADC2 分別擔任 master & slave.
1. Injected simultaneous mode

個 ADCs 同時觸發而轉換 injected groups.
2.Regular simultaneous mode





  • 2 ADCs 外部訊號同時觸發,一起對所負責通道依序轉換,結果存在 ADC1 DR.
  • 禁止二個 ADCs 同時對同一通道轉換以免誤差。
  • 以上兩者的差別在於不同的group
3.Interleaved mode
  • 透過兩個以上的ADC交互轉換同一個通道可以達到更高的取樣頻率
  • 由於同使只能有一個ADC對同一個通道做採樣,因此必須要增加兩個cycle的Delay time以免 phase overlap.
4.Alternate trigger mode




  • 只能用在雙方的 injected groups, 用同樣外部訊號輪流接受觸發。
  • 如單數次觸發到 ADC1 injected group; 雙數次觸發到 ADC2 injected group.

Tconv(Total Conversion Time) = Sampling time + 12 cycles (12 bits resolution)
  • Sampling time
  • ADCCLK cycles that can be modified using the SMP[2:0] bits in the ADC_SMPR1 and ADC_SMPR2 registers

  • 舉例來說,下面的初始化即為把SMP10[2:0]這三個bit設為001
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_15Cycles);
  • Each channel can be sampled with a different sampling time.
  • Example:
  • With ADCCLK = 30 MHz and sampling time = 3 cycles:
  • Tconv = 3 + 12 = 15 cycles = 0.5 µs with APB2 at 60 MHz
  • 我們所使用的STM32F4 Discovery其溫度感測器連接到ADC1_IN16 channel
  • 除了設定通道以外,也必須要設定TSVREFE bit,參考下圖


  • ADC1_IN18 為 STM23F42x and STM32F43x 所使用之通道
  • TSVREFE bit 必需要設為enable,讓 ADC1_IN16 和 ADC1_IN17 (VREFINT)可以運作
設定的方法只要
ADC_TempSensorVrefintCmd(ENABLE);
  • 其實做如下:
void ADC_TempSensorVrefintCmd(FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* Enable the temperature sensor and Vrefint channel*/
    ADC->CCR |= (uint32_t)ADC_CCR_TSVREFE;
  }
  else
  {
    /* Disable the temperature sensor and Vrefint channel*/
    ADC->CCR &= (uint32_t)(~ADC_CCR_TSVREFE);
  }
}
  • 由於啟動Temperature Sensor需要時間(waking from power down mode),啟動ADC也需要時間(startup time after power-on),因此在設定時同時對兩個做設定才能達到最快的取樣速度。
  • 內建的溫度感測器適合用來測量溫度的變化,不適合用來得到精準的溫度值。
ConvertedVoltage = ConvertedValue*VDD/4095;
ConverTemp= ((((ConverValue*VDD)/4095)-V25)/Slope + 25;



沒有留言: