DIY nA级源表:从吉时利2450到自制高精度SMU
2026/9/20 22:30:30 网站建设 项目流程

1. 为什么我要自己动手做一台nA级源表

第一次接触吉时利2450是在一个传感器测试项目里,当时需要给一个光电二极管做暗电流特性曲线,电流范围在几百pA到几微安之间。租了一台2450用了两周,数据确实漂亮,但租金加押金算下来够买一台不错的示波器了。后来项目结束,再想复现类似测试的时候,发现手里只有一台普通台式电源和一块六位半万用表,根本测不了nA级的电流——普通万用表的电流档底噪就在微安级别,信号完全被淹没。

这就是我决定自己搭一台nA级电流源表的起点。所谓源表,英文叫SMU(Source Measure Unit),核心能力是一边输出精确的电压或电流,一边同步测量电流或电压,而且测量分辨率要足够高,能覆盖nA甚至pA级别。吉时利2450之所以成为行业标杆,是因为它把高精度源、高精度测量、触摸屏交互和图形化分析集成在了一台机器里,但价格也摆在那里。

我这台DIY方案的目标很明确:电压输出范围0到±10V,电流测量分辨率做到1nA以下,电流输出范围覆盖1nA到10mA,能通过串口或USB把数据传到电脑上画I-V曲线。不追求和2450完全对标,但核心的nA级测量能力要有,而且成本控制在千元级别。适合谁参考?做传感器特性测试的硬件工程师、搞电化学或半导体器件研究的学生、以及喜欢折腾精密模拟电路的DIY爱好者。如果你连运放的虚短虚断都还没搞明白,建议先补一下模电基础再往下看。

2. 整体方案设计与核心器件选型

2.1 源表的基本架构拆解

一台源表说到底就是三块东西拼起来的:电流/电压源、电流/电压测量、控制与通信。吉时利2450用的是自己定制的多量程跨阻放大器加高精度ADC架构,我们DIY不可能复刻它的ASIC,但可以用分立器件搭出功能等价的电路。

我的方案架构是这样的:DAC产生设定电压,经过电压-电流转换电路输出到待测器件(DUT),同时用跨阻放大器(TIA)把流过DUT的电流转换成电压信号,再由高精度ADC采集。MCU负责控制DAC输出、读取ADC数据、处理量程切换,并通过串口把数据发给上位机。整个链路里,决定nA级测量能力的关键在TIA的反馈电阻和运放的偏置电流,这两个参数选不好,后面怎么调都是白搭。

为什么不用现成的源表芯片?市面上确实有集成式的SMU方案,但要么分辨率不够,要么价格比整台2450还贵。分立方案虽然调试麻烦,但每一级都能自己掌控,出了问题也知道去哪里找。而且DIY的乐趣不就在这儿吗。

2.2 跨阻放大器:nA级测量的心脏

跨阻放大器的原理很简单:运放的反相输入端接DUT,同相端接地,反馈电阻Rf跨接在输出和反相输入端之间。流过DUT的电流Iin全部流过Rf,输出电压Vout = -Iin × Rf。要测1nA的电流,如果Rf选1GΩ,输出就是1mV,这个电压用24位ADC采完全没问题。

但这里有个坑:运放的输入偏置电流(Ib)必须远小于你要测的最小电流。如果你要测1nA,运放的Ib至少要在100pA以下,最好在10pA以下。普通运放比如LM358的Ib在nA级别,直接就把信号淹没了。我选的是LMP7721,它的Ib典型值只有3fA(对,飞安),最大也就20fA,用来做nA级测量绰绰有余。备选方案还有ADA4530-1,Ib也在fA级别,但价格贵不少。

反馈电阻的选择需要权衡。Rf越大,同样的电流产生的电压越大,但响应速度越慢,而且大电阻的寄生电容会影响稳定性。我准备了四档反馈电阻:1MΩ、10MΩ、100MΩ、1GΩ,通过继电器切换。1MΩ档测10μA到10mA,10MΩ档测1μA到1mA,100MΩ档测100nA到100μA,1GΩ档测1nA到10μA。这样每个量程内ADC都能用到比较满的输入范围,信噪比最优。

