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了。在短路保护场景下,这个误差可能让保护动作慢半拍。
时钟抖动来源:
- PLL抖动: 锁相环内部的噪声,尤其是宽带PLL。
- 电源噪声: 时钟缓冲器的电源纹波会调制时钟沿。
- 串扰: 时钟线旁边的信号跳变,通过耦合电容影响时钟沿。
我建议,在过流保护这种对时序敏感的场景,尽量用外部晶振或者低抖动振荡器,别用MCU内部的RC振荡器。内部RC的抖动通常在几百皮秒级别,而外部晶振可以做到几十皮秒甚至更低。
避坑指南: 我曾经在一个项目里,为了省成本用了MCU内部PLL生成的时钟。结果过流保护偶尔误动作,查了两天才发现是时钟抖动导致的采样不一致。后来换成外部有源晶振,问题就消失了。嗯,有些钱不能省。
4.4 同步采样系统架构
下面这张图是我常用的同步采样架构,你可以参考一下:
这个架构里,主控定时器产生一个同步脉冲,通过触发分配网络同时送给三个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,设置触发为上升沿。
- 打开TIE测量功能,采集至少1000个周期。
- 看RMS抖动值。如果超过100ps,建议换时钟源。
如果抖动无法避免,可以考虑软件补偿。比如在过流保护算法里,加入一个基于抖动统计的裕量。但说实话,这只能治标不治本。我建议还是从硬件上把抖动压下去,省心。
我的经验: 时钟走线要远离开关管和电感。我在一个项目里,时钟线从功率管旁边穿过,结果抖动从30ps飙到了200ps。后来把时钟线绕到PCB背面,隔了一层地平面,抖动就降回来了。嗯,布局真的很重要。
同步采样技术,说白了就是让所有ADC“步调一致”。触发信号要同时到达,采样保持电路要同时断开,时钟抖动要足够低。这三件事做好了,过流保护的精度就有了基础保障。