STM32F103ZET3 ADC多通道采集工程
时间: 2025-06-13 17:45:30 浏览: 10
### STM32F103ZET3 ADC多通道采集实现方案及示例代码
STM32F103ZET3 微控制器具有三个独立的 ADC 模块,每个模块可以配置为单次或连续转换模式,并支持通过 DMA 进行高效的数据传输。以下是一个完整的实现方案和代码示例,展示如何使用 DMA 方式进行多通道 ADC 数据采集。
#### 1. 硬件配置
在硬件层面,需要选择合适的引脚作为 ADC 输入通道。根据引用[^4],只有标注为“ADCx_INx”的引脚才能用于 ADC 数据采集。例如,PC1 可以用作 ADC1、ADC2 或 ADC3 的输入通道(通道 11)。确保所选引脚与所需的 ADC 模块匹配。
#### 2. 软件初始化
软件初始化包括 GPIO 配置、ADC 配置以及 DMA 配置。以下是关键步骤:
- **GPIO 初始化**:将 ADC 引脚配置为模拟输入模式。
- **ADC 初始化**:配置 ADC 的分辨率、扫描模式、采样时间等参数。
- **DMA 初始化**:启用 DMA 功能,配置数据传输方向、缓冲区大小等。
#### 3. 示例代码
以下是一个基于 HAL 库的多通道 ADC 采集示例代码,使用 DMA 方式完成数据传输。
```c
#include "stm32f1xx_hal.h"
// 定义全局变量
uint16_t adc_buffer[3]; // 存储3个通道的ADC值
// ADC初始化函数
void MX_ADC_Init(void) {
ADC_HandleTypeDef hadc1;
ADC_ChannelConfTypeDef sConfig = {0};
// ADC时钟使能
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
// GPIO初始化
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; // PC0, PC1, PC2
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// ADC初始化
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ENABLE; // 启用扫描模式
hadc1.Init.ContinuousConvMode = ENABLE; // 启用连续转换模式
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.NbrOfConversion = 3; // 转换次数
HAL_ADC_Init(&hadc1);
// 配置ADC通道
sConfig.Channel = ADC_CHANNEL_10; // PC0 -> ADC1_IN10
sConfig.Rank = 1; // 第一个通道
sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_11; // PC1 -> ADC1_IN11
sConfig.Rank = 2; // 第二个通道
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_12; // PC2 -> ADC1_IN12
sConfig.Rank = 3; // 第三个通道
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
// DMA初始化
DMA_HandleTypeDef hdma_adc1;
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR; // 循环模式
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
HAL_DMA_Init(&hdma_adc1);
__HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc1); // 将DMA与ADC关联
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adc_buffer, 3); // 启动DMA传输
}
int main(void) {
HAL_Init(); // 初始化HAL库
MX_ADC_Init(); // 初始化ADC
while (1) {
// 主循环中可以处理ADC数据
}
}
```
#### 4. 关键点说明
- **扫描模式**:通过 `hadc1.Init.ScanConvMode = ENABLE` 启用扫描模式,允许依次采集多个通道的数据[^1]。
- **DMA 配置**:使用 `HAL_ADC_Start_DMA` 函数启动 DMA 传输,减少 CPU 占用率,提高数据采集效率[^2]。
- **数据缓冲区**:定义了一个 `adc_buffer` 数组,用于存储从多个通道采集到的 ADC 值。
####
阅读全文
相关推荐


