注意:1GΩ的电阻不好买,而且普通电阻的电压系数和温度系数在大阻值下会变得很明显。我用的是玻璃封装的高阻值电阻,温度系数控制在100ppm/℃以内。如果你买不到,可以用多个100MΩ串联,但要注意串联后的寄生电容。

2.3 ADC与DAC的精度匹配

ADC我选的是ADS1256,24位ΔΣ型,有效位数在21位左右,输入范围±5V时最小分辨电压约2.4μV。配合1GΩ的Rf,理论电流分辨率是2.4μV / 1GΩ = 2.4fA,当然实际受噪声限制做不到这么低,但nA级是稳稳的。ADS1256自带PGA,可以进一步放大弱小信号,不过我在TIA后面加了一级可编程增益放大器(PGA),用的是PGA280,增益1到128可调,这样小信号可以再放大后再进ADC。

DAC选的是AD5761,16位,输出范围±10V可配置。16位在±10V下的分辨率为305μV,对于电压输出精度来说够用了。如果你要求更高,可以上18位的AD5781,但价格翻倍。DAC的输出经过一个精密运放缓冲后驱动电压-电流转换级。

这里有个细节:DAC的参考电压必须和ADC的参考电压同源,否则两者的漂移方向不一致,会导致测量误差。我用的是LTZ1000基准,7.2V输出,经过分压后分别给ADC和DAC做参考。LTZ1000贵是贵了点,但它的温漂只有0.05ppm/℃,是DIY能达到的最高水平了。预算有限的话可以用LM399,温漂0.5ppm/℃,也够用。

2.4 MCU与通信方案

MCU我用的STM32F103C8T6,就是最常见的蓝板。它自带USB和多个SPI、I2C接口,控制ADS1256和AD5761绰绰有余。有人会问为什么不用STM32F4系列,精度更高?其实源表的精度瓶颈在模拟前端,不在MCU的数字处理能力。F103的SPI速率跑ADS1256的30kSPS采样率完全没问题。

通信方面,我同时保留了USB虚拟串口和UART两种方式。USB虚拟串口方便直接连电脑,UART则可以通过CH340这类芯片转成串口,兼容性更好。上位机我用Python写了一个简单的GUI,用pyqtgraph实时画I-V曲线,数据可以存成CSV。这部分不是重点,后面简单带过。

3. 核心电路细节与实操要点

3.1 跨阻放大器的稳定性补偿

TIA最容易出的问题是自激振荡。原因是大反馈电阻和运放的输入电容、PCB寄生电容形成了极点,导致相位裕度不足。我一开始用1GΩ反馈电阻的时候,输出直接变成了一个几MHz的正弦波,完全没法用。

解决办法是在反馈电阻两端并联一个小电容Cf。Cf和Rf形成一个新的极点,用来补偿相位。Cf的计算公式是:

Cf = sqrt(Cin / (2π × Rf × GBW))

其中Cin是运放输入电容加上PCB寄生电容,大约5pF;GBW是运放的增益带宽积,LMP7721是17MHz。代入Rf=1GΩ:

Cf = sqrt(5pF / (2π × 1GΩ × 17MHz)) ≈ 0.22pF

0.22pF太小了,PCB上随便一条走线都不止这个电容。实际调试时我直接在Rf两端焊了一个1pF的村田GRM系列电容,然后用示波器看阶跃响应,发现稍微过冲但稳定了。如果你也遇到振荡,可以先用2.2pF试,然后逐步减小到刚好不振荡为止。

实操心得:Cf不能太大,否则响应速度会变得很慢。测I-V曲线时如果扫描速度要求不高,Cf大一点没关系;但如果要做瞬态测量,Cf必须精确补偿。我一般会留一个可调电容的位置,调试时用可调电容找到最佳值,然后换成固定电容。

