4. 同步采样技术:多通道同步触发、采样保持电路、时钟抖动影响

同步采样,说白了就是让多个ADC通道在同一时刻“咔嚓”一下,把模拟信号定格下来。你想想看,如果每个通道采样时间差个几微秒,那过流保护判断出来的电流值可能就完全不是一回事了。我在项目中吃过这个亏,后面才老老实实把同步机制做扎实。

4.1 多通道同步触发机制

多通道同步的核心,就是给所有ADC一个统一的“开枪”信号。我习惯用硬件触发,而不是软件轮询。软件轮询的延迟太不可控了,你永远不知道中断响应会被哪个高优先级任务插队。

常用同步触发方式:

  • 硬件触发线(HW Sync Line): 一个主控定时器输出PWM,同时触发多个ADC模块。延迟在纳秒级,非常稳。
  • 菊花链模式(Daisy Chain): 第一个ADC转换完成后,立即触发下一个。适合逐次逼近型ADC,但总延迟会累加。
  • 外部触发信号(EXT Trigger): 用FPGA或CPLD产生一个同步脉冲,同时送给所有ADC。这是最灵活的方式,但成本高一点。

我个人建议,如果MCU内部有多个ADC内核,优先用硬件触发线。比如STM32的ADC1和ADC2可以配置成同步注入模式,一个定时器事件同时启动两个ADC。我在一个三相电机驱动项目里就是这么干的,效果很好。

小技巧: 触发信号的电平要保持干净。我习惯在触发线上加一个RC滤波,时间常数选100ns左右,既能滤掉毛刺,又不会影响触发沿的陡峭度。

4.2 采样保持电路

采样保持电路,就是ADC前端的一个“记忆单元”。它负责在转换期间把输入电压稳住。如果这个电路设计不好,你采到的值可能跟实际信号差一大截。

采样保持电路有两个关键参数:

参数 含义 我的经验值
采样时间(Sampling Time) 开关闭合,电容充电的时间 至少5倍RC时间常数
保持时间(Hold Time) 开关断开,电容保持电压的时间 取决于ADC转换速度,通常几微秒
孔径抖动(Aperture Jitter) 开关断开时刻的不确定性 越低越好,< 10ps 算优秀

我曾经在一个项目中,采样时间设得太短,电容没充满电就开始转换。结果采到的电压值偏低,过流保护阈值怎么调都不准。后来把采样时间从3个时钟周期改成12个,问题就解决了。

注意: 采样保持电容的漏电流不能忽略。尤其是高温环境下,漏电流会明显增大,导致保持电压漂移。我建议在PCB布局时,把采样保持电路远离发热元件,比如功率管和电感。

4.3 时钟抖动的影响

时钟抖动,就是时钟沿的位置在时间轴上“晃来晃去”。它对同步采样的影响,比你想象的要大。

为什么会这样?因为ADC的采样时刻是由时钟沿决定的。如果时钟抖动大,每次采样的时间点就不固定。对于低频信号,这点抖动影响不大。但对于高频信号,或者电流变化率很大的过流场景,抖动就会直接转化为采样误差。

举个例子:

  • 假设电流上升率 di/dt = 100 A/μs
  • 时钟抖动 RMS = 50 ps
  • 那么采样误差 ≈ 100 A/μs × 50 ps = 5 mA

5mA看起来不大?但如果你的过流保护阈值是10A,误差占比0.05%,确实可以忽略。但如果 di/dt 是 1000 A/μs,抖动还是50ps,误差就变成50mA了。在短路保护场景下,这个误差可能让保护动作慢半拍。

时钟抖动来源:

  1. PLL抖动: 锁相环内部的噪声,尤其是宽带PLL。
  2. 电源噪声: 时钟缓冲器的电源纹波会调制时钟沿。
  3. 串扰: 时钟线旁边的信号跳变,通过耦合电容影响时钟沿。

我建议,在过流保护这种对时序敏感的场景,尽量用外部晶振或者低抖动振荡器,别用MCU内部的RC振荡器。内部RC的抖动通常在几百皮秒级别,而外部晶振可以做到几十皮秒甚至更低。

避坑指南: 我曾经在一个项目里,为了省成本用了MCU内部PLL生成的时钟。结果过流保护偶尔误动作,查了两天才发现是时钟抖动导致的采样不一致。后来换成外部有源晶振,问题就消失了。嗯,有些钱不能省。

