STM32F407三重ADC交替采样实现方案

STM32F407三重ADC交替采样实现方案


一、硬件配置

  1. 电路连接

    • 通道分配:三个ADC共用同一输入通道(如ADC1_IN5、ADC2_IN5、ADC3_IN5)

    • 电源与滤波

      • ADC输入端并联10kΩ电阻 + 100nF电容(低通滤波)
      • 电源引脚添加0.1μF陶瓷电容并联10μF电解电容
  2. 关键参数

    • 最大采样率:三重交替模式下理论可达7.2MSPS(实际约6MSPS)
    • 时钟配置:APB2时钟≥144MHz(分频后ADC时钟≤36MHz)
    • 触发源:推荐使用定时器(如TIM8)触发,确保严格同步

二、软件配置(CubeMX)

1. 时钟树配置
HSE → PLL → 系统时钟(168MHz)
APB2分频系数:2 → 84MHz(满足ADC时钟≤36MHz)
2. ADC模式设置
3. 定时器配置

三、代码实现

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

 

专注于matlab/simulink,电子电路,编程