APM32F425三重ADC采样模式原理与应用详解

2026-04-16 17:09:34/ By Admin

  普通ADC采样是单路ADC独立工作,各自采集对应信号源,通道之间互不关联。而ADC三重采样模式(Triple ADC Mode),是在极海APM32F425这类搭载ADC1/ADC2/ADC3三个独立模块的MCU上,通过多ADC协同配合,利用同步或交替时序,实现更高采样率、多通道同步采集或信噪比优化的高级工作模式,在STM32F3/F4/H7等系列芯片中也广泛应用。

  ADC转换分为采样和转换两个阶段。三重模式的核心思路,就是让三个ADC在时间上交错或同步触发,并行完成采样与转换,从而突破单ADC速率瓶颈,或实现多路信号在时间上严格对齐采集。

  一、三重ADC两种核心工作模式

  三重ADC主要分为同步采样与交替采样两种实现方式,适用场景与性能特点差异明显。

  1.同步采样模式

  同步采样是三重规则通道最常用的配置方式,核心目标是保证多路信号采集时刻完全一致,消除时序偏差带来的测量误差。

  工作原理

  三个ADC共用同一个外部触发源,例如定时器TRGO信号或外部GPIO触发,触发信号同时启动三路ADC的规则通道转换。每个ADC可配置独立的规则通道,采样在同一时刻完成,转换过程并行执行,最终得到一组时间戳完全对齐的数据。

  例如:ADC1采集电压、ADC2采集电流、ADC3采集温度,同一触发信号可实现三路信号同步采样,便于后续数据融合与算法计算。

  模式特点

  优势:多路数据时间完全对齐,无相位差与时序差,适合三相电力、电机矢量控制、多传感器融合等对同步精度要求高的场景。

  局限:总采样率不高于单ADC速率,三路ADC并行转换,速率无法叠加。

  配置要点

  三路ADC独立配置规则通道序列,采样时间、数据对齐方式保持一致。

  关闭自动连续转换,使用单次转换或保证时序同步的连续转换模式。

  在公共控制寄存器中配置同步模式,关闭交替时序。

  2.交替采样模式

  交替采样的核心目标是突破单ADC速率上限,实现高频信号的高速连续采集。

  工作原理

  以主ADC(通常为ADC1)生成交错时序,ADC1/ADC2/ADC3的采样时刻依次微小延迟,转换阶段并行互不干扰。最终整体采样率接近单ADC速率的三倍。

  例如单ADC速率2.4MSPS,三重交替模式下可实现约7.2MSPS的高速采集,适用于振动信号、超声信号等高频采集场景。

  模式特点

  优势:大幅提升采样速率,无需额外硬件,通过时序并行实现速度倍增。

  局限:多路信号存在微小时序偏差,对系统时钟、PCB布线要求更高,数据解析需按固定交替顺序处理。

  配置要点

  三路ADC可配置为同一通道或相同序列通道,保证采样一致性。

  设置合理的转换延迟,控制三路ADC采样错开周期。

  在公共寄存器中开启交替同步模式,启用速率叠加功能。

  二、三重同步注入采样配置实例(电机三相电流采集)

  在电机控制等应用中,三相电流采样对同步性要求极高,通常采用三重同步注入模式。以下为基于APM32F425的典型配置示例:

