13-STM32 ADC程式設計
阿新 • • 發佈:2020-12-06
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_NbrOfChannel: AD 轉換通道數目
單通道單次採集:
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 }