hal库adc采样
时间: 2025-07-01 22:44:34 浏览: 6
### STM32 HAL库 ADC采样配置教程
#### 配置概述
STM32 的 HAL 库提供了简单易用的接口来配置和操作 ADC 功能。无论是单通道还是多通道采集,都可以通过初始化结构体以及调用相应的 API 函数轻松实现。
---
#### 单通道 ADC 采样配置
对于单通道 ADC 采样,可以通过以下方式进行配置:
1. **初始化 ADC 外设**
使用 `MX_ADC_Init()` 或手动设置 `ADC_HandleTypeDef` 结构体中的参数,例如分辨率、数据对齐方式等。
2. **启动 ADC 转换并读取值**
在主程序中使用如下代码片段进行单次采样[^2]:
```c
HAL_ADC_Start(&hadc1); // 启动 ADC 转换
if (HAL_ADC_PollForConversion(&hadc1, 50) == HAL_OK) {
uint16_t adc_value = HAL_ADC_GetValue(&hadc1);
float voltage = ((float)adc_value * 3.3f / 4096); // 将 AD 值转换为实际电压
}
```
上述代码实现了简单的单通道 ADC 数据采集,并将其转化为对应的电压值。
---
#### 多通道 DMA 方式 ADC 采样配置
当需要同时采集多个通道的数据时,推荐使用 DMA 模式以提高效率。以下是具体实现方法:
1. **定义缓冲区用于存储 ADC 数据**
定义一个数组作为 DMA 缓冲区,大小取决于要采集的通道数。
```c
uint16_t adc_buffer[NUMBER_OF_CHANNELS]; // NUMBER_OF_CHANNELS 是通道数量
```
2. **配置 ADC 初始化结构体**
设置 `ADC_ChannelConfTypeDef` 和 `ADC_HandleTypeDef` 中的相关字段,指定输入通道号、采样时间和扫描模式等。
```c
static void MX_ADC1_Init(void)
{
ADC_MultiModeTypeDef multimode;
ADC_ChannelConfTypeDef sConfig;
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PRESK_2; // 时钟分频器
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 分辨率
hadc1.Init.ScanConvMode = ENABLE; // 扫描模式开启
hadc1.Init.ContinuousConvMode = DISABLE; // 连续转换关闭
hadc1.Init.DiscontinuousConvMode = DISABLE; // 不连续转换关闭
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; // 触发源无外部触发
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 右对齐
hadc1.Init.NbrOfConversion = NUMBER_OF_CHANNELS; // 转换次数等于通道数
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_5; // 输入通道编号
sConfig.Rank = 1; // 排序等级
sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5; // 采样时间
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
// 如果有其他通道,则重复以上步骤调整 Channel 和 Rank 参数
}
```
3. **启用 DMA 并启动 ADC 转换**
配置 DMA 控制器并将它绑定到 ADC 上下文中。之后可通过函数 `HAL_ADC_Start_DMA()` 开始传输过程[^1][^3]。
```c
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, NUMBER_OF_CHANNELS);
```
此命令会自动填充之前声明好的 `adc_buffer[]` 数组,其中每一项代表对应通道上的测量结果。
4. **处理接收到的数据**
当所有样本都被成功转移到内存后,在中断服务例程或者轮询机制里访问这些数值即可进一步计算或显示出来。
---
#### 注意事项
- 确保所选微控制器型号支持目标功能(如某些低端系列可能不完全兼容全部特性)。
- 对于高精度应用场合建议执行硬件级校正操作以消除误差影响。
- 若涉及实时性强的任务场景则优先考虑中断驱动而非阻塞型API调用形式。
阅读全文
相关推荐

