void MX_ADC1_Init(void)
{
        GPIO_Config_T gpioConfig = {0};
        ADC_Config_T  adcConfig  = {0};
        ADC_CommonConfig_T adcCommonConfig ;
               
  /* Peripheral clock enable */
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC2);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC3);
        RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
  /**ADC1 GPIO Configuration
  PA0   ------> ADC123_IN0
  PA1   ------> ADC123_IN1
  PA2   ------> ADC123_IN2
        PA3   ------> ADC123_IN3
  */
  gpioConfig.pin = IU_Pin|IV_Pin|IW_Pin|VS_Pin;
  gpioConfig.mode = GPIO_MODE_AN;
  gpioConfig.pupd = GPIO_PUPD_NOPULL;
  GPIO_Config(GPIOA, &gpioConfig);
                /* ADC Common Configuration */
        adcCommonConfig.mode = ADC_MODE_TRIPLE_INJECSIMULT;
        adcCommonConfig.prescaler = ADC_PRESCALER_DIV4;  //30MHZ adc
        adcCommonConfig.accessMode = ADC_ACCESS_MODE_2;
        adcCommonConfig.twoSampling = ADC_TWO_SAMPLING_5CYCLES;
        ADC_CommonConfig(&adcCommonConfig);
        adcConfig.continuousConvMode = DISABLE;       
        adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
        adcConfig.extTrigConv = ADC_EXT_TRIG_CONV_TMR1_CC1;
        adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_NONE;
        adcConfig.nbrOfChannel = 3;
        adcConfig.resolution = ADC_RESOLUTION_12BIT;
        adcConfig.scanConvMode = ENABLE;
        ADC_Config(ADC1, &adcConfig);
        ADC_Config(ADC2, &adcConfig);
        ADC_Config(ADC3, &adcConfig);
        ADC_ConfigExternalTrigInjectedConv(ADC1,ADC_EXT_TRIG_INJEC_CONV_TMR1_TRGO);
        ADC_ConfigExternalTrigInjectedConvEdge(ADC1,ADC_EXT_TRIG_INJEC_EDGE_FALLING);
        ADC_ConfigInjectedSequencerLength(ADC1,4);
        ADC_ConfigInjectedChannel(ADC1,ADC_CHANNEL_0,1,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC1,ADC_CHANNEL_0,2,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC1,ADC_CHANNEL_0,3,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC1,ADC_CHANNEL_0,4,ADC_SAMPLETIME_3CYCLES);
       
        ADC_ConfigExternalTrigInjectedConv(ADC2,ADC_EXT_TRIG_INJEC_CONV_TMR1_TRGO);
        ADC_ConfigExternalTrigInjectedConvEdge(ADC2,ADC_EXT_TRIG_INJEC_EDGE_FALLING);
        ADC_ConfigInjectedSequencerLength(ADC2,4);
        ADC_ConfigInjectedChannel(ADC2,ADC_CHANNEL_1,1,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC2,ADC_CHANNEL_1,2,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC2,ADC_CHANNEL_1,3,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC2,ADC_CHANNEL_1,4,ADC_SAMPLETIME_3CYCLES);
       
        ADC_ConfigExternalTrigInjectedConv(ADC3,ADC_EXT_TRIG_INJEC_CONV_TMR1_TRGO);
        ADC_ConfigExternalTrigInjectedConvEdge(ADC3,ADC_EXT_TRIG_INJEC_EDGE_FALLING);
        ADC_ConfigInjectedSequencerLength(ADC3,4);
        ADC_ConfigInjectedChannel(ADC3,ADC_CHANNEL_2,1,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC3,ADC_CHANNEL_2,2,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC3,ADC_CHANNEL_2,3,ADC_SAMPLETIME_3CYCLES);
        ADC_ConfigInjectedChannel(ADC3,ADC_CHANNEL_3,4,ADC_SAMPLETIME_3CYCLES);
       
        //ADC_EnableMultiModeDMARequest();
        ADC_Enable(ADC1);
  ADC_Enable(ADC2);
  ADC_Enable(ADC3);
  //ADC_SoftwareStartConv(ADC1);
}

  该配置重点保证了三路电流采样在同一时刻触发,最大程度减少相位误差,满足电机FOC等算法对同步采样的严苛要求。

  极海APM32F425的三重ADC模式提供了灵活且强大的采集能力:

  同步模式侧重多路信号时间对齐,适合电力电子、电机控制等强同步场景;

  交替模式侧重速率提升,通过并行方式突破单ADC速度极限,显著提升系统采样性能。

  实际开发中可根据信号频率、同步要求、算法需求灵活选择,在不增加硬件成本的前提下,大幅提升系统采集精度与实时性。

icon_up
close_white