前阵子在某实验室帮忙测一批光敏器件的暗电流,读数落在几百皮安到几纳安之间。台面上那台进口源表倒是能测,可只有一台,排队排到下周。同组的人开玩笑说,要不咱们自己搭一个。笑归笑,回去我真把这件事认真算了算账:能覆盖 ±1nA 到 ±10mA 这个区间的商用源表,价格基本都在五位数往上,而我要测的东西,本质上只需要一个能双向灌/拉电流、顺带把电压读回来的通道。于是我花了大概三周业余时间,从画板子到调通 1nA 档,中间炸过运放、烧过模拟开关、被一个 0.3pA 的漂移折腾了整整两天。这篇就把整个 DIY 源表的过程摊开讲清楚——架构怎么定、电阻怎么算、保护环怎么画、量程切换为什么会给你一个离谱读数,以及哪些钱绝对不能省。适合有一定模拟电路基础、想自己动手做一台低电流源表的人看,也适合只是想搞明白"源表凭什么叫源表"的读者。
1. 先把"1nA"这件事的分量掂清楚
1.1 源表不是电源加万用表的拼装货
很多人第一次听到源表,第一反应是"不就是个可调电源串个电流表"。这个理解在毫安级以上勉强成立,一旦往下走到微安、纳安,就彻底不成立了。源表的核心特征是四象限工作:它既能对外输出电流(源出),也能吸收外部电流(灌入),输出电压同理,正负两个方向都能推、都能拉。这意味着输出级必须是一个双向的、能过零的功率级,而不是一个单向的稳压器。
更关键的差别在于源和测共用同一组端子。你设定输出 1V,同时读回流过端子的电流,这个电流既可能是你推出去的,也可能是外部器件灌进来的,仪器得能分辨方向和大小。这就决定了电路拓扑上,输出级和测量级必须共用一个节点,而这个节点同时又是精度最敏感的地方。我一开始想图省事,用"电压源 + 串联采样电阻 + 差分放大"的方案,搭出来一测就发现问题:采样电阻本身会吃掉压降,输出电压就不准了;而且换量程要换采样电阻,继电器一切换,输出就抖一下。最后还是老老实实回到"电压控制电流源 + 独立跨阻放大器"的双通道结构。
1.2 七个数量级跨度,是这台机器全部的难点
±1nA 到 ±10mA,跨度是 10⁷,也就是七个数量级。这个跨度不是"加个可调旋钮"能解决的,它意味着整个信号链在不同量程下的主导误差源完全不同。在 10mA 档,你操心的是采样电阻的温漂、运放的输出摆幅、走线的压降;到了 1nA 档,你操心的是 PCB 表面那层看不见的助焊剂残留、运放输入端几个皮安的偏置电流、甚至空气湿度。
我把这条链路拆开算过一笔账:1nA 满量程,如果允许 0.1% 的误差,那么整个通路里所有漏电流之和不能超过 1pA。1pA 是什么概念?一块没洗干净的 FR4 板子,在两个相邻焊盘之间加上 5V 压差,表面漏电流轻松就能到几十上百皮安。也就是说,同一个物理误差在低量程下会被放大七个数量级,这是 DIY 源表最容易翻车的地方,也是我后面要花整整一章讲 PCB 的原因。
| 量程档位 | 满量程电流 | 允许误差(0.1%) | 主导误差源 |
|---|---|---|---|
| 10mA | 10 mA | 10 μA | 采样电阻温漂、走线压降 |
| 1mA | 1 mA | 1 μA | 运放失调、电阻精度 |
| 100μA | 100 μA | 100 nA | 运放偏置电流开始显形 |
| 1μA | 1 μA | 1 nA | PCB 漏电开始显形 |
| 100nA | 100 nA | 100 pA | 保护环、清洗工艺 |
| 10nA | 10 nA | 10 pA | 运放 Ib、湿度、线缆 |
| 1nA | 1 nA | 1 pA | 上面全部叠加 |
1.3 为什么不能"一个电阻打天下"
有人会想,用一个 250Ω 的采样电阻覆盖 10mA,再用一个超高分辨率的 ADC 去读 1nA 不就行了?10mA 在 250Ω 上产生 2.5V,1nA 在 250Ω 上产生 250nV。要分辨 250nV,同时满量程是 2.5V,动态范围是 10⁷,也就是需要约 23 位无噪声分辨率。市面上 24 位 ΔΣ ADC 标称 24 位,实际有效位在低速下也就 20~21 位,而且前端放大器的噪声早就把 250nV 淹没了。
所以分档是绕不过去的。我的做法是每一档对应一个独立的反馈电阻,满量程统一折算到 ±2.5V 送到 ADC,这样 ADC 永远工作在最佳区间,量程切换本质上就是换一个反馈电阻。听着简单,但换电阻这个动作本身会引入电荷注入、寄生电容突变、稳定时间延长等一堆问题,后面单独讲。
2. 架构定死之前,先想清楚输出级和测量级怎么共存
2.1 输出级选 Howland 电流泵的三个理由
输出级要解决的问题是:给定一个控制电压 Vin,在负载上产生一个与负载无关的电流 Iout,且能双向过零。常见方案有三种:运放加 MOSFET 的恒流源、专用电流输出 DAC、以及 Howland 电流泵。
第一种方案的问题在于单向性,NMOS 只能拉电流,要双向就得推挽,推挽就有交越失真和偏置漂移。第二种方案芯片内部往往带斩波,输出端有开关噪声,在纳安级测量时会串到测量通道里去。最后我选了改进型 Howland 电流泵,理由很实在:它只用一片运放加四个电阻,输出阻抗高,双向自然过零,而且输出电流直接由电阻比决定,精度可以做得很高。
基本拓扑是这样:运放同相端接 Vin 经 R1,反相端接输出反馈 R2,输出端经 Rs 到负载,负载另一端接地,再从负载端经 R3 反馈回反相端,R4 从反相端接地。当 R4/R3 = R2/R1 时,输出电流 Iout = Vin × (R2/R1) / Rs。取 R1=R2=R3=R4=10kΩ 的简并形式,公式退化成 Iout = Vin / Rs。
Rs 就是那个决定量程的采样电阻。要给到 ±10mA 满量程、Vin 范围 ±2.5V,Rs 取 250Ω;要覆盖 1nA,Rs 得取到 2.5GΩ。这里立刻撞上第一个现实问题:2.5GΩ 的精密电阻又贵又难买,而且阻值公差普遍在 1% 以上。后面 3.2 节专门讲怎么绕过去。
提示:Howland 泵的输出阻抗不是无限的,负载变化仍会带来误差。我的做法是在输出串联一个 100Ω 的限流电阻,既保护了运放,也把输出阻抗抬高了三个数量级,代价是顺从电压损失一点,实测可以接受。
2.2 测量级的反馈电阻表,是算出来的不是猜的
测量级用跨阻放大器(TIA),这是低电流测量的标准答案。原理简单到一句话:运放反相输入端接被测电流,同相端接地,反馈电阻 Rf 跨在输出和反相端之间,输出 Vout = -Iin × Rf。反相端是虚地,被测器件两端的压降几乎为零,这是它能测纳安电流的根本原因——压降小,漏电通路就不存在。
关键在于 Rf 怎么选。我定的规则是每个量程满量程时输出刚好 ±2.5V,这样 ADC 的输入范围被充分利用,信噪比最好。于是每个档位的 Rf = 2.5V / I_fullscale。
| 量程 | Rf 理论值 | 实际选用 | 备注 |
|---|---|---|---|
| 10 mA | 250 Ω | 250 Ω 0.1% | 注意功耗,10mA²×250Ω=25mW |
| 1 mA | 2.5 kΩ | 2.5 kΩ 0.1% | |
| 100 μA | 25 kΩ | 25 kΩ 0.1% | |
| 1 μA | 2.5 MΩ | 2.5 MΩ 0.1% | 普通薄膜电阻即可 |
| 100 nA | 25 MΩ | 25 MΩ 0.1% | 开始要注意封装漏电 |
| 10 nA | 250 MΩ | 250 MΩ 1% | 高阻电阻,需玻璃封装 |
| 1 nA | 2.5 GΩ | 2.5 GΩ 或 T 型网络 | 后面详述 |
这张表是整个项目的骨架,后面所有的布局、屏蔽、清洗工艺,都是为了保住最后一行的 1pA 精度。
2.3 量程切换的瞬间,电路里到底发生了什么
量程切换看着只是"换个电阻",实际上是把一个带电的电容从一个节点上拔下来,再插到另一个节点上。跨阻放大器的反馈网络里,Rf 上并联着几皮法的寄生电容,切换瞬间这个电容上的电荷要重新分配,输出端就会打出一个尖峰。我用机械继电器切 250Ω 到 25kΩ 这几档,尖峰幅度在几百毫伏,衰减时间几十微秒,无所谓;但切到 2.5GΩ 那一档,因为时间常数 Rf×Cf 变成了秒级,尖峰能挂好几秒才稳下来。
这带来两个直接后果。一是程序里必须做"切换后延时确认",我设的是切档后丢弃前 500ms 的采样,再取后面 20 个点做中值滤波。二是切换只能在没有负载电流的时候做,否则大电流档切换到大电阻档的瞬间,2.5GΩ 上会产生 2.5GΩ × 10mA = 25MV 的理论压降(当然被运放供电轨钳死),运放直接进饱和,恢复要很久。所以我的控制逻辑里强制先关断输出,等 100ms,再切档,再重新使能。
2.4 数字侧的分辨率预算,别在这里省
DAC 负责给输出级提供 Vin,ADC 负责读回 TIA 的输出。这两个器件的位数直接决定了系统的"细粒度"。
先算 DAC。16 位 DAC 在 0~2.5V 范围下 LSB 是 38μV。在 10mA 档(Rs=250Ω),对应的电流步进是 38μV/250Ω = 152nA,相对满量程是 0.0015%,够用。在 1nA 档(Rs=2.5GΩ),电流步进是 38μV/2.5GΩ = 15fA,理论上远远够。所以16 位 DAC 足以覆盖整个范围,瓶颈从来不在 DAC。
再看 ADC。同样 16 位,满量程 ±2.5V,LSB 是 76μV。在 1nA 档,对应电流是 76μV/2.5GΩ = 30fA。只要前端噪声不超过几个 LSB,读数就是有效的。我实际选的是 16 位、差分输入、内置 PGA 的 ΔΣ ADC,采样率压到 20SPS,这样能拿到最好的噪声性能。低速换低噪,在源表这种场合是稳赚不赔的交易。
注意:ADC 的参考电压必须和 DAC 的参考电压同源或者至少温度特性一致。我第一版用了两颗不同的基准,室温下对得上,开空调降温 5 度之后两个通道的比值飘了 30ppm,做比值测量时误差很明显。
3. 器件选型的几道生死线
3.1 运放的偏置电流,必须比最小量程低两个数量级
这是选型的第一原则,也是最容易翻车的地方。1nA 量程,如果运放输入偏置电流 Ib 是 10pA,那就是 1% 的固定误差,而且随温度变化可能翻几倍。所以我的要求是Ib ≤ 1pA,留出两个数量级的余量。
满足这个条件的运放主要是 CMOS 输入或者斩波稳零结构。CMOS 输入的 Ib 典型值在 1pA 以下,但要注意它随温度指数上升,每升 10℃ 大约翻一倍,所以厂商标的数据通常是在 25℃ 下测的。斩波稳零运放能同时把失调电压压到 μV 级,代价是输入端的开关噪声会抬高电流噪声谱密度,而且斩波频率会在频谱上留下一个尖峰。
我最后的取舍是:测量通道用斩波稳零,因为失调电压在 TIA 里会直接转换成输入端的一个等效电流源,低失调比低噪声更值钱。你可能会问,TIA 反相端是虚地,Vos 怎么会产生误差?因为 Vos 会通过被测器件的内阻形成一个误差电流。如果被测器件是纯电流源(内阻极高),几乎没影响;但如果测的是一个高阻值电阻的漏电,内阻只有几十兆欧,Vos 哪怕只有 100μV,也会产生 100μV/10MΩ = 10pA 的误差,正好吃掉整个 1nA 档的预算。
| 运放参数 | 1nA 档要求 | 10mA 档要求 | 说明 |
|---|---|---|---|
| 输入偏置电流 Ib | ≤1 pA | ≤1 nA | 低压档严苛得多 |
| 失调电压 Vos | ≤50 μV | ≤500 μV | 影响被测点实际电压 |
| 电压噪声 | ≤20 nV/√Hz | 不敏感 | 折算成电流噪声要除以 Rf |
| 电流噪声 | ≤0.5 fA/√Hz | 不敏感 | 1nA 档的决定性指标 |
| 增益带宽积 | 1 MHz 足够 | ≥10 MHz | 高阻档要压低带宽换稳定 |
3.2 2.5GΩ 买不到也买不起,T 型网络和它的代价
2.5GΩ 的精密电阻,现货少、交期长、单价能顶半块板子的钱,公差还只有 1%~5%。我试过两个替代思路。
思路一:降低满量程输出电压。如果接受 1nA 对应 1V 输出,Rf 只要 1GΩ,好买一些,但 ADC 的动态范围利用率下降,1V 满量程下 16 位 ADC 的有效分辨率损失约 1.3 位。这是可以接受的折中,我第一版就是这么干的。
思路二:T 型反馈网络。用三个普通电阻合成一个大跨阻。经典接法是 R1 从反相端到中间节点,R2 从中间节点到输出,R3 从中间节点到地,等效跨阻 Rf_eq = R1 + R2 + R1×R2/R3。取 R1=R2=1MΩ、R3=400Ω,算出来约 2.5GΩ,三个电阻都是常规货架品,成本不到十块钱。
但 T 型网络有代价,而且不止一个。第一,噪声不吃等效阻值这一套。反馈网络的约翰逊噪声由实际的 R1、R2 决定,不是由等效的 2.5GΩ 决定,所以你会得到一个"等效跨阻很大但噪声也很大"的电路。第二,噪声增益被抬高了。T 型网络的噪声增益是 1 + R2/R3 量级,运放的电压噪声被同比例放大,折算到输入端的等效电流噪声直接翻几十倍。第三,带宽塌陷。中间节点引入的极点会让整个环路的相位裕度变差,补偿电容得重新算。
我的实测结论是:T 型网络适合做到 100MΩ 这一档,再往上,噪声和稳定性都不划算,不如老老实实买一颗玻璃封装的 1GΩ 高阻电阻,把它架空焊在特氟龙支柱上。这颗电阻是整个 BOM 里最贵的单项,但它是 1nA 档能不能用的分水岭,这笔钱我建议别省。
3.3 模拟开关的电荷注入与继电器的线圈干扰
量程切换用模拟开关还是继电器,我两种都试过。
模拟开关(CMOS 传输门)体积小、驱动简单、切换快,但有三个毛病。电荷注入:开关断开瞬间会把沟道里的电荷注入到节点上,典型值几到几十皮库仑,在 2.5GΩ 的节点上产生的电压跳变是 Q/C,C 只有几个皮法,跳变能到伏级。导通电阻随温度变化,在 250Ω 档会和采样电阻串联,直接引入增益误差。关断漏电流在高温下能到纳安级,对低电流档是灾难。
机械继电器(我用的干簧继电器)没有电荷注入问题,关断电阻高达 10¹² Ω 以上,导通电阻几十毫欧,在低电流档几乎是完美开关。代价是线圈驱动会产生磁场和电源干扰,切换动作本身要几毫秒,寿命有限。
我的最终方案是混合使用:100μA 及以上的档位用模拟开关,因为那里对漏电不敏感;10nA 和 1nA 档用干簧继电器。继电器线圈用独立的 LDO 供电,线圈两端反并联续流二极管,线圈走线远离信号区,切换期间 ADC 停止采样。这套组合拳打下来,切档毛刺从原来的几百毫伏压到了几毫伏。
3.4 电源与地的划分,比想象中更重要
整台机器里有三套电源:数字 3.3V(MCU、通信)、模拟 ±15V(输出级运放)、模拟 ±5V(测量级运放和 ADC 基准)。三套地最终单点汇合在电源入口处。
我踩过的坑是:一开始图省事,所有地铺成一整块,结果 MCU 的 SPI 时钟串到了 TIA 的输出上,频谱上看就是 8MHz 的尖峰,幅度虽然只有几毫伏,但在 100nA 档折算成电流就是几皮安。后来改成模拟地和数字地分开铺,中间用 0Ω 电阻单点连接,连接点放在 ADC 下方,串扰立刻降了一个数量级。
输出级和测量级之间还有一层隔离要考虑。输出级运放要推 10mA,电源电流波动大;测量级运放只处理微安级信号。两者的电源必须分开走线,各自从稳压器单独拉,不能共用一段 PCB 铜皮。我在两路电源之间串了 10Ω 电阻加 10μF 电容做 RC 滤波,把输出级的开关噪声挡在测量级之外。
4. nA 级电路真正的战场在 PCB 上
4.1 保护环画在哪个电位上,这个问题有标准答案
保护环(Guard Ring)是低电流电路的保命符,但很多人画错——画了一圈铜,接到信号地上,结果一点用没有。原理是这样的:PCB 表面的漏电流,正比于两个节点之间的电位差除以表面电阻。如果信号节点(TIA 反相端,虚地约 0V)周围有一圈铜,这圈铜的电位也是 0V,那么信号节点和这圈铜之间没有电位差,漏电流就是零。原本要流进信号节点的漏电,被这圈铜"截胡"了。
所以保护环的接线原则是:接到与信号节点等电位的低阻节点上。在 TIA 里,反相端是虚地,同相端接的是真正的地,两者电位相同,所以保护环接模拟地就是对的。如果同相端不接地而是接了一个偏置电压,那保护环就得接那个偏置电压,或者用一个跟随器缓冲后驱动保护环。
具体画法上,我在顶层和底层都画了保护环,环宽 0.5mm,距离信号焊盘 0.3mm,两层之间每隔 5mm 打一个过孔缝合。信号走线全程被保护环包住,从运放反相端一直到输入端子,中间不露出任何一段裸线。保护环上不要盖阻焊,裸露的铜更能把表面漏电导走。
提示:保护环只能解决"环内外之间"的漏电,环内部如果还有残留助焊剂,信号线之间照样会漏。所以保护环和清洗是配套的,缺一不可。
4.2 板材、清洗与那层薄薄的助焊剂
FR4 是吸湿材料,湿度从 30% 升到 80%,表面电阻能掉两个数量级。我做过对比:同一块板子,干燥天气下 1nA 档零点漂移 5pA,梅雨天不开空调能漂到 200pA。这不是电路问题,是材料问题。
应对办法有三层。第一层,高阻节点区域开窗。我在 1nA 档的反馈电阻和输入端周围做了阻焊开窗,装完后用无水乙醇加超声波清洗 5 分钟,再用热风枪 60℃ 烘 30 分钟驱潮。第二层,架空。那颗 1GΩ 电阻不贴板,用两根特氟龙支柱架在板子表面 3mm 以上,输入线用裸铜线在空气中飞过去,不经过任何 PCB 表面。第三层,涂覆。洗完烘干后,在高阻区域刷一层薄薄的三防漆,把表面和空气隔开。注意三防漆本身要选高绝缘型号,而且涂之前必须洗干净,否则等于把助焊剂封在里面。
我第一版没做这些,1nA 档的读数完全不可信,同一颗 1GΩ 电阻,清洗前后测出来的漏电流差了 40 倍。
4.3 热电动势:看不见的 μV 级对手
热电动势在电流测量里不显眼,但它会通过两条路径影响结果。一是输入端子。如果两个输入端子的材料不同,或者一个焊点大一个焊点小,室温波动就会在输入端产生几 μV 到几十 μV 的电动势,这个电动势加在被测器件上,改变了它的实际工作点。二是反馈电阻。高阻电阻的端头材料和引脚材料不同,形成热电偶,电阻自身发热或者环境温度变化都会产生漂移电压。
处理办法比较土但有效:输入端子的两个焊点尽量做成一样大,走线长度和宽度对称;高阻电阻远离任何发热元件(LDO、继电器线圈、MCU),布局时留出至少 10mm 的间距;整机加一个小风扇做低速空气搅拌,让板面温度均匀,避免局部温差。最后这一条听起来反直觉——风扇不是引入噪声吗?实测下来,均匀的气流带来的噪声远小于局部温差带来的漂移,尤其在 1nA 档。
4.4 屏蔽和接地,在 nA 电路里怎么落地
整机装进铝壳,壳接大地。PCB 的模拟地与外壳在一点连接,位置选在输入端子附近。这样外部干扰在壳体上形成的电流,就近入地,不会绕着信号线跑一圈。
输入线缆是个大坑。普通的屏蔽线,屏蔽层和芯线之间的绝缘电阻在几十兆欧到几百兆欧量级,在 1nA 档这就是一条漏电通路。我最后用的是低噪声同轴电缆,绝缘层是特氟龙,屏蔽层单端接地(接在仪器端,不接在被测端),长度控制在 30cm 以内。双端接地会形成地环路,反而引入工频干扰。
另外,输入端子的清洁度要当成耗材一样维护。每次测完高电压或者脏样品,我都用无水乙醇棉签擦一遍端子,等干了再接下一个。这个习惯帮我避免了好几次莫名其妙的读数漂移。
5. 从冒烟到能稳定读出 1nA 的调试路径
5.1 分步上电,别一次全插上
板子回来第一次上电,我建议分三步走,每一步都量一下关键节点。
第一步只焊电源部分,不焊运放。上电后量三路输出电压是否正常,纹波是否小于 5mV。这一步出问题,后面全是白搭。第二步焊输出级和测量级的运放,但不接反馈电阻,不接负载。量各个运放的输出是否在零点附近,有没有自激(用示波器看输出有没有高频振荡)。自激是这一步最常见的故障,表现为输出端有一个几十兆赫兹的等幅振荡,直流表看不出来,但会让所有读数都不对。第三步才把反馈电阻和继电器焊上,先用万用表量各档的电阻值,确认继电器吸合正常,再上电测零点。
我第一块板子在第二步就翻车了:测量级运放输出一直在 ±13V 之间来回跳,查了半天是反馈电阻的焊盘设计错误,把反相端和输出端短路了,运放变成了比较器。这种低级错误在分步上电时十分钟就能定位,一次全焊上就得花一晚上。
5.2 零点校准:先短接输入端,再谈精度
所有量程的零点校准,都是在输入端接一个高阻值假负载(我用的是 1GΩ 电阻串一个 100MΩ,模拟开路)的情况下,读 ADC 的原始码值,存进 MCU 的 Flash 里作为 offset。
这里有个细节:零点必须在每个量程单独校,不能只校一个档然后按比例推算。因为每个档位的失调来源不同——低阻档主要是运放 Vos 和 ADC 失调,高阻档主要是 PCB 漏电和运放 Ib。我一开始想偷懒,只校了 1mA 档,结果 1nA 档的零点偏了 300pA,完全对不上。
校准时的环境也要控制。我在恒温 25℃ 下校,然后把校准值存起来。实际使用时如果环境温度偏离超过 5℃,低电流档的零点会有几十皮安的漂移,这时候要么重新校,要么加温度补偿系数。我在固件里做了简单的线性温度补偿,用板载的 NTC 测板温,每℃ 补偿 2pA,虽然粗糙,但把漂移压到了可以接受的范围内。
5.3 量程切换后的稳定时间,必须实测出来
前面说过切档会有电荷注入和 RC 恢复。具体等多久,不能拍脑袋,得测。
方法很直接:把输出固定在一个已知电流(比如用 1GΩ 电阻加 1V 电压产生 1nA),然后让程序在 10nA 档和 1nA 档之间来回切,每次切换后以 1ms 间隔连续记录 ADC 值,画成曲线。你会看到一条典型的指数衰减曲线,从切换瞬间的满幅饱和,慢慢回到稳态值。
我的实测结果是:250Ω 到 25kΩ 这几档,稳定时间小于 5ms;25MΩ 档约 80ms;250MΩ 档约 600ms;1GΩ 档约 2.5s。这个数据直接决定了固件里的等待时间——等待时间设为实测稳定时间的 2 倍,这样即使有批次差异也留了余量。1nA 档等 5 秒听起来很久,但比起读一个错数,5 秒完全值得。
5.4 用已知电阻做一次闭环校验
校准完零点,接下来要校增益。最靠谱的办法是用一个高精度、高阻值的电阻作为"标准电流源":给它加一个精确的电压,它产生的电流就是 V/R,送进源表读回来,比对读数。
我用的是一颗 10MΩ、0.01% 的金属膜电阻,配合一个 10.000V 的基准,产生 1μA 的电流。在 1μA 档读回来,误差在 0.05% 以内。然后往下推:换 100MΩ 电阻产生 100nA,换 1GΩ 产生 10nA。每换一次量程,都要重新校增益,因为不同档位的增益误差来源不同(电阻公差、运放增益误差、ADC 增益误差)。
最后的 1nA 档是最难校的,因为你需要一个 1nA 的标准电流源。我的土办法是用 10GΩ 电阻加 10V 电压,产生 1nA。这颗 10GΩ 电阻本身公差 5%,所以只能校到 5% 的绝对精度,但可以校出线性度。如果只关心相对变化(比如测暗电流随时间的变化),这个精度就够了。
6. 那几次让我怀疑人生的读数
6.1 输出级自激:容性负载和相位裕度
输出级接上长线缆或者容性负载(比如 MOS 管的栅极),Howland 泵很容易自激。表现是输出端叠加一个几兆赫兹的正弦波,幅度几百毫伏,用万用表看不出来,但会把被测器件搞坏,也会让测量通道读到一堆垃圾。
根因是运放的输出阻抗和负载电容形成了一个极点,把相位裕度吃掉了。解决办法有三个,我三个都用了:输出串联 100Ω 隔离电阻,把容性负载和运放输出隔开;反馈回路并联一个小电容(10pF)做相位超前补偿;选增益带宽积适中的运放,不要盲目追求高速。第一版我选了一颗 50MHz 的运放,结果怎么补偿都不稳,换成 10MHz 的立刻就好了。在源表这种场合,带宽是敌人不是朋友。
6.2 1nA 档读数漂移,最后查到是继电器
1nA 档调通后,我发现读数会缓慢漂移,几分钟内从 0 漂到 +80pA,然后稳定。查了运放、查了电阻、查了清洗工艺,都没问题。最后用热成像仪一看,干簧继电器的线圈在持续通电,温度比周围高 8℃,而它就装在高阻电阻旁边 5mm 处。高阻电阻的温度系数哪怕是 100ppm/℃,8℃ 的温升也意味着 0.08% 的阻值变化,折算到 1nA 就是 0.8pA。但实际漂移远大于这个数,说明还有别的机制——后来发现是继电器的绝缘电阻随温度下降,线圈和触点之间的漏电流串到了信号上。
解决办法:继电器改用磁保持型,切换后线圈断电,不持续发热;同时把继电器和高阻电阻的间距拉到 15mm 以上,中间加一条接地铜皮做热隔离。改完之后漂移降到 5pA 以内。
6.3 切档瞬间 ADC 打出的离谱值
这个问题困扰我最久。现象是:从 10mA 档切到 1nA 档,ADC 会连续输出 3~5 个满幅值(0xFFFF),然后才回到正常。程序里明明已经加了 500ms 延时,为什么还有?
原因是ADC 的输入保护二极管在运放输出饱和期间被导通,内部电荷泵被抽走,恢复需要时间。运放在切档瞬间输出冲到 ±13V 轨,超过了 ADC 的输入范围,保护二极管导通,把电荷注入了 ADC 的采样电容。ADC 内部要花好几个转换周期才能把这个电荷泄放掉。
解决分两层。硬件上,在 TIA 输出和 ADC 输入之间串一个 10kΩ 电阻加一个肖特基钳位到 ±2.5V 基准,把过冲限制在安全范围内。软件上,切档流程改成:关输出 → 延时 100ms → 切档 → 延时稳定时间 → 打开 ADC 但丢弃前 50 个采样 → 正式开始采集。这套流程下来,再没出现过离谱值。
注意:切档期间如果被测器件是敏感的(比如某些传感器),输出端的电压冲激可能损伤它。我的做法是在输出端加一个继电器,切档时把负载断开,切完再接通。多一个继电器,多一份安心。
7. 一些不上台面但很管用的实操经验
做完整台机器,我最深的体会是:源表的精度不是设计出来的,是洗出来、等出来、隔离出来的。电路拓扑就那几种,书上都有,真正拉开差距的是那些不起眼的工艺细节。
比如焊接。低电流通道的所有焊点,我都用免清洗助焊剂含量最低的焊锡丝,焊完立刻用无水乙醇加软毛刷清洗三遍,每遍都换新的棉签。听起来夸张,但用离子污染测试笔一测,清洗前后表面绝缘电阻差了两个数量级。
比如走线。信号线绝对不走直角,不是玄学,是直角处铜箔变宽会导致阻抗突变,在高阻节点上容易形成电荷积聚。所有信号走线尽量短,从运放反相端到输入端子的路径长度控制在 20mm 以内。
比如固件里的滤波。1nA 档我用了 32 点中值滤波加滑动平均,采样率 20SPS 时响应时间约 2 秒。这个速度对测暗电流这种慢变量完全够用,但如果要测瞬态,就得把滤波关掉,接受更大的噪声。滤波参数不是越强越好,要看你的被测对象是什么。
最后一个建议:先做一版只有 1mA 和 100μA 两个档位的简化版,把架构跑通,再往上加档位。我就是一上来做了八个档,结果低电流档的问题和高电流档的问题搅在一起,排查起来极其痛苦。分阶段做,每一阶段都有可验证的成果,这才是 DIY 复杂仪器的正确节奏。整台机器最后装进一个 200×150×80mm 的铝壳里,成本算下来不到商用机的十分之一,性能上除了绝对精度(我做到 0.1% 量级,商用机是 0.02%)和长期稳定性稍差,日常测器件漏电、暗电流、休眠功耗完全够用。