CKS32F107xx系列產(chǎn)品提供2個12位的模擬/數(shù)字轉(zhuǎn)換器(ADC),每個ADC共用多達(dá)16個外部通道,各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC的結(jié)果可以左對齊或右對齊方式存儲在16位數(shù)據(jù)寄存器中。
A/D轉(zhuǎn)換器的供電和參考電壓
為了提高轉(zhuǎn)換的精確度,ADC使用一個獨立的電源供電,其電源引腳為VDDA和VSSA,從而過濾和屏蔽來自印刷電路板上的毛刺干擾。在進(jìn)行硬件設(shè)計的時候,VDDA和VSSA必須分別連接到VDD和VSS。對于100腳封裝的,為了確保輸入為低壓時獲得更好精度,用戶可以連接一個獨立的外部參考電壓ADC到VREF+和VREF-腳上,其中,VREF-引腳必須連接到VSSA,而VREF+的電壓范圍為2.4V~VDDA。對于64引腳封裝的,沒有VREF+和VREF-引腳,他們在芯片內(nèi)部與ADC的電源(VDDA)和地(VSSA)相聯(lián)。
ADC轉(zhuǎn)換時間
ADC輸入時鐘ADC_CLK由PCLK2 經(jīng)過分頻產(chǎn)生,最大是14M,分頻因子由RCC時鐘配置寄存器RCC_CFGR的位15:14 ADCPRE[1:0]設(shè)置,可以是2/4/6/8分頻,注意這里沒有1分頻。一般我們設(shè)置PCLK2=HCLK=72M。ADC使用若干個ADC_CLK周期對輸入電壓采樣,采樣周期數(shù)目可以通過ADC_SMPR1和 ADC_SMPR2寄存器中的SMP[2:0]位更改。每個通道可以分別用不同的時間采樣。總轉(zhuǎn)換時間如下計算:TCONV=采樣時間+12.5個周期。例如當(dāng)ADCCLK=14MHz,采樣時間為1.5周期,則總的轉(zhuǎn)換時間TCONV=1.5+12.5=14周期=1us。
ADC數(shù)據(jù)寄存器
ADC轉(zhuǎn)換完成后的數(shù)據(jù)輸出寄存器。根據(jù)轉(zhuǎn)換組的不同,規(guī)則組的完成轉(zhuǎn)換的數(shù)據(jù)輸出到ADC_DR寄存器,注入組的完成轉(zhuǎn)換的數(shù)據(jù)輸出到ADC_JDRx寄存器。假如是使用雙重模式,規(guī)則組的數(shù)據(jù)也是存放在ADC_DR寄存器。ADC規(guī)則組數(shù)據(jù)寄存器ADC_DR是一個32位的寄存器,獨立模式時只使用到該寄存器低16位保存ADC1/2的規(guī)則轉(zhuǎn)換數(shù)據(jù)。在雙ADC模式下,高16位用于保存ADC2轉(zhuǎn)換的數(shù)據(jù),低16位用于保存ADC1轉(zhuǎn)換的數(shù)據(jù)。因為ADC的精度是12位的,ADC_DR寄存器無論高16位還是低16位,存放數(shù)據(jù)的位寬都是16 位的,所以允許選擇數(shù)據(jù)對齊方式。由ADC_CR2寄存器的ALIGN位設(shè)置數(shù)據(jù)對齊方式,可選擇:右對齊或者左對齊。如果使用多通道轉(zhuǎn)換,那么這些通道的數(shù)據(jù) 也會存放在ADC_DR里面,按照規(guī)則組的順序,上一個通道轉(zhuǎn)換的數(shù)據(jù),會被下一個通道轉(zhuǎn)換的數(shù)據(jù)覆蓋掉,所以當(dāng)通道轉(zhuǎn)換完成后要及時把數(shù)據(jù)取走。比較常用的方法是使用DMA模式。當(dāng)規(guī)則組的通道轉(zhuǎn)換結(jié)束時,就會產(chǎn)生DMA請求,這樣就可以及時把轉(zhuǎn)換的數(shù)據(jù)搬運(yùn)到用戶指定的目的地址存放。注意:只有ADC1可以產(chǎn)生DAM請求,而由ADC2轉(zhuǎn)換的數(shù)據(jù)可以通過雙ADC模式,利用ADC1的 DMA功能傳輸。
ADC中斷
ADC中斷可分為三種:規(guī)則組轉(zhuǎn)換結(jié)束中斷、注入組轉(zhuǎn)換結(jié)束中斷、設(shè)置了模擬看門狗狀態(tài)位中斷。它們都有獨立的中斷使能位,分別由ADC_CR 寄存器的EOCIE、JEOCIE、AWDIE位設(shè)置,對應(yīng)的標(biāo)志位分別是EOC、JEOC、AWD。
ADC初始化結(jié)構(gòu)體詳解
ADC_InitTypeDef結(jié)構(gòu)體用于設(shè)置ADC的工作參數(shù),并由標(biāo)準(zhǔn)庫函數(shù)ADC_Init()調(diào)用這些設(shè)定參數(shù)進(jìn)入設(shè)置外設(shè)相應(yīng)的寄存器,達(dá)到配置外設(shè)工作環(huán)境的目的。其具體的定義如下:
typedef struct
{
uint32_t ADC_Mode;
FunctionalState ADC_ScanConvMode;
FunctionalState ADC_ContinuousConvMode;
uint32_t ADC_ExternalTrigConv;
uint32_t ADC_DataAlign;
uint8_t ADC_NbrOfChannel;
}ADC_InitTypeDef;
ADC_Mode:配置ADC的模式,當(dāng)使用一個ADC時是獨立模式,使用兩個ADC 時是雙模式,在雙模式下還有很多細(xì)分模式可選,具體配置ADC_CR1:DUALMOD位。
ScanConvMode:可選參數(shù)為ENABLE和DISABLE,配置是否使用掃描。如果是單通道AD轉(zhuǎn)換使用DISABLE,如果是多通道AD轉(zhuǎn)換使用ENABLE,具體配置 ADC_CR1:SCAN位。
ADC_ContinuousConvMode:可選參數(shù)為 ENABLE 和 DISABLE,配置是啟動自動連續(xù)轉(zhuǎn)換還是單次轉(zhuǎn)換。使用ENABLE配置為使能自動連續(xù)轉(zhuǎn)換;使用 DISABLE 配置為單次轉(zhuǎn)換,轉(zhuǎn)換一次后停止需要手動控制才重新啟動轉(zhuǎn)換,具體配置 ADC_CR2:CON位。
ADC_ExternalTrigConv:外部觸發(fā)選擇,ADC有很多外部觸發(fā)條件,可根據(jù)項目需求配置觸發(fā)來源。實際上,我們一般使用軟件自動觸發(fā)。
ADC_DataAlign:轉(zhuǎn)換結(jié)果數(shù)據(jù)對齊模式,可選右對齊ADC_DataAlign_Right 或者左對齊ADC_DataAlign_Left。
ADC_NbrOfChannel:AD轉(zhuǎn)換通道數(shù)目,根據(jù)實際設(shè)置即可。具體的通道數(shù)和通道的轉(zhuǎn)換順序是配置規(guī)則序列或注入序列寄存器。
CKS32F103XX ADC單通道采集實驗
本實驗使用規(guī)則組單通道的單次轉(zhuǎn)換模式,并且通過軟件觸發(fā),即由ADC_CR2寄存器的SWSTART位啟動。下面講解其詳細(xì)設(shè)置步驟:
1)開啟PA口時鐘和ADC1時鐘,設(shè)置PA1為模擬輸入。
CKS32F107xx的ADC通道1在PA1上,所以,我們先要使能PORTA的時鐘和ADC1時鐘,然后設(shè)置PA1為模擬輸入。使能GPIOA和ADC時鐘用RCC_APB2PeriphClockCmd函數(shù),設(shè)置 PA1的輸入方式,使用GPIO_Init函數(shù)即可。
2)復(fù)位 ADC1,同時設(shè)置 ADC1 分頻因子。
開啟ADC1時鐘之后,我們要復(fù)位ADC1,將ADC1的全部寄存器重設(shè)為缺省值之后我們 就可以通過RCC_CFGR設(shè)置ADC1的分頻因子。分頻因子要確保ADC1的時鐘(ADCCLK)不要超過14Mhz。這個我們設(shè)置分頻因子位6,時鐘為72/6=12MHz,庫函數(shù)的實現(xiàn)方法是:
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC 時鐘復(fù)位的方法是:
ADC_DeInit(ADC1);
3)初始化ADC1參數(shù),設(shè)置ADC1的工作模式以及規(guī)則序列的相關(guān)信息。
在設(shè)置完分頻因子之后,我們就可以開始 ADC1 的模式配置了,設(shè)置單次轉(zhuǎn)換模式、觸發(fā)方式選擇、數(shù)據(jù)對齊方式等都在這一步實現(xiàn)。同時,我們還要設(shè)置ADC1規(guī)則序列的相關(guān)信息,我們這里只有一個通道,并且是單次轉(zhuǎn)換的,所以設(shè)置規(guī)則序列中通道數(shù)為1。這些在庫函數(shù)中是通過函數(shù)ADC_Init實現(xiàn)的。
4)使能ADC并校準(zhǔn)。
在設(shè)置完了以上信息后,我們就使能AD轉(zhuǎn)換器,執(zhí)行復(fù)位校準(zhǔn)和AD校準(zhǔn),注意這兩步 是必須的!不校準(zhǔn)將導(dǎo)致結(jié)果很不準(zhǔn)確。使能指定ADC的方法是:
ADC_Cmd(ADC1, ENABLE);
執(zhí)行復(fù)位校準(zhǔn)的方法是:
ADC_ResetCalibration(ADC1);
執(zhí)行ADC校準(zhǔn)的方法是:
ADC_StartCalibration(ADC1);
每次進(jìn)行校準(zhǔn)之后要等待校準(zhǔn)結(jié)束。這里是通過獲取校準(zhǔn)狀態(tài)來判斷是否校準(zhǔn)是否結(jié)束。等待復(fù)位校準(zhǔn)結(jié)束函數(shù)為:
while(ADC_GetResetCalibrationStatus(ADC1));
等待AD校準(zhǔn)結(jié)束函數(shù)為:
while(ADC_GetCalibrationStatus(ADC1));
5)讀取ADC值。
在上面的校準(zhǔn)完成之后,ADC就算準(zhǔn)備好了。接下來我們要做的就是設(shè)置規(guī)則序列1里面的通道,采樣順序,以及通道的采樣周期,然后啟動ADC轉(zhuǎn)換。在轉(zhuǎn)換結(jié)束后,讀取ADC 轉(zhuǎn) 換結(jié)果值就是了。我們這里是規(guī)則序列中的第1個轉(zhuǎn)換,同時采樣周期為239.5,所以設(shè)置為:
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
軟件開啟ADC轉(zhuǎn)換的方法是:
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
開啟轉(zhuǎn)換之后,就可以獲取轉(zhuǎn)換ADC轉(zhuǎn)換結(jié)果數(shù)據(jù),方法是:
ADC_GetConversionValue(ADC1);
同時在AD轉(zhuǎn)換中,我們還要根據(jù)狀態(tài)寄存器的標(biāo)志位來獲取AD轉(zhuǎn)換的各個狀態(tài)信息。庫函數(shù)獲取AD轉(zhuǎn)換的狀態(tài)信息的函數(shù)是:
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
比如我們要判斷ADC1d的轉(zhuǎn)換是否結(jié)束,方法是:
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
通過以上幾個步驟的設(shè)置,我們就能正常的使用CKS32F107xx的ADC1來執(zhí)行AD轉(zhuǎn)換操作了。
-
轉(zhuǎn)換器
+關(guān)注
關(guān)注
27文章
8703瀏覽量
147166 -
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120348 -
adc
+關(guān)注
關(guān)注
98文章
6498瀏覽量
544630
原文標(biāo)題:MCU微課堂|CKS32F107xx系列 ADC(一)
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論