STM32HAL库ADC采集多通道的值
时间: 2025-03-30 18:09:09 浏览: 78
### STM32 HAL 库实现 ADC 多通道采集
为了使用 STM32 HAL 库实现多通道 ADC 采集,需要配置多个参数并编写相应的初始化代码。以下是详细的说明以及示例代码。
#### 参数配置
1. **ADC 时钟 (ADC_CLK)**
ADC 的输入时钟由 PCLK2 经过分频产生,最大值为 36 MHz,典型值为 30 MHz[^1]。分频因子通过 `ADC_CCR` 寄存器中的 `ADCPRE[1:0]` 设置,支持的分频系数为 2、4、6 和 8。
2. **采样时间**
每个通道的采样时间可以通过 `ADC_SMPR1` 和 `ADC_SMPR2` 寄存器设置。对于通道 0 到 9 使用 `ADC_SMPR2`,而对于通道 10 到 17 使用 `ADC_SMPR1`。最快采样时间为 3 个 ADC_CLK 周期。
3. **扫描模式**
启用扫描模式以便依次读取多个通道的数据。这可以在 HAL 初始化结构体中启用。
#### 示例代码
以下是一个完整的示例代码,展示如何使用 STM32 HAL 库实现多通道 ADC 数据采集:
```c
#include "stm32f4xx_hal.h"
// 定义全局变量用于存储 ADC 转换结果
uint16_t adc_values[3]; // 存储三个通道的结果
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1)
{
// 开始一次转换
HAL_ADC_Start(&hadc1);
// 等待所有通道转换完成
if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
{
// 获取每个通道的转换结果
for (int i = 0; i < 3; i++)
{
adc_values[i] = HAL_ADC_GetValue(&hadc1);
}
// 打印结果到串口或其他调试工具
printf("Channel 0: %d\r\n", adc_values[0]);
printf("Channel 1: %d\r\n", adc_values[1]);
printf("Channel 2: %d\r\n", adc_values[2]);
// 添加延迟以降低打印频率
HAL_Delay(500);
}
}
}
/**
* @brief ADC1 Initialization Function
*/
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // 设置分频因子为 4
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 设置分辨率为 12 位
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 = 3; // 总共转换 3 个通道
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
// 配置第一个通道 (假设为 Channel 0)
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1; // 排序优先级为第 1
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // 最短采样时间
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
// 配置第二个通道 (假设为 Channel 1)
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 2; // 排序优先级为第 2
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
// 配置第三个通道 (假设为 Channel 2)
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = 3; // 排序优先级为第 3
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
```
#### 注意事项
- 上述代码假定使用的是 STM32F4 系列微控制器,并启用了 GPIO 和 ADC 的外设时钟。
- 如果需要更高的精度或更快的速度,请调整分辨率和采样时间。
- 在实际应用中可能还需要处理中断或 DMA 来提高效率。
---
阅读全文
相关推荐


















