蓝桥杯嵌入式adc双通道采样
时间: 2025-03-16 18:02:30 浏览: 105
### STM32G4 蓝桥杯嵌入式 ADC 双通道采样实现
在蓝桥杯嵌入式比赛项目中,使用 STM32G4 微控制器进行 ADC 的双通道采样是一个常见的需求。以下是基于提供的引用内容以及专业知识整理的解决方案。
#### 1. 配置 ADC 多通道采样
为了实现双通道采样,可以采用 DMA 方式或者轮询方式完成数据读取。以下分别介绍这两种方法:
##### 方法一:DMA 传输配置
通过启用 DMA 功能来自动处理 ADC 数据传输至内存缓冲区,这种方式适合高频率采样场景。具体步骤如下:
- 初始化 ADC 和 DMA 控制器。
- 设置多通道扫描模式并指定要使用的输入通道。
- 启动 ADC 并触发 DMA 请求。
示例代码展示如何设置两个通道(假设为 CH0 和 CH1)并通过 DMA 进行连续采样:
```c
// 定义全局变量用于存储采样结果
uint16_t adcBuffer[2];
void MX_ADC_Init(void) {
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.ScanConvMode = ENABLE; // 开启扫描模式
hadc.Init.ContinuousConvMode = ENABLE; // 开启连续转换模式
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.NbrOfConversion = 2; // 总共采样两次 (CH0, CH1)
HAL_ADC_Init(&hadc);
// 配置通道参数
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1; // 排序优先级
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 2; // 下一个排序位置
HAL_ADC_ConfigChannel(&hadc, &sConfig);
// 配置 DMA
hdma_adc.Instance = DMA1_Stream0;
hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc.Init.Mode = DMA_CIRCULAR; // 使用循环模式
HAL_DMA_Init(&hdma_adc);
__HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc); // 将 DMA 绑定到 ADC
HAL_ADC_Start_DMA(&hadc, (uint32_t*)adcBuffer, 2); // 启动 DMA 传输
}
```
上述代码实现了对两路信号的同时采样,并利用 DMA 技术减少 CPU 占用率[^1]。
##### 方法二:轮询方式获取值
如果应用环境允许较低效率的操作,则可以选择简单的轮询机制逐次访问各通道的数据。这种方法适用于低功耗设计或调试阶段验证硬件连接正确与否的情况。
下面给出一段简易版函数 `ADC_Key_GET` 来演示这一过程:
```c
#include "stm32g4xx_hal.h"
void ADC_Key_GET(uint16_t *temp) {
HAL_ADC_Start(&hadc2); // 开始一次新的转换序列
for(int i = 0 ; i < 2; i++) { // 对于每条通道执行单独查询操作
temp[i] = HAL_ADC_GetValue(&hadc2);
HAL_Delay(1); // 添加短延时以便稳定下一个测量周期
}
}
```
此版本仅支持同步调用形式下的单步采集动作[^3]。
无论选用哪种方案,在实际部署前都应考虑目标平台的具体特性及其约束条件,比如供电电压范围是否满足传感器接口要求等问题[^4]。
---
阅读全文
相关推荐


