3.2 量程切换的继电器驱动

四档反馈电阻的切换我用了欧姆龙G6K-2F-Y信号继电器,它的接触电阻小于100mΩ,绝缘电阻大于1GΩ,关键是体积小、驱动电流低。继电器线圈需要5V驱动,STM32的GPIO只有3.3V,所以加了一级ULN2003达林顿阵列来驱动。

这里有个容易忽略的问题:继电器切换时会产生电弧和EMI,可能干扰ADC的读数。我在继电器线圈两端加了续流二极管(1N4148),并在触点两端并联了100pF的电容来吸收高频噪声。另外,量程切换后要等一段时间再采样,让TIA的输出稳定下来。我的做法是切换后延时50ms再启动ADC转换。

继电器的布局也很讲究。四个继电器要尽量靠近TIA的反馈回路,走线要短而粗,减少寄生电感和电容。我第一版PCB把继电器放在了板子另一侧,结果切换时噪声大得没法看,后来重新布局才解决。

3.3 电源与接地设计

nA级测量对电源噪声极其敏感。普通开关电源的纹波在几十mV级别,经过TIA的电源抑制比衰减后仍然可能在输出端产生nA级的噪声。我的方案是两级稳压:第一级用LM317和LM337做预稳压,把纹波降到mV级别;第二级用LT3045LT3094这对超低噪声LDO,输出噪声只有0.8μVrms,给运放和ADC供电。

接地方面,我采用了星型接地。模拟地(AGND)和数字地(DGND)在ADC芯片下方单点连接,所有模拟电路的接地都汇到AGND,数字部分汇到DGND。PCB上专门留了一层完整的模拟地平面,数字信号线不走模拟区域。这个做法在低速高精度电路里很有效,实测下来ADC的底噪从原来的几十μV降到了几μV。

注意:LT3045的散热要处理好,它的压差如果太大(比如输入12V输出5V),功耗会很高。我一开始没加散热片,跑了几分钟就烫得摸不得,后来加了小铜片才稳定。建议输入电压不要超过8V,或者用两级降压。

3.4 保护电路不能省

DUT如果短路或者接反,TIA的输入端可能承受超出运放绝对最大额定值的电压。LMP7721的输入电压范围是电源轨加0.3V,超过就会损坏。我在TIA输入端串联了一个100kΩ的限流电阻,并在运放输入端加了BAV199低漏电流二极管做钳位。BAV199的漏电流只有3pA,对nA级测量的影响可以忽略。

输出端也加了保护。电压-电流转换级的输出如果短路到地,运放会进入限流状态。我在输出串联了一个10Ω的电阻,并在输出端加了TVS二极管(SMBJ12A)来吸收瞬态高压。这些保护措施在正常测量时不会影响精度,但关键时刻能救你一命。

4. 完整搭建流程与调试记录

4.1 PCB设计与打样

原理图设计我用的是Altium Designer 20。整个电路分成四块:电源板、模拟板、数字板、接口板。我一开始想做成一块板,后来发现电源的噪声会耦合到模拟部分,所以改成了两块板:电源板单独一块,模拟和数字放另一块,中间用排线连接。

PCB布局的要点:TIA的反馈回路面积要尽可能小,Rf和Cf直接焊在运放的引脚旁边;ADC的模拟输入走差分线,尽量等长;继电器的驱动线远离模拟信号线;电源走线要宽,至少20mil。打样我用的嘉立创,四层板,沉金工艺,一张板子不到50块钱。

焊接的时候有个坑:LMP7721是SOT-23-5封装,引脚间距很小,手焊容易连锡。我的做法是先用细锡丝在焊盘上镀一层薄锡,然后用热风枪吹上去,最后用放大镜检查有没有短路。1GΩ的电阻是玻璃封装的,焊接时温度不能太高,烙铁停留时间不要超过3秒。

