简介:峰值检测电路是电子工程中用于锁定并保持输入信号最高电压值的基础电路,广泛应用于通信、数据采集、自动增益控制及传感器最值求取等场景。本资源面向电子设计竞赛选手、模拟电路学习者与硬件工程师,系统梳理峰值检测电路从原理到实现的完整知识脉络。压缩包内为1个doc文档,约594KB,内容涵盖二极管加电容的基本结构、二极管正向压降误差分析、超级二极管与运放负反馈改进方案、电容放电复位开关设计,以及TI OPA128、LM311、ADI PKD01等分立与集成方案对比,并给出500kHz以下、100mVpp以上输入时误差可控制在3%以内的实测结论。目前已有345人学习,适合需要深入理解峰值检测原理、选型依据与电路优化思路的读者参考。
1. 峰值检测电路:从“抓不住尖峰”到“锁得住瞬间”的工程真相
做信号采集的同行大概率都遇到过这种场景:传感器输出的脉冲信号明明在示波器上看得见,送到 ADC 之后却总是采不到最高点,要么幅值偏低,要么干脆漏掉整个尖峰。问题往往不在 ADC 的采样率,而在于前端少了一级峰值检测电路。它的核心任务只有一个——把输入信号里转瞬即逝的最高电平“抓住”,并保持足够长的时间,让后级 ADC 或比较器从容读取。听起来简单,但真正动手做的时候,运放选型、保持电容漏电、复位开关时序,每一个环节都能让电路翻车。这篇笔记面向正在做脉冲幅值采集、超声回波检测、粒子计数或光谱峰值保持的硬件工程师,把峰值检测电路从原理到参数到踩坑一次讲透。
2. 峰值检测电路到底怎么工作:三种拓扑的选型逻辑
2.1 二极管加电容:最原始但也最容易翻车的方案
最朴素的峰值检测电路就是一只二极管串一个电容。输入信号通过二极管给电容充电,电容电压跟随输入上升;当输入回落时,二极管反偏,电容上的电压就保持住了。这个结构只有两个元件,但它的问题和它的简洁一样突出。
第一个问题是二极管的正向压降。硅二极管在导通时大约有 0.6~0.7V 的压降,这意味着电容上充到的电压永远比输入峰值低一个二极管压降。对于 5V 量程的信号,这个误差大约 12%~14%,完全不可接受。即使用肖特基二极管把压降降到 0.2~0.3V,在小信号场景下仍然捉襟见肘。
第二个问题是电容的放电回路。电容上的电荷会通过二极管的反向漏电流、电容自身的漏电流以及后级电路的输入阻抗慢慢泄放。如果保持时间要求到毫秒级,普通电解电容的漏电流就能让峰值电压明显下降。
第三个问题是输入阻抗。信号源直接通过二极管驱动电容,充电电流完全取决于信号源的驱动能力。如果信号源内阻较大,电容充电时间常数会很大,窄脉冲根本来不及充到峰值。
所以这个方案只适合信号幅度大(比如 12V 以上)、精度要求低(±10% 可接受)、脉冲宽度足够宽的场合。我一般只在做粗略的包络检测或者给比较器提供一个门限参考时才会用它。
2.2 运放加二极管:用反馈环消除压降
要解决二极管压降的问题,标准做法是把二极管放进运放的反馈环路里。具体来说,运放的同相端接输入信号,反相端通过二极管和电容连接到输出。当输入上升时,运放输出升高,二极管导通,电容充电;当输入下降时,运放输出降低,二极管截止,电容保持。
这个结构的关键优势在于:二极管压在运放的负反馈环路内部,运放的开环增益会把二极管压降的影响缩小到 1/A_ol 的量级。以一颗开环增益 100dB(即 100000 倍)的运放为例,0.7V 的二极管压降折算到输入端的等效误差只有 7μV,完全可以忽略。
但这里有一个容易被忽视的细节:运放的反相端在二极管截止后会处于开环状态。此时运放的输出会向负电源轨饱和,因为输入差分对失去了反馈。当输入再次上升时,运放需要从饱和状态恢复,这个恢复时间会直接影响电路能捕捉到的最小脉冲宽度。选运放时一定要看 datasheet 里的“过载恢复时间”(overload recovery time),这个参数通常标注在“大信号响应”或“饱和恢复”章节里。我见过太多人只盯着压摆率和增益带宽积选运放,结果窄脉冲一来,运放还在从饱和里往外爬,峰值早就过去了。
2.3 带复位开关的完整峰值保持电路
实际工程里用的峰值检测电路,几乎都会加一个复位开关。原因很简单:保持电容上的电压不会自己消失,下一次测量之前必须把它泄放掉。复位开关可以是一只 N 沟道 MOSFET,也可以是一颗模拟开关芯片,并联在保持电容两端。
完整的电路拓扑是这样的:输入信号先经过一级电压跟随器做缓冲,然后进入运放加二极管的峰值充电环路,保持电容跨接在输出和地之间,复位 MOSFET 并联在电容两端,最后由第二级电压跟随器做输出缓冲,把电容上的高阻节点和后续 ADC 的低阻输入隔离开。
这里每一级都有存在的理由。输入缓冲器是为了避免信号源内阻影响充电速度;输出缓冲器是因为保持电容通常只有几百 pF 到几 nF,直接接 ADC 的输入阻抗会让电容迅速放电;复位开关是为了给下一次测量准备初始条件。
选型上,输入缓冲运放需要高输入阻抗和足够的带宽,输出缓冲运放需要低失调电压和低输入偏置电流。保持电容的选型更讲究:容值越大,保持时间越长,但充电时间也越长,能捕捉的最小脉冲宽度就越大。常见取值在 100pF 到 10nF 之间,具体要看信号的最小脉冲宽度和允许的电压跌落。
| 参数 | 典型取值 | 影响 |
|---|---|---|
| 保持电容 | 100pF~10nF | 容值大→保持久但响应慢 |
| 复位开关导通电阻 | < 10Ω | 电阻大→复位慢,残余电压高 |
| 运放输入偏置电流 | < 1nA | 偏置电流大→电容电压漂移快 |
| 二极管反向漏电流 | < 1nA | 漏电流大→峰值保持时间缩短 |
| 运放过载恢复时间 | < 1μs | 恢复慢→窄脉冲捕捉失败 |
3. 动手搭一个可复现的峰值检测电路:从元件选到波形验证
3.1 元件选型与电路参数计算
假设我们要做一个脉冲峰值检测电路,输入信号是 0~5V 的单极性脉冲,最小脉冲宽度 1μs,要求峰值保持精度优于 1%,保持时间至少 100μs,复位时间小于 500ns。
第一步确定保持电容。保持时间由电容漏电流和运放输入偏置电流决定。假设总漏电流为 I_leak,保持时间为 t_hold,允许的电压跌落为 ΔV,则:
C = I_leak × t_hold / ΔV
取 I_leak = 1nA(运放偏置电流 0.5nA 加二极管漏电流 0.5nA),t_hold = 100μs,ΔV = 5V × 1% = 50mV,算得 C = 1nA × 100μs / 50mV = 2pF。这个值太小了,实际电路中寄生电容都不止 2pF。所以漏电流不是限制因素,真正限制保持时间的是后级负载。如果输出缓冲运放的输入偏置电流也是 1nA,那实际漏电流就是 2nA,算出来 C = 4pF,仍然很小。
但电容不能取太小,因为复位开关的电荷注入会带来误差。模拟开关在导通和断开时会把沟道电荷注入到电容上,这个电荷量通常在几 pC 到几十 pC。如果 C = 100pF,注入 10pC 电荷会产生 100mV 的电压跳变,直接破坏精度。所以电容至少要取到 1nF 以上,让电荷注入的影响降到 10mV 以内。
最终我选 C = 2.2nF 的 C0G 陶瓷电容。C0G 的介质吸收极低,温度系数接近零,漏电流在 pA 级,是保持电容的首选。X7R 虽然容值大,但介质吸收会导致“电压回弹”现象——电容放电后电压会自己回来一点,这在峰值检测里是致命的。
第二步选运放。输入缓冲运放我选的是 FET 输入型,输入偏置电流典型值 1pA,增益带宽积 10MHz,压摆率 5V/μs。峰值充电环路的运放要求更高:过载恢复时间要短,开环增益要大。我选的是某款精密运放,过载恢复时间 200ns,开环增益 120dB,输入偏置电流 0.5nA。输出缓冲运放用同型号即可。
第三步选二极管。普通硅二极管的反向漏电流在 nA 级,肖特基在 μA 级,所以这里反而要用普通硅二极管而不是肖特基。因为二极管在反馈环路里,正向压降被运放增益压掉了,不需要靠肖特基来降压力。选一只低漏电流的开关二极管,反向漏电流小于 1nA。
第四步选复位开关。模拟开关的导通电阻要小,电荷注入要低。我选的是某款单刀单掷模拟开关,导通电阻 5Ω,电荷注入 5pC,导通时间 50ns,断开时间 30ns。
3.2 电路搭建与关键节点波形
电路分四级搭建。第一级是输入缓冲,运放接成电压跟随器,同相端接输入信号,输出接峰值充电环路的运放同相端。第二级是峰值充电,运放的同相端接缓冲后的信号,反相端接二极管阳极,二极管阴极接保持电容和运放输出。第三级是输出缓冲,运放接成电压跟随器,同相端接保持电容,输出接 ADC。第四级是复位开关,模拟开关并联在保持电容两端,控制端接 MCU 的 GPIO。
# 峰值检测电路参数计算脚本 # 用于快速评估不同参数组合下的保持精度和响应时间 def calc_peak_detector(C_hold, I_leak, t_hold, V_peak, t_pulse, I_charge): """ C_hold: 保持电容值,单位 F I_leak: 总漏电流,单位 A t_hold: 要求保持时间,单位 s V_peak: 峰值电压,单位 V t_pulse: 最小脉冲宽度,单位 s I_charge: 充电电流,单位 A """ # 保持阶段的电压跌落 delta_V_hold = I_leak * t_hold / C_hold # 充电阶段的电压建立误差 # 充电电流由运放输出能力和二极管动态电阻决定 # 简化模型:充电时间常数 tau = C_hold * V_peak / I_charge tau_charge = C_hold * V_peak / I_charge # 脉冲宽度内电容能充到的电压比例 charge_ratio = 1 - pow(2.718, -t_pulse / tau_charge) print(f"保持 {t_hold*1e6:.0f}us 后电压跌落: {delta_V_hold*1e3:.2f}mV") print(f"充电时间常数: {tau_charge*1e9:.1f}ns") print(f"{t_pulse*1e9:.0f}ns 脉冲内充电完成度: {charge_ratio*100:.2f}%") print(f"峰值误差: {(1-charge_ratio)*100:.2f}%") return delta_V_hold, charge_ratio # 示例:C=2.2nF, 漏电流=2nA, 保持100us, 峰值5V, 脉冲1us, 充电电流10mA calc_peak_detector(2.2e-9, 2e-9, 100e-6, 5.0, 1e-6, 10e-3)这段脚本用来快速评估参数是否合理。C_hold是保持电容,I_leak是总漏电流,t_hold是要求的保持时间,V_peak是峰值电压,t_pulse是最小脉冲宽度,I_charge是充电电流。输出三个关键指标:保持阶段的电压跌落、充电时间常数、脉冲内的充电完成度。如果充电完成度低于 99%,说明电容太大或充电电流太小,需要调整。
实际调试时,我用信号发生器产生 1μs 宽、5V 幅值的脉冲,用示波器同时看输入信号和保持电容上的电压。理想情况下,电容电压应该在脉冲结束后迅速稳定在 5V 附近,然后在保持阶段缓慢下降。如果发现电容电压在脉冲期间只充到 3V 就上不去了,说明充电电流不够,要么是运放输出电流受限,要么是二极管动态电阻太大。如果发现电容电压在保持阶段下降很快,说明漏电流超标,要检查运放偏置电流和二极管反向漏电流。
3.3 复位时序与 MCU 接口
复位开关的控制时序很关键。在峰值采集阶段,复位开关必须完全断开,否则电容上的电荷会通过开关泄放。在复位阶段,开关导通,电容放电。复位脉冲的宽度要足够让电容电压降到接近零,同时不能太宽以免影响下一次采集。
以 2.2nF 电容和 5Ω 导通电阻为例,放电时间常数是 11ns,理论上 5 个时间常数(55ns)就能放电到 1% 以下。但实际模拟开关的导通电阻会随温度变化,而且开关的电荷注入会在断开瞬间给电容充一点电。所以复位脉冲我一般取 200~500ns,留足余量。
MCU 接口这边,GPIO 直接驱动模拟开关的控制端。注意模拟开关的控制端通常是 CMOS 电平,3.3V 的 GPIO 可以直接驱动。如果模拟开关的控制端需要更高电压,就要加一级电平转换。另外,复位脉冲的边沿要干净,避免在开关切换瞬间产生振铃,否则振铃会耦合到保持电容上,形成误差。
// MCU 控制峰值检测电路复位和采集的时序 // 假设 GPIO_PEAK_RST 连接模拟开关控制端 // ADC 通道连接输出缓冲器 #define RST_PULSE_WIDTH_US 1 // 复位脉冲宽度 1us void peak_detector_reset(void) { // 拉高复位控制端,导通模拟开关 GPIO_SetHigh(GPIO_PEAK_RST); // 保持足够时间让电容放电 delay_us(RST_PULSE_WIDTH_US); // 拉低复位控制端,断开模拟开关 GPIO_SetLow(GPIO_PEAK_RST); // 等待开关完全断开,避免电荷注入影响 delay_us(1); } uint16_t peak_detector_read(void) { // 触发 ADC 转换 ADC_StartConversion(ADC_CH_PEAK); // 等待转换完成 while (!ADC_IsConversionDone()); // 读取结果 return ADC_GetResult(); } // 主循环:复位 -> 等待脉冲 -> 读取峰值 void main_loop(void) { while (1) { peak_detector_reset(); // 等待输入脉冲到来 // 实际应用中可以用外部中断或比较器触发 delay_ms(10); uint16_t peak_value = peak_detector_read(); // 处理峰值数据 process_peak(peak_value); } }这段代码展示了 MCU 控制峰值检测电路的基本时序。peak_detector_reset函数拉高复位控制端,保持 1μs 让电容放电,然后拉低并等待 1μs 让开关完全断开。peak_detector_read函数触发 ADC 并读取结果。主循环里先复位,等待脉冲到来,再读取峰值。实际应用中,等待脉冲的部分可以用外部中断或比较器触发,避免固定延时导致错过脉冲。
注意:复位开关断开后不要立即启动 ADC 转换,等 1μs 让模拟开关的电荷注入稳定下来。这个等待时间看起来不起眼,但省掉它会让峰值读数偏高几十毫伏。
4. 峰值检测电路避坑指南:五个让精度翻车的真实原因
4.1 运放从饱和恢复太慢,窄脉冲直接漏掉
现象:输入一个 500ns 宽的脉冲,保持电容上的电压只充到峰值的 60%,脉冲结束后电容电压还在慢慢往上爬,但输入已经回落了。
原因:峰值充电环路的运放在二极管截止后处于开环状态,输出饱和到负电源轨。当输入再次上升时,运放需要从饱和状态恢复,这个恢复时间就是过载恢复时间。如果恢复时间大于脉冲宽度,运放还没回到线性区,脉冲就结束了。
解决:选过载恢复时间短的运放,datasheet 里一般标在“大信号响应”或“饱和恢复”参数里。如果找不到这个参数,可以看“差分输入过载恢复时间”。另外,可以在运放输出和二极管之间加一个小电阻,限制饱和深度,但电阻会降低充电电流,需要权衡。我一般优先选恢复时间小于最小脉冲宽度 1/5 的运放。
4.2 保持电容介质吸收导致电压回弹
现象:复位后电容电压降到 0V,但过几毫秒再测,电压又回来了几十毫伏。或者峰值保持一段时间后,电压先降后升,出现一个“凹坑”。
原因:X7R、Y5V 这类高介电常数陶瓷电容有严重的介质吸收效应。电容放电时,介质内部的电荷来不及释放,等外部电压消失后,这些电荷又慢慢释放出来,表现为电压回弹。电解电容的介质吸收更严重。
解决:保持电容必须用 C0G(NP0)或聚丙烯薄膜电容。C0G 的介质吸收在 0.1% 以下,薄膜电容更低。不要为了省空间或省成本用 X7R,介质吸收带来的误差远大于容值误差。如果容值不够,可以并联多个 C0G 电容,但要注意并联后的寄生电感可能引起振铃。
4.3 复位开关电荷注入让峰值偏高
现象:每次复位后,电容电压不是 0V,而是 20~50mV。这个偏置会叠加到峰值上,导致读数偏高。
原因:模拟开关在导通时,沟道里存储的电荷在断开瞬间会注入到保持电容上。注入电荷量通常在几 pC 到几十 pC,除以电容值就是电压跳变。2.2nF 电容上注入 10pC 电荷,电压跳变约 4.5mV。如果电容只有 100pF,跳变就是 100mV。
解决:第一,保持电容不要取太小,至少 1nF 以上。第二,选电荷注入低的模拟开关,datasheet 里会标“Charge Injection”。第三,可以在开关和电容之间串一个小电阻,让注入电荷通过电阻慢慢释放,但电阻会延长复位时间。第四,如果精度要求极高,可以用差分结构,两个开关对称注入,共模抵消。
4.4 输出缓冲器输入偏置电流让电容慢慢放电
现象:峰值保持时间达不到要求,电容电压在几百微秒内就下降了 5% 以上。
原因:输出缓冲运放的输入偏置电流会从保持电容上持续抽取电荷。如果偏置电流是 1nA,电容是 1nF,电压下降速率就是 1V/s,100μs 下降 100μV,看起来不大。但如果偏置电流是 100nA(双极型运放的常见值),下降速率就是 100V/s,100μs 下降 10mV,对于 1V 量程就是 1% 误差。
解决:输出缓冲运放必须选 FET 输入型,输入偏置电流在 pA 级。如果已经用了双极型运放,可以在运放输入端加一个补偿电阻,让偏置电流在两个输入端产生的压降抵消,但这个方法对偏置电流的温漂无效。最彻底的办法还是换 FET 输入运放。
4.5 二极管反向漏电流在高温下急剧增大
现象:常温下峰值保持精度很好,一到 60℃ 以上,保持时间就明显缩短,电压跌落加快。
原因:二极管的反向漏电流对温度极其敏感,每升高 10℃,漏电流大约翻一倍。常温下 1nA 的漏电流,到 60℃ 就变成 8nA,到 80℃ 就是 32nA。如果保持电容只有 1nF,32nA 的漏电流在 100μs 内就能让电压下降 3.2mV,对于 1V 量程是 0.32% 误差,对于 100mV 量程就是 3.2% 误差。
解决:选反向漏电流小的二极管,开关二极管比整流二极管好,硅二极管比肖特基好。如果工作温度高,可以考虑用 JFET 代替二极管做峰值充电开关,JFET 的漏电流在 pA 级,但驱动电路更复杂。另外,保持电容不要取太小,容值越大,同样的漏电流引起的电压下降越小。
5. 把峰值检测精度再压一档:自校准与差分保持的实战技巧
前面讲的都是单端峰值检测电路,精度做到 1% 左右已经不错了。但如果应用场景要求 0.1% 甚至更高,比如精密脉冲幅值分析或者粒子能谱测量,单端结构就不够用了。这时候有两个进阶方向:自校准和差分保持。
自校准的思路是在系统里加一个已知幅值的参考脉冲,定期注入到峰值检测电路的输入端,测量电路的实际输出,和参考值比较,得到一个校正系数。这个系数可以补偿运放失调、二极管漏电流、电容容差等所有静态误差。具体实现上,可以用一个模拟开关在输入缓冲器前面切换信号源和参考源。参考源用精密基准电压芯片产生,比如 2.500V 或 4.096V。校正频率取决于温度变化速度,一般每隔几分钟或温度变化超过 5℃ 就校正一次。
差分保持的思路是用两个完全对称的峰值检测通道,一个检测输入信号,一个检测参考地。两个通道的输出送到差分放大器,共模误差(比如运放失调、电源波动、温度漂移)被抵消掉。这个结构对元件匹配要求很高,两个通道的运放、二极管、电容都要选同一批次,PCB 布局也要对称。但效果很显著,共模抑制比可以做到 60dB 以上,相当于把误差再压两个数量级。
我自己的习惯是:如果精度要求 1% 以内,单端结构加 C0G 电容加 FET 输入运放就够了;如果要求 0.1% 以内,先做自校准,成本低见效快;如果要求 0.01% 以内,才考虑差分保持,因为匹配和布局的代价很高。另外,不管哪种结构,PCB 布局都要注意:保持电容的节点要尽量短,周围加保护环(guard ring)减少漏电流,保护环接和电容同电位的缓冲输出,不要接地。这个细节很多人忽略,但在高阻节点上,PCB 表面的漏电流可能比元件漏电流还大。
最后说一个验证方法:用信号发生器产生一个幅值已知的窄脉冲,送到峰值检测电路,用高精度万用表测量保持电容上的电压(通过输出缓冲器),比较两者差异。改变脉冲幅值从 0.1V 到 5V,画一条误差曲线。如果误差曲线是平的,说明增益误差小;如果误差随幅值线性增加,说明增益有问题;如果误差在零点附近最大,说明失调或电荷注入是主要误差源。这条曲线比任何仿真都管用,我每次调完电路都会跑一遍,心里才有底。希望帮到你。
本文还有配套的精品资源,点击获取