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