一、ADC基本參數:
1、輸入電壓范圍:取決於參數與外接電路;如果超過ADC的參考電壓,需要外接電路配合;
2、stm32具有3個ADC控制器,每個控制器外接16路通道(GPIO),3個控制器一共有24個通道,因此有一部分通道,3個控制器之間存在復用;
3、輸入通道分類:16路規則通道和4路注入通道;規則通道在轉換的時候,某一路通道需要着急轉換完成,因此插入到正在轉換通道的序列中,插入的通道是注入通道;那么規則通道的轉換順序如何安排?什么時候注入到通道插入進來?
3.1 規則通道的轉換順序可以在規則序列寄存器中配置;4路注入通道的轉換順序可以在注入通道的轉換順序寄存器中配置;那么ADC轉換什么時候開始?
3.2 軟件觸發和硬件觸發:軟件觸發使用相應的控制位;硬件觸發使用響應的外設;規則通道與注入通道一樣;
3.3 ADC轉換時間:Tconv=采樣時間+12個周期;采樣周期可以在對應的寄存器中配置,最低采樣周期3個周期;ADC的時鍾根據手冊可以看出來36MHz;
4、轉換方式:單次轉換和連續轉換、掃描轉換;掃描單詞模式和掃描連續模式;轉換完成后數據存放在哪里?
5、數據寄存器:ADC根據不同的組,將數據放在對應的數據寄存器,規則組放在ADC_CR。注入組放在JDRx;ADC_DR所有通道的采集的數據都放在這里,因此需要及時取走數據,使用中斷或者DMA方式;比較常用DMA;注入通道每個通道都有對應的數據寄存器,因此不需要着急取走數據;
6、ADC通道輸入電壓保護:外部輸入信號超過ADC信號范圍,可以使用模擬看門狗保護多個通道;
7、ADC工作模式:單獨模式、雙重模式、三重模式;(三個ADC控制器工作的個數)
7.1 單獨模式:只有一個ADC控制器工作,可以使任意一個;也可以是單通道也可以使多個通道,轉換的數據存放在ADC_DR中,存取數據可以用中斷或者DMA;
7.2 雙重規則同步模式:用於規則通道,使用兩個及以上的控制器同時采集;
7.3 多重交替模式:交替模式只能用在規則組,通常只有一個通道,在一個ADC采集的時候,另一個ADC開始轉換,這樣可以提高ADC的采樣率;可以達到6M,數據傳輸使用DMA2模式,有兩個數據傳輸數據;
二、ADC初始化
1、原理圖:PA5--->ADC12_IN5,使用外部的管腳座STM_ADC,這里的ADC12是指控制器ADC控制器1或者控制器2;
2.1 時鍾初始化
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹÄÜGPIOAʱÖÓ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ʹÄÜADC1ʱÖÓ
2.2 配置GPIO屬性
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;// 配置復用功能 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;// 不需要上下拉電阻 GPIO_Init(GPIOA, &GPIO_InitStructure);//
2.3 復位ADC1控制器
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1使能復位 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); // 停止復位
2.4 ADC控制器通用功能初始化
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;// 設置獨立工作模式 ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;// 設置兩個采樣之間周期間隔,為5個周期,最小3個周期 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA訪問失能 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;// 配置ADC時鍾分頻ADC CLK=PCLK2/4=84/4=21Mhz,ADC時鍾最大為36Mhz ADC_CommonInit(&ADC_CommonInitStructure);// 通用初始化
2.5 ADC控制器初始化
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//設置ADC分辨率 ADC_InitStructure.ADC_ScanConvMode = DISABLE;// 關閉ADC1控制器掃描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;// 關閉ADC連續轉換模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;// 沒有外部觸發源 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// 設置數據對齊方式 ADC_InitStructure.ADC_NbrOfConversion = 1;//設置轉換通道大小 ADC_Init(ADC1, &ADC_InitStructure);//ADC1控制器初始化
2.6 開啟ADC轉換
ADC_Cmd(ADC1, ENABLE);// 開啟轉換
2.7 設置ADC規則通道,通道個數,采樣時間(與精度有關),這里ch固定為5
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );// 規則通道組,規則序列、采樣時間 ADC_SoftwareStartConv(ADC1); //啟動ADC1軟件轉啟動功能
配置完成上面就可以實時獲取ADC的數據,通過判斷轉換完成的中斷標志;
2.8 判斷轉換完成的中斷標志位、獲取數據寄存器中的數據
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));// 獲取中斷標志位EOC return ADC_GetConversionValue(ADC1); // 獲取ADC轉換完成結果
2.9 獲取采集數據的平均值,提高准確率
u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t<times;t++) { temp_val+=Get_Adc(ch); delay_ms(5); } return temp_val/times; }
2.10 獲取轉換結果
adcx=Get_Adc_Average(ADC_Channel_5,20); // 獲取20次求平均值,指定通道5
2.11 初始化步驟:
1、開啟GPIO時鍾和ADC時鍾,設置GPIO口為復用功能;
2、復用ADC1同時設置ADC的分頻因子;
3、初始化ADC_CCR寄存器,通用功能;
4、配置規則通道參數;
5、開啟軟件轉換;
6、等待轉換完成,讀取ADC值;
三、多通道DMA讀取ADC數據---獨立模式-多通道--使用DMA
1、PB0和PB1,ADC1
2、配置步驟:
2.1、初始化ADC對應的GPIO(多通道配置多個GPIO)
2.2、配置ADC初始化結構體,DMA初始化結構體
2.3、配置通道的轉換順序,使能DMA請求,使能DMA、打開ADC、觸發ADC開始轉換;
2.4、編寫main