stm32f103c8t6的adc多通道
时间: 2025-05-12 07:35:24 浏览: 60
### STM32F103C8T6 ADC多通道配置教程及示例代码
#### 配置概述
STM32F103C8T6 的 ADC 支持多通道采集功能,可以通过扫描模式实现多个通道的连续转换。这种模式允许用户指定一组需要采样的通道,并依次对其进行转换[^4]。
为了实现多通道采集并将数据通过串口打印输出,通常需要完成以下几个方面的配置:
1. **ADC 初始化**:包括时钟使能、GPIO 配置以及 ADC 参数初始化。
2. **DMA 或轮询方式**:可以选择使用 DMA 提高效率或者采用简单的轮询机制读取数据。
3. **串口通信**:配置 USART 模块以便将采集到的数据发送至 PC 终端或其他设备。
---
#### 示例代码详解
以下是基于 HAL 库的一个简单示例代码,展示如何配置 STM32F103C8T6 实现 ADC 多通道采集并通过串口打印结果。
```c
#include "stm32f1xx_hal.h"
#include <stdio.h>
// 定义使用的 ADC 和 GPIO 引脚
#define ADC_CHANNEL_1 ADC_CHANNEL_0
#define ADC_CHANNEL_2 ADC_CHANNEL_1
#define ADC_CHANNEL_3 ADC_CHANNEL_2
uint16_t adc_values[3]; // 存储三个通道的 ADC 值
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init(); // 初始化 GPIO
MX_ADC1_Init(); // 初始化 ADC
MX_USART1_UART_Init();// 初始化 UART
while (1)
{
// 启动一次 ADC 转换
HAL_ADC_Start(&hadc1);
// 等待转换结束并获取值
if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK){
adc_values[0] = HAL_ADC_GetValue(&hadc1); // 获取第一个通道的值
if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK){
adc_values[1] = HAL_ADC_GetValue(&hadc1); // 获取第二个通道的值
if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK){
adc_values[2] = HAL_ADC_GetValue(&hadc1); // 获取第三个通道的值
// 打印 ADC 数据到串口
char buffer[50];
sprintf(buffer, "CH1:%d CH2:%d CH3:%d\r\n", adc_values[0], adc_values[1], adc_values[2]);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), 100);
}
}
}
HAL_Delay(500); // 每隔 500ms 进行一次测量
}
}
/**
* @brief ADC Initialization Function
*/
static void MX_ADC1_Init(void)
{
hadc1.Instance = ADC1;
// 配置 ADC 结构体参数
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; // 设置时钟分频
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 设置分辨率为 12bit
hadc1.Init.ScanConvMode = ENABLE; // 开启扫描模式
hadc1.Init.ContinuousConvMode = DISABLE; // 关闭连续转换模式
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;// 不使用外部触发
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 右对齐数据
hadc1.Init.NbrOfConversion = 3; // 总共要转换的通道数量
HAL_ADC_Init(&hadc1);
// 配置 ADC 通道
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = 2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = 3;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
```
上述代码展示了如何利用 HAL 库来配置 STM32F103C8T6 的 ADC 模块进行多通道采集,并通过串口打印结果[^1]。
---
#### 注意事项
- 在实际应用中,建议启用中断或 DMA 来提高性能,尤其是在高频采样场景下。
- 如果需要更高效的解决方案,可参考开源项目中的实现方法[^2]。
- `ad_init` 函数定义了基本的 ADC 初始化逻辑,而 `ad_getvalue` 则提供了针对特定通道的快速访问接口[^3]。
---
阅读全文
相关推荐


















