ADC:
1.STM32內(nèi)部的ADC模塊有三個ADC1,ADC2,ADC3,他們彼此獨立,所以可以進行同步采樣。
2ADC的輸入時鐘不得超過14MHz,它是由PCLK2經(jīng)分頻產(chǎn)生,要在RCC_CFGR配置,再ADC自己的寄存器中在沒有時鐘分頻的配置位。
3.ADC轉(zhuǎn)換時間: STM32F103xx增強型產(chǎn),時鐘為56MHz時為1μ s( 時鐘為72MHz為1.17 μ s)
4.ADC的轉(zhuǎn)換精度默認設(shè)置為12位,輸入范圍:ADC輸入范圍:V REF-≤ VIN≤ VREF+
5.共有18個通道,其中外部16個通道,內(nèi)部兩個通道,內(nèi)部溫度傳感器連接在ADC1_IN16,內(nèi)部參考電壓V REFINT連接在ADC1_IN17
6.轉(zhuǎn)換的啟動方式:有外部觸發(fā),內(nèi)部外設(shè)觸發(fā)如TIMx,以及軟件觸發(fā),一次觸發(fā)轉(zhuǎn)換一個組,軟件使能方式通過設(shè)置ADC_CR2 寄存器的ADON。
7.兩個組的概念,a.規(guī)則組:一般情況下使用的ADC轉(zhuǎn)換序列;b.注入組,它的優(yōu)先級高于規(guī)則組中的轉(zhuǎn)換序列,當(dāng)規(guī)則組正在轉(zhuǎn)換的情況下,入股觸發(fā)了注入組,他將會打斷規(guī)則組正在進行的轉(zhuǎn)換,知道注入組轉(zhuǎn)換完成,再次會帶規(guī)則則組轉(zhuǎn)換。
8總的來說,規(guī)則轉(zhuǎn)換的方式有兩種,即連獨立單次轉(zhuǎn)換方式、間斷一次啟動轉(zhuǎn)換n個通道,n可配置、連續(xù)不斷地轉(zhuǎn)換,知道知道設(shè)置了停止。連續(xù)加是掃描模式下,一次啟動通道會在序列中逐個來回的轉(zhuǎn)換,然而規(guī)則通道組只有一個數(shù)據(jù)寄存器ADCx_DR,因此下一次轉(zhuǎn)換完成之前必須將上次轉(zhuǎn)換的數(shù)據(jù)值讀出,否則將會 被覆蓋,這是一般會使能DMA請求,讓每次數(shù)據(jù)刺激轉(zhuǎn)換完成后產(chǎn)生EOC的同時,也產(chǎn)生DMA請求,DMA將DR中的數(shù)據(jù)傳至存儲器單元。
而單次轉(zhuǎn)換模式下必須要每次完成之后查詢EOC或利用中斷將數(shù)據(jù)讀出,然后再軟件啟動下一次轉(zhuǎn)換,在這期間若要改變轉(zhuǎn)換的序列也可以寫入下次采集的通道。和以前使用AD的模式一樣,但這樣耗費時間。
間斷模式,是在整個SQR寄存器組中通過設(shè)置n,一次制轉(zhuǎn)換其中的幾個,知道將這個序列轉(zhuǎn)換完。暫時未用。
8.ADC的采樣時間時刻配置的,在采樣時間寄存器配置,一次轉(zhuǎn)換所需要的時間TCONV= 采樣時間+ 12.5 = 14 周期,12.5是轉(zhuǎn)換周期。
9.有序數(shù)據(jù)只有12,不足16位,因此要設(shè)置第七方式,方便數(shù)據(jù)的提取,有注入組中能設(shè)置轉(zhuǎn)換的品偏移量,即轉(zhuǎn)換結(jié)果等于采樣值減去偏移量的值,可能是負值,因此右對齊式,高位時符號位的擴展,規(guī)則組下高4位全部為0。
10.可以配置ADC轉(zhuǎn)換的閥值,類似看門狗功能,ADC_HTR 和ADC_LTR寄存器分別配置上下限,不在這個范圍內(nèi)飾可以產(chǎn)生中斷標(biāo)志,用戶可以選擇進入中斷。
11.外部觸發(fā)模式,主要是外設(shè)的觸發(fā)信號,TIM的中斷時間來觸發(fā)ADC的轉(zhuǎn)換開始,達到控制采樣時間的的目的,就不用如原來一樣單獨的寫配置定時器中斷。
12.雙ADC使用,雙ADC有很多中模式,最可能用到的就是雙ADC規(guī)則同步轉(zhuǎn)換方式,可查閱Datasheet來配置。
規(guī)則單次轉(zhuǎn)換配置方式:
關(guān)閉CONT,關(guān)閉SCAN模式,設(shè)置n值等于1,ADC獨立模式,初始化結(jié)構(gòu)體基本上是這樣。
然后向SQR組中的某個位置寫入通道號,配置該通道的轉(zhuǎn)換采樣時間。
使能ADCx,比較重要的是在最后要進行ADC校準(zhǔn),否則可能不準(zhǔn),校準(zhǔn)包括復(fù)位校準(zhǔn)、AD校準(zhǔn),等待校準(zhǔn)完成后才能開始轉(zhuǎn)換。
每次轉(zhuǎn)換完成查詢EOC標(biāo)志位,然后讀取DR數(shù)據(jù)并且使能下一次轉(zhuǎn)換,也可寫入新的轉(zhuǎn)換通道。
void Init_ADC()
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //這是使用連續(xù)掃描模式時
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 2;
// ADC_InitStructure.ADC_ScanConvMode = DSIABLE;
// ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
// ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); //
ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); //
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibration register */
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1))
{
;
}
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1))
{
;
}
}
讀取函數(shù):
void GetADValue()
{
// ADC_RegularChannelConfig(ADC1
評論