ADC:
1.STM32內(nèi)部的ADC模塊有三個(gè)ADC1,ADC2,ADC3,他們彼此獨(dú)立,所以可以進(jìn)行同步采樣。
2ADC的輸入時(shí)鐘不得超過14MHz,它是由PCLK2經(jīng)分頻產(chǎn)生,要在RCC_CFGR配置,再ADC自己的寄存器中在沒有時(shí)鐘分頻的配置位。
3.ADC轉(zhuǎn)換時(shí)間: STM32F103xx增強(qiáng)型產(chǎn),時(shí)鐘為56MHz時(shí)為1μ s( 時(shí)鐘為72MHz為1.17 μ s)
4.ADC的轉(zhuǎn)換精度默認(rèn)設(shè)置為12位,輸入范圍:ADC輸入范圍:V REF-≤ VIN≤ VREF+
5.共有18個(gè)通道,其中外部16個(gè)通道,內(nèi)部?jī)蓚€(gè)通道,內(nèi)部溫度傳感器連接在ADC1_IN16,內(nèi)部參考電壓V REFINT連接在ADC1_IN17
6.轉(zhuǎn)換的啟動(dòng)方式:有外部觸發(fā),內(nèi)部外設(shè)觸發(fā)如TIMx,以及軟件觸發(fā),一次觸發(fā)轉(zhuǎn)換一個(gè)組,軟件使能方式通過設(shè)置ADC_CR2 寄存器的ADON。
7.兩個(gè)組的概念,a.規(guī)則組:一般情況下使用的ADC轉(zhuǎn)換序列;b.注入組,它的優(yōu)先級(jí)高于規(guī)則組中的轉(zhuǎn)換序列,當(dāng)規(guī)則組正在轉(zhuǎn)換的情況下,入股觸發(fā)了注入組,他將會(huì)打斷規(guī)則組正在進(jìn)行的轉(zhuǎn)換,知道注入組轉(zhuǎn)換完成,再次會(huì)帶規(guī)則則組轉(zhuǎn)換。
8總的來說,規(guī)則轉(zhuǎn)換的方式有兩種,即連獨(dú)立單次轉(zhuǎn)換方式、間斷一次啟動(dòng)轉(zhuǎn)換n個(gè)通道,n可配置、連續(xù)不斷地轉(zhuǎn)換,知道知道設(shè)置了停止。連續(xù)加是掃描模式下,一次啟動(dòng)通道會(huì)在序列中逐個(gè)來回的轉(zhuǎn)換,然而規(guī)則通道組只有一個(gè)數(shù)據(jù)寄存器ADCx_DR,因此下一次轉(zhuǎn)換完成之前必須將上次轉(zhuǎn)換的數(shù)據(jù)值讀出,否則將會(huì) 被覆蓋,這是一般會(huì)使能DMA請(qǐng)求,讓每次數(shù)據(jù)刺激轉(zhuǎn)換完成后產(chǎn)生EOC的同時(shí),也產(chǎn)生DMA請(qǐng)求,DMA將DR中的數(shù)據(jù)傳至存儲(chǔ)器單元。
而單次轉(zhuǎn)換模式下必須要每次完成之后查詢EOC或利用中斷將數(shù)據(jù)讀出,然后再軟件啟動(dòng)下一次轉(zhuǎn)換,在這期間若要改變轉(zhuǎn)換的序列也可以寫入下次采集的通道。和以前使用AD的模式一樣,但這樣耗費(fèi)時(shí)間。
間斷模式,是在整個(gè)SQR寄存器組中通過設(shè)置n,一次制轉(zhuǎn)換其中的幾個(gè),知道將這個(gè)序列轉(zhuǎn)換完。暫時(shí)未用。
8.ADC的采樣時(shí)間時(shí)刻配置的,在采樣時(shí)間寄存器配置,一次轉(zhuǎn)換所需要的時(shí)間TCONV= 采樣時(shí)間+ 12.5 = 14 周期,12.5是轉(zhuǎn)換周期。
9.有序數(shù)據(jù)只有12,不足16位,因此要設(shè)置第七方式,方便數(shù)據(jù)的提取,有注入組中能設(shè)置轉(zhuǎn)換的品偏移量,即轉(zhuǎn)換結(jié)果等于采樣值減去偏移量的值,可能是負(fù)值,因此右對(duì)齊式,高位時(shí)符號(hào)位的擴(kuò)展,規(guī)則組下高4位全部為0。
10.可以配置ADC轉(zhuǎn)換的閥值,類似看門狗功能,ADC_HTR 和ADC_LTR寄存器分別配置上下限,不在這個(gè)范圍內(nèi)飾可以產(chǎn)生中斷標(biāo)志,用戶可以選擇進(jìn)入中斷。
11.外部觸發(fā)模式,主要是外設(shè)的觸發(fā)信號(hào),TIM的中斷時(shí)間來觸發(fā)ADC的轉(zhuǎn)換開始,達(dá)到控制采樣時(shí)間的的目的,就不用如原來一樣單獨(dú)的寫配置定時(shí)器中斷。
12.雙ADC使用,雙ADC有很多中模式,最可能用到的就是雙ADC規(guī)則同步轉(zhuǎn)換方式,可查閱Datasheet來配置。
規(guī)則單次轉(zhuǎn)換配置方式:
關(guān)閉CONT,關(guān)閉SCAN模式,設(shè)置n值等于1,ADC獨(dú)立模式,初始化結(jié)構(gòu)體基本上是這樣。
然后向SQR組中的某個(gè)位置寫入通道號(hào),配置該通道的轉(zhuǎn)換采樣時(shí)間。
使能ADCx,比較重要的是在最后要進(jìn)行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ù)掃描模式時(shí)
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
評(píng)論