stm32adc采集电压HAL
时间: 2025-04-01 21:21:15 浏览: 39
### STM32 HAL库 ADC 采集电压 示例代码教程
#### 使用HAL库配置ADC采集电压的关键步骤说明
STM32微控制器中的ADC模块可以通过HAL库轻松实现模拟信号到数字信号的转换。为了正确配置并使用ADC来采集电压,需注意以下几个方面:
1. **ADC预分频器设置**
在配置ADC之前,需要调整其时钟频率以满足采样速率的要求。这通过`ADC_CCR`寄存器中的`ADCPRE`字段完成。此字段用于选择ADC的工作时钟分频系数[^1]。
2. **初始化ADC通道**
初始化过程中指定要使用的GPIO引脚作为ADC输入,并将其映射至相应的ADC通道。例如,在STM32F4系列中,PA0对应于ADC_IN0。
3. **启动DMA传输(可选)**
若希望连续采集数据而无需频繁轮询,则可以启用循环模式下的DMA功能。这样可以在后台自动处理大量数据传输任务[^2]。
以下是基于上述原理编写的一个简单示例程序,展示如何利用STM32 HAL库读取两个不同引脚上的电压值:
```c
#include "stm32f4xx_hal.h"
// 定义全局变量存储采集的数据
volatile float PA4_Voltage;
volatile float PA5_Voltage;
void MX_ADC_Init(void){
__HAL_RCC_ADC_CLK_ENABLE(); // 开启ADC时钟
hadc.Instance = ADC2; // 设置实例为ADC2
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8; // 配置同步时钟分频因子
hadc.Init.Resolution = ADC_RESOLUTION_12B; // 设定分辨率为12位
hadc.Init.ScanConvMode = DISABLE; // 关闭扫描模式
hadc.Init.ContinuousConvMode = ENABLE; // 启用连续转换模式
hadc.Init.DiscontinuousConvMode = DISABLE; // 禁用不连续转换模式
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;// 不使用外部触发源
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc.Init.NbrOfConversion = 2; // 转换数量为2次
HAL_ADC_Init(&hadc); // 初始化ADC
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_4; // 配置第一个通道为CH4(PA4)
sConfig.Rank = 1; // 排序等级为第1级
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // 采样时间为3周期
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_5; // 配置第二个通道为CH5(PA5)
sConfig.Rank = 2; // 排序等级为第2级
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}
uint32_t adcval[2];
void Start_ADC_Conversion(){
HAL_ADC_Start_DMA(&hadc,(uint32_t*)adcval,2); // 开始DMA传输并将结果保存到数组adcval[]中
}
void Get_ADC_Value(){
PA4_Voltage=((float)adcval[0]*3.3f)/4096; // 将数值转化为实际电压值(V=raw*Vref/4096),假设参考电压为3.3V
PA5_Voltage=((float)adcval[1]*3.3f)/4096;
}
```
以上代码片段展示了基本框架以及核心逻辑部分。具体应用时还需考虑更多细节如错误检测机制等。
#### 注意事项
- 当前例子假定了系统的供电电压即为内部参考电压(通常为3.3伏特或其它固定值), 实际项目里可能需要查阅芯片手册确认确切参数.
- DMA操作期间应小心管理中断优先级以免发生冲突.
阅读全文
相关推荐


















