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;
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-mode(multi-mode)
Independent mode 表示此 ADC 獨立運作。
multi-mode 表示ADC同時合作執行。
ADC
通道配置 通道可分成 regular, injected 二組,每個通道能任意屬於哪一組。
[ 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);
}
}
{
/* 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;
ConverTemp= ((((ConverValue*VDD)/4095)-V25)/Slope + 25;
沒有留言:
張貼留言