1 步驟:
1.1 初始化ADC
ADC_HandleTypeDef hadc1; void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //四分頻,ADCCLK=PCLK2/4 hadc1.Init.Resolution = ADC_RESOLUTION_12B; //12位模式 hadc1.Init.ScanConvMode = DISABLE; //非掃描模式 hadc1.Init.ContinuousConvMode = DISABLE; //非連續轉換模式 hadc1.Init.DiscontinuousConvMode = DISABLE; //禁止不連續采樣模式 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; //使用軟件觸發 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; //軟件觸發 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右對齊(推薦) hadc1.Init.NbrOfConversion = 1; //1個轉換在規則序列中 hadc1.Init.DMAContinuousRequests = DISABLE; //關閉DMA請求 hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; //關閉EOC中斷 HAL_ADC_Init(&hadc1); //初始化
1.2 配置ADC底層驅動,配置引腳
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(adcHandle->Instance==ADC1) //判斷是否為ADC1 { __HAL_RCC_ADC1_CLK_ENABLE(); //使能ADC1時鍾 __HAL_RCC_GPIOA_CLK_ENABLE(); //開啟GPIOA時鍾 GPIO_InitStruct.Pin = GPIO_PIN_5; //PA5 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; //模擬 GPIO_InitStruct.Pull = GPIO_NOPULL; //不帶上下拉 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_NVIC_SetPriority(ADC_IRQn, 0, 0); HAL_NVIC_EnableIRQ(ADC_IRQn); } }
1.3 配置通道,讀取ADC值
uint16_t Get_ADC(uint32_t channel) { ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = channel; //通道,取值范圍ADC_CHANNEL_0~ADC_CHANNEL_16 sConfig.Rank = 1; //第1個序列,序列1 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; //采樣時間 HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_Start(&hadc1); //開啟ADC HAL_ADC_PollForConversion(&hadc1,10); //輪詢轉換 return (uint16_t)HAL_ADC_GetValue(&hadc1); //返回最近轉換結果 }
1.4 在main函數中調用Get_ADC(uint32_t channel)
2 使用CubeMX配置