4.4 同步采样系统架构

下面这张图是我常用的同步采样架构,你可以参考一下:

多通道同步采样架构图 多通道同步采样系统架构 主控定时器 (TIM1) 同步触发脉冲 触发分配网络 ADC1 (U相电流) 采样保持 + 转换 ADC2 (V相电流) 采样保持 + 转换 ADC3 (W相电流) 采样保持 + 转换 过流保护算法 同步数据 + 阈值比较 所有ADC在同一个时钟沿触发 采样保持电容同时断开

这个架构里,主控定时器产生一个同步脉冲,通过触发分配网络同时送给三个ADC。每个ADC内部都有独立的采样保持电路,确保在脉冲到来时,三个通道同时“冻结”输入电压。转换完成后,数据通过总线送给过流保护算法模块。

嗯,这里要注意:触发分配网络的延迟要尽量一致。如果三条路径的走线长度不一样,到达ADC的触发时刻就会有偏差。我建议在PCB布局时,让触发信号走等长蛇形线,或者用时钟缓冲器做扇出。

4.5 同步采样代码示例

下面是一段基于STM32的同步采样配置代码,我习惯用HAL库,但关键寄存器操作还是直接写比较放心:

// 配置定时器TIM1为同步触发源
// 更新事件触发ADC1、ADC2、ADC3同时启动
void Sync_Sampling_Init(void)
{
    // 1. 配置TIM1
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    
    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 0;
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 999;  // 1kHz采样率 (假设时钟72MHz)
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim1);
    
    // 配置主模式触发输出
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
    
    // 2. 配置ADC1、ADC2、ADC3为同步触发模式
    // 这里以ADC1为例,ADC2和ADC3配置相同
    ADC_MultiModeTypeDef multimode = {0};
    ADC_ChannelConfTypeDef sConfig = {0};
    
    hadc1.Instance = ADC1;
    hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    hadc1.Init.ScanConvMode = DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_TRGO;
    hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    hadc1.Init.DMAContinuousRequests = DISABLE;
    hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    HAL_ADC_Init(&hadc1);
    
    // 3. 配置采样时间
    sConfig.Channel = ADC_CHANNEL_0;  // U相电流
    sConfig.Rank = 1;
    sConfig.SamplingTime = ADC_SAMPLETIME_12CYCLES;  // 12个时钟周期
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    
    // 4. 启动定时器
    HAL_TIM_Base_Start(&htim1);
    
    // 5. 启动ADC,等待外部触发
    HAL_ADC_Start(&hadc1);
    HAL_ADC_Start(&hadc2);
    HAL_ADC_Start(&hadc3);
}

这段代码的核心,就是把TIM1的更新事件作为ADC的外部触发源。三个ADC都配置成上升沿触发,这样每次TIM1计数溢出时,三个ADC同时开始采样。采样时间我设了12个时钟周期,对于12位ADC来说,这个时间足够电容充满电了。

注意: 采样时间不是越长越好。采样时间太长,会降低最大采样率。如果采样率要求很高,比如超过100kHz,你可能需要把采样时间压缩到3-5个时钟周期,但前提是输入信号的源阻抗要足够低。

4.6 时钟抖动测量与补偿

如果你怀疑时钟抖动影响了采样精度,可以用示波器测一下。我习惯用TIE(Time Interval Error)模式,直接看时钟沿相对于理想位置的变化。

测量步骤:

  1. 把时钟信号接到示波器通道1,设置触发为上升沿。
  2. 打开TIE测量功能,采集至少1000个周期。
  3. 看RMS抖动值。如果超过100ps,建议换时钟源。

如果抖动无法避免,可以考虑软件补偿。比如在过流保护算法里,加入一个基于抖动统计的裕量。但说实话,这只能治标不治本。我建议还是从硬件上把抖动压下去,省心。

我的经验: 时钟走线要远离开关管和电感。我在一个项目里,时钟线从功率管旁边穿过,结果抖动从30ps飙到了200ps。后来把时钟线绕到PCB背面,隔了一层地平面,抖动就降回来了。嗯,布局真的很重要。

同步采样技术,说白了就是让所有ADC“步调一致”。触发信号要同时到达,采样保持电路要同时断开,时钟抖动要足够低。这三件事做好了,过流保护的精度就有了基础保障。