stm32f103c8t6多路adc采集HAL库
时间: 2025-05-11 08:27:12 浏览: 16
### STM32F103C8T6 HAL库多路ADC采集方法
在嵌入式系统开发中,STM32F103C8T6 的 ADC 功能可以通过 HAL 库实现高效的模数转换。为了支持多路 ADC 数据采集,需要合理配置多个通道以及相应的扫描模式。
以下是基于 HAL 库的多路 ADC 采集示例代码及其配置说明:
#### 配置步骤概述
1. 初始化 ADC 模块并启用扫描模式。
2. 配置各个 ADC 通道的具体参数(如采样时间和分辨率)。
3. 启动 ADC 转换并通过中断或轮询方式读取数据。
---
#### 示例代码
```c
#include "stm32f1xx_hal.h"
// 定义全局变量存储 ADC 值
uint16_t adcValues[3]; // 存储三个通道的数据
void MX_ADC_Init(void) {
ADC_HandleTypeDef hadc;
ADC_ChannelConfTypeDef sConfig;
// 初始化 ADC 句柄结构体
hadc.Instance = ADC1; // 使用 ADC1 实例
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; // 设置时钟分频
hadc.Init.Resolution = ADC_RESOLUTION_12B; // 设置分辨率为 12 位
hadc.Init.ScanConvMode = ENABLE; // 启用扫描模式
hadc.Init.ContinuousConvMode = DISABLE; // 禁用连续转换模式
hadc.Init.DiscontinuousConvMode = DISABLE; // 禁用不连续转换模式
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; // 不使用外部触发
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc.Init.NbrOfConversion = 3; // 总共要转换 3 个通道
if (HAL_ADC_Init(&hadc) != HAL_OK) { // 初始化 ADC
Error_Handler();
}
// 配置第一个通道 (PA0)
sConfig.Channel = ADC_CHANNEL_0; // PA0 对应 ADC_IN0
sConfig.Rank = 1; // 排序优先级为第 1
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // 设置采样时间为 3 个周期
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) {
Error_Handler();
}
// 配置第二个通道 (PA1)
sConfig.Channel = ADC_CHANNEL_1; // PA1 对应 ADC_IN1
sConfig.Rank = 2; // 排序优先级为第 2
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) {
Error_Handler();
}
// 配置第三个通道 (PA2)
sConfig.Channel = ADC_CHANNEL_2; // PA2 对应 ADC_IN2
sConfig.Rank = 3; // 排序优先级为第 3
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) {
Error_Handler();
}
}
void Start_ADC_Conversion(ADC_HandleTypeDef* hadc) {
if (HAL_ADC_Start(hadc) != HAL_OK) { // 开始 ADC 转换
Error_Handler();
}
if (HAL_ADC_PollForConversion(hadc, 100) != HAL_OK) { // 轮询等待转换完成
Error_Handler();
}
for (int i = 0; i < 3; i++) {
adcValues[i] = HAL_ADC_GetValue(hadc); // 获取每个通道的值
}
}
```
---
#### 关键点解析
1. **初始化 ADC**
`MX_ADC_Init` 函数负责初始化 ADC 模块的核心设置,包括时钟分频、分辨率、扫描模式等[^1]。
2. **配置 ADC 通道**
利用 `HAL_ADC_ConfigChannel()` 函数逐一配置各通道的参数,例如采样时间、通道编号和排序优先级[^2]。
3. **启动与获取数据**
使用 `HAL_ADC_Start()` 和 `HAL_ADC_PollForConversion()` 来控制 ADC 转换过程,并通过 `HAL_ADC_GetValue()` 提取具体数值。
4. **错误处理机制**
如果任何阶段发生异常,则调用自定义的 `Error_Handler()` 进行错误捕获和响应。
---
#### 注意事项
- 扫描模式下,需确保所有目标通道均被正确配置到序列中。
- 若涉及高频率信号采集,建议优化采样时间以减少误差。
- 中断驱动模式可替代轮询方式提升实时性能。
---
阅读全文
相关推荐


















