1. 程式人生 > 實用技巧 >13-STM32 ADC程式設計

13-STM32 ADC程式設計

ADC結構體

 1  typedef struct
 2 {
 3  uint32_t ADC_Mode; // ADC 工作模式選擇
 4  FunctionalState ADC_ScanConvMode; /* ADC 掃描(多通道)或者單次(單通道)模式選擇 */
 6  FunctionalState ADC_ContinuousConvMode; // ADC 單次轉換或者連續轉換選擇
 7  uint32_t ADC_ExternalTrigConv; // ADC 轉換觸發訊號選擇
 8  uint32_t ADC_DataAlign; // ADC 資料暫存器對齊格式
 9  uint8_t ADC_NbrOfChannel; //
ADC 採集通道數 10 } ADC_InitTypeDef;
ADC_Mode:當使用一個 ADC 時是獨立模式,使用兩個 ADC 時是雙模式,在雙模式下還有很多細分模式可選 
ADC_ScanConvMode:配置是否使用掃描。如果是單通道 AD 轉 換 使 用 DISABLE , 如 果 是 多 通 道 AD 轉 換 使 用 ENABLE , 具 體 配 置ADC_CR1:SCAN 
ADC_ContinuousConvMode:可選引數為 ENABLE DISABLE,配置是啟動自動連續轉換還是單次轉換。使用 ENABLE 配置為使能自動連續轉換;使用 DISABLE 配置為單次轉換,轉換一次後停止需要手動控制才重新啟動轉換, 具體配置 ADC_CR2:CON 位。
ADC_ExternalTrigConv:外部觸發選擇,可根據專案需求配置觸發來源。實際上,我們一般使用軟體自動觸發。
ADC_DataAlign:轉換結果資料對齊模式,可選右對齊ADC_DataAlign_Right或者左對齊 ADC_DataAlign_Left。一般我們選擇右對齊模式。
ADC_NbrOfChannelAD 轉換通道數目

單通道單次採集:
 1 //ADC單通道單次轉換
 2 void ADC_Config(void)
 3 {
 4     GPIO_InitTypeDef GPIO_InitStructure;
 5     ADC_InitTypeDef ADC_InitStructure;
 6     NVIC_InitTypeDef NVIC_InitStructure;
 7 
 8      //開啟ADC1和GPIO的時鐘,兩者都在APB2總線上掛載著
 9     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1, ENABLE);     
10 11 12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入 14 GPIO_Init(GPIOC, &GPIO_InitStructure); 15 16 17 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//第二組 18 NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; 19 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;//搶佔優先順序 20 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //響應優先順序 21 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能 22 NVIC_Init(&NVIC_InitStructure); 23 24 25 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //獨立模式(一個ADC工作) 26 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //單通道掃描模式(只有一個通道) 27 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //DISABLE--單次轉換模式 ENABLE--連續轉換模式 28 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不受外界決定,軟體觸發模式 29 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //資料右對齊 30 ADC_InitStructure.ADC_NbrOfChannel = 1; //掃描通道數--1 31 RCC_ADCCLKConfig(RCC_PCLK2_Div8);//配置ADC取樣參考時鐘的預分頻值 72M÷8=9M <14M 32 ADC_Init(ADC1,&ADC_InitStructure); 33 34 ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//使能ADC中斷 35 36 //規則通道配置(ADCx 通道 取樣次序 取樣時間) 37 ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);//ADC1, 38 ADC_Cmd(ADC1,ENABLE);//使能ADC1 39 40 41 //取樣校準 42 ADC_ResetCalibration(ADC1); //初始化ADC取樣校準器 43 while(ADC_GetResetCalibrationStatus(ADC1));//等待初始化完成 44 ADC_StartCalibration(ADC1); //開始校準 45 while(ADC_GetCalibrationStatus(ADC1));//等待校準完成 46 47 48 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//啟動軟體轉換(沒有采用外部觸發) 49 } 50 51 52 53 void ADC1_2_IRQHandler(void) 54 { 55 if(ADC_GetITStatus(ADC1,ADC_IT_EOC)==SET) 56 57 ADC_Value =ADC_GetConversionValue(ADC1);//獲取轉換的結果 58 59 ADC_ClearITPendingBit(ADC1,ADC_IT_EOC); 60 }