4.2 上电调试步骤

第一步:电源检查。不焊运放和ADC,先给电源板上电,用万用表测各路输出电压是否正常。LT3045输出应该是5V,LT3094输出应该是-5V,纹波用示波器看应该在1mV以下。

第二步:DAC输出验证。焊上AD5761和缓冲运放,用STM32输出一个固定码值,测量DAC输出电压。我设置的是0x8000对应0V,0xFFFF对应+10V,0x0000对应-10V。实测线性度很好,误差在1mV以内。

第三步:TIA静态测试。焊上LMP7721和反馈电阻,输入端悬空(不接DUT),测量TIA输出电压。理想情况下应该是0V附近,实际会有几mV的失调。LMP7721的失调电压最大500μV,经过1GΩ反馈电阻后等效为0.5pA的电流误差,可以接受。如果失调太大,可以用运放的调零引脚或者软件校准。

第四步:接标准电阻验证。用一个已知的100MΩ电阻作为DUT,施加1V电压,理论电流是10nA。切换到100MΩ档,看ADC读数是否接近10nA。我实测下来误差在2%以内,主要来自电阻本身的精度和TIA的增益误差。软件校准后可以降到0.5%以内。

第五步:噪声测试。输入端接一个屏蔽盒里的10GΩ电阻,施加0V电压,记录ADC读数的峰峰值。我实测的噪声在5pA峰峰值左右,换算成电流分辨率大约是1pA,完全满足nA级测量的需求。

4.3 上位机软件与数据采集

STM32的固件用Keil MDK开发,主要流程是:初始化ADC和DAC,设置定时器触发ADC采样,采样数据通过USB虚拟串口发送。采样率我设的是10SPS,对于I-V曲线扫描足够了。数据格式是ASCII码,每行一个电流值,方便Python解析。

Python上位机用pyqt5做界面,pyqtgraph画图。核心代码很简单:

import serial import pyqtgraph as pg from PyQt5 import QtWidgets ser = serial.Serial('COM3', 115200) app = QtWidgets.QApplication([]) win = pg.GraphicsLayoutWidget() plot = win.addPlot(title="I-V Curve") curve = plot.plot(pen='y') def update(): line = ser.readline().decode().strip() if line: current = float(line) # 更新曲线数据 ... timer = pg.QtCore.QTimer() timer.timeout.connect(update) timer.start(100)

实际使用的时候,我会先设置DAC从-10V扫到+10V,步进10mV,每个点延时100ms后读取ADC,然后画成I-V曲线。整个扫描过程大约需要3分钟,对于大多数传感器测试来说够用了。

5. 常见问题与避坑指南

5.1 读数跳动大怎么办

这是最常见的问题。原因可能有三个:电源噪声、接地不良、TIA振荡。排查顺序是先用示波器看TIA输出有没有高频振荡,如果有,调整Cf;如果没有,检查电源纹波,必要时增加LC滤波;最后检查接地,确保模拟地和数字地单点连接,且连接点靠近ADC。

我遇到过一次读数跳动特别大的情况,查了半天发现是USB线的地线环路引入了噪声。后来在USB线上加了一个共模扼流圈,问题就解决了。所以如果你用USB通信,注意一下线缆的质量。

5.2 量程切换后读数不准

继电器切换后需要一定的稳定时间。我一开始只延时10ms,发现读数偏高,后来改成50ms就正常了。另外,继电器的触点氧化也会导致接触电阻变大,尤其是小信号档位。建议选用金触点的信号继电器,比如欧姆龙G6K系列的金触点版本。

还有一个可能的原因是反馈电阻的电压系数。高阻值电阻在承受较大电压时,阻值会发生变化。比如1GΩ电阻在10V电压下,阻值可能变化0.1%。解决办法是限制每个量程的最大输出电压,或者选用电压系数更小的电阻。

5.3 测不了负电流

