hal库ADC采集电压
时间: 2025-05-09 13:17:32 浏览: 30
### 使用STM32 HAL库实现ADC电压采集
#### 1. ADC基本配置流程
为了通过HAL库实现ADC电压采集,需完成以下主要步骤:初始化硬件资源、设置ADC参数以及读取转换后的数值。STM32的ADC支持多种工作模式和高级功能,例如单次转换、连续转换、DMA传输等[^1]。
#### 2. 初始化过程详解
在实际应用中,通常需要先定义ADC句柄结构体`ADC_HandleTypeDef`来存储ADC的相关配置信息。以下是具体的初始化方法:
- **使能时钟**:确保目标ADC模块及其关联GPIO端口的时钟已启用。
- **配置引脚**:将用于输入模拟信号的GPIO引脚配置为模拟输入模式。
- **设定分辨率与采样时间**:根据需求调整ADC分辨率(如12位)及各通道的采样周期长度[^2]。
#### 3. 示例代码展示
下面提供一段基于STM32 HAL库的标准C语言程序片段,演示如何利用ADC进行简单的电压测量操作。
```c
#include "stm32f4xx_hal.h"
// 定义全局变量保存ADC结果
uint32_t adc_value;
void MX_ADC_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
__HAL_RCC_ADC1_CLK_ENABLE(); // 启动ADC1时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启PA口时钟
GPIO_InitTypeDef gpio_init_structure;
/* 配置 PA0 引脚作为模拟输入 */
gpio_init_structure.Pin = GPIO_PIN_0;
gpio_init_structure.Mode = GPIO_MODE_ANALOG;
gpio_init_structure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &gpio_init_structure);
hadc.Instance = ADC1; // 绑定到ADC1实例
hadc.Init.Resolution = ADC_RESOLUTION_12B;// 设置分辨率为12bit
hadc.Init.ScanConvMode = DISABLE; // 单一通道模式
hadc.Init.ContinuousConvMode = ENABLE; // 连续转换开启
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc.Init.NbrOfConversion = 1; // 转换次数为一次
if (HAL_ADC_Init(&hadc) != HAL_OK){
Error_Handler();
}
/** 配置特定信道 **/
sConfig.Channel = ADC_CHANNEL_0; // 选择第0号通道
sConfig.Rank = 1; // 排序等级最高优先级
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // 设定最短采样时间为三个周期
if(HAL_ADC_ConfigChannel(&hadc,&sConfig)!= HAL_OK ){
Error_Handler();
}
}
/* 主循环调用此函数获取当前AD值 */
void Read_ADC_Value(){
HAL_ADC_Start(&hadc); // 开始ADC转换
if(HAL_ADC_PollForConversion(&hadc,10)==HAL_OK){
adc_value=HAL_ADC_GetValue(&hadc); // 获取最新转换结果存入adc_value
}else{
Error_Handler(); // 如果超时则触发错误处理机制
}
}
```
上述代码实现了如下功能:
- 将STM32微控制器上的某个指定引脚(PA0)连接至内部ADC电路;
- 对应的ADC被初始化成适合实时监测场景的工作状态——采用固定频率持续扫描单一输入源,并返回量化后的离散电平表示形式[^3];
#### 4. 结果解释与后续计算
得到原始ADC码之后,还需要进一步将其映射回物理量范围之内。假设供电轨电压VDD等于3.3伏特,则每单位增量对应的实际差分幅度大约为\( \frac{3.3}{4096}≈8mV\) (对于标准12比特精度而言)。因此最终测得的具体电压可通过下述关系式求解得出:
\[ V_{measured}=Adc\_value\times\left(\frac{Vref}{Max\_Range}\right)\]
其中 \( Max\_Range=2^{Resolution}-1 \),而参考基准电压\( Vref \)一般默认同于核心电源级别一致。
---
阅读全文
相关推荐


















