STM32之ADC學習

配置ADC

1、              系統時鐘定義:

RCC_Configuration();

包涵: 

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx, ENABLE); // Enable DMA clock

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx , ENABLE); // Enable ADC1 and GPIOC clock

2、              中斷源配置:

NVIC_Configuration();

舉例:

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                           //設置串口1中斷

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                               //子優先級爲0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                              //使能

NVIC_Init(&NVIC_InitStructure);

}

注:如需要外部中斷啓動ADC,則需要配置,自動轉換不需要配置

3、              端口初始化:

GPIO_Configuration();

端口初始化不但包括要用IO,也包括ADCIO口初始化;

RCC_APB1PeriphClockCmd(XX, ENABLE);                //使能APB1低速總線

RCC_APB2PeriphClockCmd(XX,ENABLE);                 //使能APB2高速總線

普通IO配置:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;     //定義GPIOX中的x腳,輸出需要規定速度   

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOX, &GPIO_InitStructure);

注:模式包涵:

GPIO_Mode_AINGPIO_Mode_IN_FLOATINGGPIO_Mode_IPDGPIO_Mode_IPUGPIO_Mode_Out_OD GPIO_Mode_Out_PPGPIO_Mode_AF_OD GPIO_Mode_AF_PP

ADCIO配置:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOC, &GPIO_InitStructure); //設置AD模擬輸入端口爲輸入一共2AD 規則通道

4、              ADC初始化:

ADC_Configuration();

如果使用多路採集的話,在ADC初始化中需要進行DMA的初始化。

aDMA初始化例子如下所示:

/* DMA channel1 configuration ----------------------------------------------*/

DMA_DeInit(DMA1_Channel1);               //使能DMA

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  //DMA通道1的地址

//需要定義 ADC1_DR_Address範圍0x4001 2400 - 0x4001 27FF

如:#define ADC1_DR_Address    ((u32)0x4001244C)

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//DMA傳送地址

//需要定義ADC_ConvertedValue

volatile unsigned  short  int  ADC_ConvertedValue[2];

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //傳送方向

DMA_InitStructure.DMA_BufferSize = 2;                 //傳送內存大小,216

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//當前外設寄存器地址不變

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;     //傳送內存地址遞增

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;                  //ADC1轉換的數據是16

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;     

//傳送的目的地址是16位寬度

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                                                 //循環模式

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

DMA_Init(DMA1_Channel1, &DMA_InitStructure);

   

/* 允許DMA1通道1傳輸結束中斷 */

//DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);

 

//使能DMA通道1

DMA_Cmd(DMA1_Channel1, ENABLE);

 

bADC初始化如下:

//ADC配置

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //ADC1工作在獨立模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE;         //模數轉換工作在掃描模式(多通道)還是單次(單通道)模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;     //ADC轉換工作在自動連續模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//轉換由軟件而不是外部觸發啓動

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC數據右對齊

         ADC_InitStructure.ADC_NbrOfChannel = 2;//規定了順序進行規則轉換的ADC通道的數目。這個數目的取值範圍是116

         ADC_Init(ADC1, &ADC_InitStructure);

        

         /* ADC1 regular channels configuration [規則模式通道配置]*/

 

         //ADC1 規則通道配置

       ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);     //通道10採樣時間 55.5週期

       ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);     //通道11採樣時間 55.5週期

      

 

         //使能ADC1 DMA

         ADC_DMACmd(ADC1, ENABLE);

         //使能ADC1

         ADC_Cmd(ADC1, ENABLE);    

        

         // 初始化ADC1校準寄存器

         ADC_ResetCalibration(ADC1);

         //檢測ADC1校準寄存器初始化是否完成

         while(ADC_GetResetCalibrationStatus(ADC1));

        

         //開始校準ADC1

         ADC_StartCalibration(ADC1);

         //檢測是否完成校準

         while(ADC_GetCalibrationStatus(ADC1));

 

通過         ADC_SoftwareStartConvCmd(ADC1, ENABLE);      進行軟啓動

 

 

如上初始化所示,ADC轉化結果將存入ADC_ConvertedValue數組中去,到時只需讀取其值即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章