1. 初始化阶段---cubemx
(1) GPIO初始化
函数 :HAL_GPIO_Init()
作用 :配置ADC引脚为模拟输入模式。
代码示例:
cs
// 使能GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA1为模拟输入
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; // 必须为模拟模式
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
(2) ADC基础配置---cubemx
函数 :HAL_ADC_Init()
作用 :初始化ADC模块,设置分辨率、数据对齐方式、扫描模式等。
代码示例:
cs
ADC_HandleTypeDef hadc1; // 定义ADC句柄
hadc1.Instance = ADC1; // 使用ADC1
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // 禁用多通道扫描
hadc1.Init.ContinuousConvMode = DISABLE; // 单次转换模式
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.NbrOfConversion = 1; // 转换1个通道
HAL_ADC_Init(&hadc1); // 初始化ADC
(3) ADC校准(可选但推荐)
函数 :HAL_ADCEx_Calibration_Start()
作用 :校准ADC,减少转换误差。
代码示例:
cs
HAL_ADCEx_Calibration_Start(&hadc1); // 执行ADC校准
(4) 配置ADC通道---cubemx
函数 :HAL_ADC_ConfigChannel()
作用 :设置ADC通道的采样时间、转换顺序等。
代码示例:
cs
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_1; // 使用通道1(对应PA1)
sConfig.Rank = ADC_REGULAR_RANK_1; // 转换序列中的第1个通道
sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5; // 采样时间55.5周期
HAL_ADC_ConfigChannel(&hadc1, &sConfig); // 配置通道
2. 启动转换阶段
(5) 启动ADC转换
函数 :HAL_ADC_Start()
作用 :启动ADC转换(单次模式需手动触发)。
代码示例:
cs
HAL_ADC_Start(&hadc1); // 启动ADC转换
(6) 等待转换完成
函数 :HAL_ADC_PollForConversion()
作用 :阻塞等待ADC转换完成。
代码示例:
cs
// 等待转换完成,超时时间100ms
if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {
// 转换成功
}
3. 读取结果阶段
(7) 获取ADC值
函数 :HAL_ADC_GetValue()
作用 :读取ADC转换结果(12位值,范围0~4095)。
代码示例:
cs
uint32_t adc_value = HAL_ADC_GetValue(&hadc1); // 读取ADC值
关键函数总结
函数 | 作用 |
---|---|
HAL_ADC_Init() |
初始化ADC模块(设置分辨率、对齐方式等) |
HAL_ADC_ConfigChannel() |
配置ADC通道(选择通道、设置采样时间) |
HAL_ADCEx_Calibration_Start() |
校准ADC,提高精度(需在初始化后调用) |
HAL_ADC_Start() |
启动ADC转换(单次模式需每次手动调用) |
HAL_ADC_PollForConversion() |
等待转换完成(阻塞方式) |
HAL_ADC_GetValue() |
读取ADC转换结果 |