TIA只能测单向电流,如果要测负电流(电流流出DUT),需要双电源供电或者用两个TIA。我的方案是给LMP7721提供±5V双电源,这样输出可以正负摆动,能测双向电流。但要注意,负电源的噪声同样会影响测量,所以LT3094的噪声指标要和LT3045一样好。

如果你只需要测单向电流,可以简化设计,用单电源供电,但TIA的输出会有一个偏置,需要在软件里减去。

5.4 常见问题速查表

现象可能原因排查方法解决方案
读数跳动大电源噪声示波器看电源纹波增加LC滤波或更换LDO
读数跳动大TIA振荡示波器看TIA输出调整Cf或增加隔离电阻
读数跳动大接地环路检查地线连接单点接地,加共模扼流圈
量程切换后不准稳定时间不足增加延时看是否改善延时改为50ms以上
量程切换后不准继电器触点氧化测量触点电阻更换金触点继电器
测不了负电流单电源供电检查运放电源改为双电源供电
线性度差反馈电阻电压系数不同电压下测阻值更换低电压系数电阻
ADC读数满量程PGA增益设置错误检查PGA配置寄存器重新配置增益

5.5 几个容易被忽略的细节

屏蔽。整个模拟板最好放在金属屏蔽盒里,尤其是TIA部分。我用的是一个铝制外壳,接大地。实测下来,不加屏蔽盒时噪声大约10pA峰峰值,加了之后降到3pA。

热电动势。不同金属连接处会产生热电动势,比如铜-锡焊点。在nA级测量中,热电动势可能产生pA级的误差。解决办法是让所有连接点的温度尽量一致,避免温度梯度。我在关键节点用了低热电动势的焊锡。

清洁。PCB上的助焊剂残留会吸收水分,导致漏电流。焊接完成后要用无水酒精清洗PCB,尤其是TIA输入端的区域。我洗了三遍,漏电流从几百pA降到了几pA。

校准。DIY的源表需要定期校准。我用的是Fluke 8846A六位半万用表和一套精密电阻作为参考。校准方法是:在每个量程下,用已知电阻产生已知电流,记录ADC读数,计算增益和偏移,写入STM32的Flash。建议每半年校准一次。

6. 实测性能与改进方向

6.1 实测数据

经过校准后,我这台DIY源表的实测性能如下:

参数指标
电压输出范围±10V
电压输出分辨率305μV
电流测量范围1nA - 10mA
电流测量分辨率1pA(1GΩ档)
电流测量精度±0.5%读数 + 0.1%满量程
噪声3pA峰峰值(1GΩ档,0V偏置)
扫描速度10点/秒

和吉时利2450相比,主要差距在扫描速度和自动化功能上。2450可以做到每秒几千个点,而且内置了各种器件测试模板。但就nA级电流测量的核心能力而言,这台DIY设备已经能满足大部分传感器和器件的静态特性测试需求。

6.2 还可以怎么改进

如果你想让性能再上一个台阶,可以考虑这几个方向:换用更高位的ADC,比如ADS1282(32位),分辨率可以再提高一个数量级;增加电流输出功能,现在只有电压源,加一个电流源电路就能实现真正的四象限源表;加入温度补偿,用温度传感器监测关键器件的温度,软件补偿温漂;改用以太网通信,提高数据传输速率,支持更快的扫描。

我个人最想改进的是扫描速度。现在10点/秒的速度测一条完整的I-V曲线要几分钟,如果能提高到1000点/秒,就可以做瞬态特性分析了。瓶颈主要在ADS1256的采样率和STM32的处理能力,换用STM32H7系列加ADS127L01应该能实现。

最后分享一个我在调试过程中总结的小技巧:每次改动电路后,先用一个已知的大电阻(比如10MΩ)验证基本功能,再切换到小信号测试。这样可以快速定位问题是出在电路本身还是小信号处理部分。我踩过好几次坑,都是因为直接上nA级信号,结果调了半天发现是某个焊点虚焊。先用大信号验证,能省很多时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询