day06 ADC之stm32


一、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

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM