STM32CubeMX配置ADC多通道采集与DMA传输
硬件准备
- 确保STM32芯片支持多路ADC和DMA功能(如STM32F103)
- 准备两路模拟信号输入通道
- 内部基准电压通道(VREFINT)需在芯片内部启用
CubeMX配置步骤
系统基础配置
- 在RCC设置中启用外部晶振(HSE)
- 在SYS中启用Debug(如Serial Wire)
- 配置时钟树确保ADC时钟不超过器件限制(通常≤14MHz)
ADC1配置
- 在Analog下选择ADC1
- 启用Scan Conversion Mode
- 设置Data Alignment为Right
- 设置Regular Conversion Mode为Discontinuous
- 配置Number Of Conversion为3(两路外部+1路内部基准)
- 配置ADC中断 ADC通道参数
- 通道8:选择对应GPIO引脚,设置Sampling Time(建议≥15 cycles)
- 通道9:选择另一GPIO引脚,设置相同Sampling Time
- 通道16/Vrefint Channel:选择VREFINT通道,设置Sampling Time
触发源配置
- 选择Timer Trigger Out事件作为触发源
- 配置定时器(如TIM3)产生周期触发信号
- 设置定时器预分频和自动重装载值决定采样频率
DMA配置
- 添加DMA通道用于ADC1
- 设置Mode为Circular(循环模式)
- 数据宽度选择Half Word
- 启用Memory Increment
- 配置中断优先级(可选)
生成代码与编程
- 在Project Manager标签页设置工程名称、路径和IDE类型(如MDK-ARM)。选择生成代码的选项后点击"Generate Code"。 关键代码实现
// 在main.c中添加变量定义
#define ADC_BUF_LEN 3
uint16_t adcBuf[ADC_BUF_LEN];
// 在MX_ADC1_Init()后添加校准和启动代码
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcBuf, ADC_BUF_LEN);
// 定时器启动
HAL_TIM_Base_Start(&htim3);
数据处理
// 获取转换结果(1.2f需参考手册)
float ch8_voltage = adcBuf[0] * 1.2f / adcBuf[2];
float ch9_voltage = adcBuf[1] * 1.2f / adcBuf[2];
注意事项
- 确保DMA缓冲区大小足够存储所有通道数据
- 定时器触发频率应低于ADC最大采样率
- 内部基准电压(VREFINT)需要特定温度下校准
- 多通道采样时,采样时间总和应小于触发周期
调试技巧
- 使用ST-Link Utility监测内存数据
- 通过Breakpoint检查DMA传输完成标志
- 测量实际采样率与理论值对比
- 检查电源稳定性对ADC精度的影响
通过上述配置,系统将实现定时器触发ADC多通道采样,并通过DMA自动传输数据到内存,软件只需定期读取内存中的转换结果即可。
完整工程:https://download.csdn.net/download/qq_28317813/91654486
评论前必须登录!
注册