STM32F407三重ADC交替采样实现方案
一、硬件配置
-
电路连接
-
通道分配:三个ADC共用同一输入通道(如ADC1_IN5、ADC2_IN5、ADC3_IN5)
-
电源与滤波:
- ADC输入端并联10kΩ电阻 + 100nF电容(低通滤波)
- 电源引脚添加0.1μF陶瓷电容并联10μF电解电容
-
-
关键参数
- 最大采样率:三重交替模式下理论可达7.2MSPS(实际约6MSPS)
- 时钟配置:APB2时钟≥144MHz(分频后ADC时钟≤36MHz)
- 触发源:推荐使用定时器(如TIM8)触发,确保严格同步
二、软件配置(CubeMX)
1. 时钟树配置
HSE → PLL → 系统时钟(168MHz)
APB2分频系数:2 → 84MHz(满足ADC时钟≤36MHz)
2. ADC模式设置
- 主从模式:选择
Triple interleaved mode only(三重交替模式) - 触发源:选择定时器触发(如TIM8的更新事件)
- DMA模式:
DMA access mode 1(三重交替专用模式)
3. 定时器配置
- 时钟源:内部时钟(84MHz)
- 预分频系数:1
- 重装载值:14 → 触发频率=84MHz/(1+1)/(14+1)=3MHz
- 触发事件:更新事件(Update Event)
三、代码实现
1. 初始化代码(HAL库)
// main.c
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
void MX_ADC1_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
// 三重交替模式配置
ADC_CommonInitTypeDef ADC_CommonInitStructure = {0};
ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_RegSimult; // 三重同步规则模式
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; // 84MHz/4=21MHz
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; // DMA模式1
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; // 采样延迟
HAL_ADCEx_CommonInit(&hadc1, &ADC_CommonInitStructure);
// 通道配置
sConfig.Channel = ADC_CHANNEL_5;
sConfig.Rank = 1;
HAL_ADC_ConfigChannelAttenuation(&hadc1, ADC_CHANNEL_5, ADC_ATTENUATION_11DB);
}
void MX_DMA_Init(void) {
__HAL_RCC_DMA2_CLK_ENABLE();
hdma_adc1.Instance = DMA2_Stream0;
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.Mode = DMA_CIRCULAR; // 循环模式
HAL_DMA_Init(&hdma_adc1);
__HAL_LINKDMA(&hadc1, hdmarx, hdma_adc1);
}
2. 中断回调函数
// 三重ADC数据拆分(DMA传输32位数据)
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
uint32_t raw_data = hdma_adc1.Instance->CNDTR; // 当前剩余数据量
for (int i=0; i<ADC_DMA_SIZE; i++) {
uint32_t temp = ((uint32_t)adc_dma_buffer[i*2] << 16) | adc_dma_buffer[i*2+1];
adc_buffer[i] = (float)(temp & 0x0FFF) * 3.3f / 4095.0f; // 转换为电压值
}
}
参考代码 STM32F407自带ADC模块的三重采样 www.youwenfan.com/contentcnr/102138.html
四、关键问题与解决方案
| 问题现象 | 原因分析 | 解决方案 |
|---|---|---|
| 采样率不达预期 | 定时器触发间隔设置错误 | 检查定时器重装载值与分频系数 |
| 数据错乱 | DMA传输模式配置错误 | 确认DMA模式为DMA access mode 1 |
| 通道间干扰 | 采样延迟不足 | 增加ADC_TwoSamplingDelay至15周期 |
| 总线冲突 | 多ADC同时启用未正确初始化 | 按顺序初始化ADC1→ADC2→ADC3 |