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配置