12.1 AD 簡單描述
在介紹ADC之前我們先說一下ADC大致應用到哪些領域。比如無線通信、軟件無線電、數據采集、光通訊、儀器設備等領域用到的非常多,舉個非常簡單的例子,比如你要獲取電池電壓的用電情況這時候就需要用到ADC這個東西。當然了ADC又可以分很多種,這里就不在說了,這里可以去網上查查??纯炊嗔私饬私狻?/p>
其實在自然界存在的大都是模擬量,像溫濕度、時間、速度、壓力、流量等都是模擬量,但是吧,兄弟們,我們在使用這些東西的時候需要把這玩意用計算機轉換成數字量,這樣才能更有效的進行一些控制。
因此這就需要他們之間有一個橋梁,這個橋梁就是ADC和DAC這兩個。本章只介紹ADC,DAC將會在下一章介紹。
典型的數字控制系統流圖如下圖所示:
根據圖中的信息可知道,非電模擬量需要使用特定的傳感器將模擬信號轉換成電信號,然后使用ADC將電信號轉換成數字信號,經嵌入式系統處理后,再通過DAC將數字信號轉換成模擬信號去控制執行機構。
12.1.1 ADC的簡要
我們首先說一下ADC的轉換過程,然后說一下原理,當然如果嫌啰嗦可以直接跳過。
ADC是英文Analog-to-Digital Converter縮寫,翻譯過來就是模數轉換器,是指將連續變化的模擬信號轉換為離散的數字信號的器件。A/D轉換的作用是將時間連續、幅值也連續的模擬信號轉換為時間離散、值也離散的數字信號,因此,A/D轉換一般要經過采樣、保持、量化及編碼4個過程,如下圖所示。在實際電路中,這些過程有的是合并進行的。例如,采樣和保持、量化和編碼往往都是在轉換過程中同時實現的。
1、ADC:模/數轉換器或者模擬/數字轉換器。是指將連續變量的模擬信號轉換為離散的數字信號的器件。
典型的模擬數字轉換器將模擬信號轉換為表示一定比例電壓值的數字信號。
2 、在進行模/數轉換時,要按一定的時間間隔,對模擬信號進行采樣,然后再把采樣得到的值轉換為數字量。因此,模/數轉換的基本過程由①采樣、②保持、③量化和④編碼組成。
通常,采樣和保持兩個過程由采樣–保持電路完成,量化和編碼又常在轉換過程中同時實現。
12.1.2 ADC原理
ADC有很多的類型大致可以分為
逐次比較逼近型、并行比較型、積分型、Σ-Δ調制型、及壓頻變換型。
這些個類型。具體是什么請自行百度。
當然這些類型収各自的優點和缺點??聪聢D:
1- 采樣與保持
1)、開關S受采樣信號vS的控制:
先來看兩幅圖:
從上圖可以知道一下幾點:
(1)當vs為高電平時,S閉合,采樣階段,vo=vI;
(2)當vs為低電平時,S斷開,保持階段,此時由于電容無放電回路,所以vO保持在上一次采樣結束時輸入電壓的瞬時值上。
將A/D轉換輸出的數字信號,再進行D/A轉換,得到的模擬信號與原輸入信號的接近程度,與采樣頻率密切相關。
2)采樣定理
啥事采樣?
定義事這樣的:
采樣是在間隔為T的T、2T、3T、…時刻抽取被測模擬信號幅值,相鄰兩個采樣時刻之間的間隔T也被稱為采樣周期。
只有當采樣頻率fs大于或等于模擬信號v最高頻率分量fmax的2倍時(fs≥2fmax),所采集的信號樣值才能不失真地反映原來模擬信號的變化規律。
例如:若被采樣信號的最高頻率分量的頻率為100Hz,則采樣頻率應該不低于200Hz。
3)、保持電路
2-量化與編碼
1、什么是量化?
我們在對對模擬信號進行采樣后,會得到一個時間上離散的脈沖信號序列,但每個脈沖的幅度仍然是連續的。然而,CPU所能處理的數字信號不僅在時間上是離散的,而且數值大小的變化也是不連續的,因此,必須把采樣后每個脈沖的幅度進行離散化處理,得到被CPU處理的離散數值,這個過程就稱為量化。
說白了就是A/D轉換過程中,必須將采樣-保持電路的輸出電壓,按某種近似方式規劃到與之相應的離散電平上。
2、啥是編碼?
把量化的結果二進制表示出來稱為編碼。而且,一個n位量化的結果值恰好用一個n位二進制數表示。這個n位二進制數就是ADC轉換完成后的輸出結果。
說白了就是量化過程,只是把模擬信號按量化單位作了取整處理,只有用代碼表示量化后的值,才能得到數字量。當然常用的編碼是二進制編碼。
當然了編碼有兩種方式:看下圖:
1.取整時只舍不入,就是說當電壓在0-1v的時候電壓都是0,1-2v的時候電壓都是1,按照這樣以此類推。采用這種方法,輸入電壓總是比輸出電壓高的,所以產生的量化誤差是不可能為負的。
2.取整時有舍有入(也就是四舍五入):也就是0-0.5V取0,0.5-1.5V取1,以此類推后面的都是這樣的。從這就看到這里的量化誤差是有正有負的。
其實量化說白了及時把模擬信號進行一個取整處理的一個過程。
3-轉換速度
指從接到轉換控制信號開始,到輸出端得到穩定的數字輸出信號所需要的時間。通常用完成一次A/D轉換操作所需時間來表示轉換速度。
例如,某ADC的轉換時間T為10ms,則該A/D轉換器的轉換速度為1/T=100次/s。
4-分辨率
分辨率也可以叫做分解度。用來描述刻度劃分。常以輸出二進制代碼的位數來表示分辨率的高低。位數越多,說明量化誤差越小,則轉換的精度越高。攝像頭數字化處理用到的地方多。
5-量化誤差
量化誤差是指量化產生的誤差,就是上面說的那兩種情況。
6-精度
精度指產生一個給定的數字量輸出,所需模擬電壓的理想值與實際值之間總的誤差,其中包括量化誤差、零點誤差及非線性等產生的誤差。用來描述物理量的準確程度。
特別注意一下:精度和分辨率是不一樣的。
7-輸入模擬電壓范圍
輸入模擬電壓范圍指ADC允許輸入的電壓范圍。超過這個范圍,A/D轉換器將不能正常工作。例如 :STM32F429輸入電壓范圍是:單極性0~V_ref。
8-轉換時間
轉換時間(conversion time)是ADC完成一次A/D轉換所需要的時間,是指從啟動ADC開始到獲得相應數據所需要的總時間。
12.2 STM32F429 ADC的結構
經過上面的內容我們已經對ADC的基本有一個大致的了解。
下面就說說STM32中的ADC。
12.2.1 STM32簡介
ADC主要結構內容:
12位分辨率
轉換結束、注入轉換結束和發生模擬看門狗事件時產生中斷
單次和連續轉換模式
從通道0到通道n的自動掃描模式
自校準
帶內嵌數據一致性的數據對齊
采樣間隔可以按通道分別編程
規則轉換和注入轉換均有外部觸發選項
間斷模式
雙重模式(帶2個或以上ADC的器件)
ADC轉換時間:時鐘為56MHz時,ADC最短轉換時間為1μs
ADC供電要求:2.4V到3.6V
ADC輸入范圍:VREF- ≤ VIN ≤ VREF+
規則通道轉換期間有DMA請求產生。
STM32F429IGT6帶3個ADC控制器:其核心為模擬至數字轉換器,它由軟件或硬件觸發,在ADC時鐘ADCLK的驅動下對規則通道或注入通道中的模擬信號進行采樣、量化和編碼。
1、12 位 ADC 是逐次趨近型模數轉換器,可配置為10 位、8 位或 6 位分辨率。
2、多達 19 個復用通道,可測量來自 16 個外部源、兩個內部源和VBAT通道的信號。
3、A/D 轉換可在單次、連續、掃描或不連續
采樣模式下進行。
4、ADC 的結果存儲在一個左對齊或右對齊的 16 位數據寄存器中。
5、ADC具有模擬看門狗特性,允許應用檢測輸入電壓是否超過了用戶自定義的閾值上限或下限。
6、多種ADC轉換觸發方式:軟件方式、定時器、EXTI 中斷線。
7、可觸發DMA功能(可看DMA章節)。
ADC內部結構圖:
ADC電路走向:
12.2.2 ADC結構與功能
1.電源引腳
ADC電源引腳功能如圖所示:
2.輸入引腳
3.時序圖
從上面看到:ADC在開始精確轉換前需要一個穩定時間tSTAB。在開始ADC轉換和14個時鐘周期后, EOC標志被設置, 16位ADC數據寄存器包含轉換的結果。
4.數據對齊
ADC_CR2寄存器中的ALIGN位選擇轉換后數據儲存的對齊方式。數據可以左對齊或右對齊。注入組通道轉換的數據值已經減去了在ADC_JOFRx寄存器中定義的偏移量,因此結果可以是一個負值。SEXT位是擴展的符號值。對于規則組通道,不需減去偏移值,因此只有12個位有效。
5.校準
ADC有一個內置自校準模式。校準可大幅減小因內部電容器組的變化而造成的準精度誤差。在校準期間,在每個電容器上都會計算出一個誤差修正碼(數字值),這個碼用于消除在隨后的轉換中每個電容器上產生的誤差。
通過設置ADC_CR2寄存器的CAL位啟動校準。一旦校準結束, CAL位被硬件復位,可以開始正常轉換。建議在上電時執行一次ADC校準。校準階段結束后,校準碼儲存在ADC_DR中。
6.ADC轉換時鐘源
STM32F4系列微控制器的ADC是逐次比較逼近型,因此必須使用驅動時鐘。所有ADC共用時鐘ADCCLK,它來自經可編程預分頻器分頻的APB2時鐘,該預分頻器允許ADC在fPCLK2/2、fPCLK2/4、fPCLK2/6或fPCLK2/8等頻率下工作。
ADCCLK最大頻率為36MHz。
7.ADC轉換通道
1-規則通道組:相當正常運行的程序。最多16個通道。規則通道和它的轉換順序在ADC_SQRx寄存器中選擇,規則 組轉換的總數 寫入ADC_SQR1寄存器的L[3:0]中規則通道組共用一個轉換數據寄存器!
2-注入通道組:相當于“中斷”。最多4個通道。注入組和它的轉換順序在ADC_JSQR寄存器中選擇。注入組里轉換的總數應寫入ADC_JSQR寄存器的JL[1:0]中每個注入通道都有一個獨立的轉換數據寄存器。
STM32F4的ADC的各通道可以①單次,②連續,③掃描或者④間斷模式執行。
8.ADC轉換觸發源
總的來說有以下兩種方式:
1)、軟件觸發:ADC 使能 可以由 ADC 控制寄存器 2: ADC_CR2 的 ADON 這個位來控制,寫 1 的時候開始轉換,寫 0 的時候 停止轉換,這個是最簡單也是最好理解的開啟 ADC 轉換的控制方式。
另:(1)位SWSTART:啟動規則組。(2)位JSWSTART:啟動注入組
2)、外部事件觸發轉換:觸發源有很多,具體選擇哪一種觸發源,由 ADC 控制寄存器2:ADC_CR2 的 EXTSEL[2:0]和JEXTSEL[2:0]位來控制。
(1)EXTSEL[2:0]用于選擇規則通道的觸發源;
(2)JEXTSEL[2:0]用于選擇注入通道的觸發源。
9.中斷
當模擬看門狗狀態位和溢出狀態位分別置 1 時,規則組和注入組在轉換結束時可能會產生中 斷??梢允褂脝为毜闹袛嗍鼓芪灰詫崿F靈活性。
10.模擬看門狗
使用看門狗功能,可以限制ADC轉換模擬電壓的范圍(低于閾值下限或高于閾值上限,定義在ADC_HTR和ADC_LTR這兩個寄存器中),當轉換的結果超過這一范圍時,會將ADC_SR中的模擬看門狗狀態位置1,如果使能了相應中斷,會觸發中斷服務程序,以及時進行對應的處理。
11.時鐘配置
12.DMA控制
由于規則組通道只有一個ADC_DR,因此,對于多個規則組通道的轉換,使用 DMA非常有幫助。
比如:
ADC1規則組轉換4個輸入通道信號時,需要用到DMA2的數據流0的通道0,在掃描模式下,在每個輸入通道被轉化結束后,都會觸發DMA控制器將轉換結果從規則組ADC_DR中的數據傳輸到定義的存儲器中。
12.3 ADC典型應用步驟及常用庫函數
12.3.1 ADC典型應用步驟
//ADC1為例子
1-開啟PA口時鐘和ADC1時鐘,設置PA1為模擬輸入。
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_Init();
2-初始化模擬信號輸入的GPIO引腳為模擬方式:
GPIO_Init();
3-復位ADC1。
ADC_DeInit(ADC1);
4-初始化ADC_CCR寄存器。ADC通用控制寄存器。
ADC_CommonInit();
5-初始化ADC1參數,設置ADC1的工作模式以及規則序列的相關信息。
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
6-配置規則通道參數:
ADC_RegularChannelConfig();
7-如果要用中斷,使能ADC中斷,配置ADC的NVIC 。
使能ADC1的轉換結束中斷:
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
配置ADC的NVIC:
NVIC_Init();
8-使能ADC
ADC_Cmd(ADC1, ENABLE);
9-開啟軟件轉換:ADC_SoftwareStartConvCmd(ADC1);
10-等待轉換完成,讀取ADC值
ADC_GetConversionValue(ADC1);
11-中斷服務程序
void ADC_IRQHandler(void);
12.3.2 常用庫函數
1、ADC通用初始化函數
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
//這些參數用來配置ADC_CCR寄存器的相關參數
typedef struct
{
uint32_t ADC_Mode; //多重ADC模式選擇
uint32_t ADC_Prescaler; //ADC預分頻
uint32_t ADC_DMAAccessMode; //DMA訪問模式
uint32_t ADC_TwoSamplingDelay; //2個采樣階段之間的延遲
}ADC_CommonInitTypeDef;
2、ADC初始化函數ADC_Init
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
ADCx,可以是ADC1、ADC2等
typedef struct
{
uint32_t ADC_Resolution; //ADC分辨率
FunctionalState ADC_ScanConvMode; //是否使用掃描模式。ADC_CR1位8:SCAN位
FunctionalState ADC_ContinuousConvMode; //單次轉換OR連續轉換:ADC_CR2的位1:CONT
uint32_t ADC_ExternalTrigConvEdge; //外部觸發使能方式:ADC_CR2的位29:28,EXTEN
uint32_t ADC_ExternalTrigConv; //觸發方式:ADC_CR2的位[19:17] :EXTSEL[2:0]
uint32_t ADC_DataAlign; //對齊方式:左對齊還是右對齊:ADC_CR2的位11:ALIGN
uint8_t ADC_NbrOfChannel; //規則通道序列長度:ADC_SQR1的位[23:20]:L[3:0]
}ADC_InitTypeDef;
例如:
3、ADC使能函數
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
4、 ADC使能軟件轉換函數
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
///////////////////////////////
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的軟件轉換啟動
5、ADC 規則通道配置函數
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx,uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
///////////////////////////////
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_480Cycles);//把規則通道中的通道5,設置為第一個轉換
6、ADC 獲取轉換結果函數ADC_GetConversionValue
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
ADC_GetConversionValue(ADC1);//獲取ADC1轉換結果
12.4 應用實例
請參考野火,正點原子的以及ST官方或者其他優秀的代碼例程。
評論