
前两年我在做传感器阵列的测试方案时最头疼的不是电路本身而是借不到SMU。源测量单元这玩意一直是实验室里的抢手货大家排着队用它测IV特性、做击穿电压扫描原因很简单——它一台机器就把电压源、电流源、电压表、电流表全包了。但商业SMU的价格摆在那随便一台入门级四象限型号也要大几万个人开发者基本只能看看。所以我看到USMU这个开源项目的标题时第一反应是终于有人把SMU的软硬件方案摊开讲清楚了。这篇文章就围绕开源SMU项目USMU展开聊它的核心架构、恒压恒流环路、校准链路以及我在搭建和实测过程中踩过的坑。适合硬件工程师、仪器爱好者还有实验室里想低成本搭建一套可靠参数测试平台的朋友参考。1. 源测量单元到底在测什么——四象限、源与表的一体化1.1 一台SMU等于四台仪器的组合但难点在“同步”很多刚接触SMU的朋友会问我不就是测个电压、测个电流吗用直流电源加万用表不就行了这个问题我一开始也问过等真拿电源加万用表去测一个二极管的完整IV曲线时才发现问题不在“能不能测”而在“怎么测准、测快、测安全”。普通直流电源的本质是一个电压源它在输出端会尽力稳住电压电流只受负载决定但它没有精确的电流测量能力更没有“主动限流”到微安级别的本事。万用表倒是能测电流但表笔串进回路里就有接触电阻和压降而且你只能“一段一段地测”先用电源加压再用万用表读电流换一个点再调电源再读……这样操作不仅慢还会因为每次接触电阻不一致引入误差更危险的是如果被测器件在某个电压点突然进入击穿区电源响应不过来瞬间电流可能就把样品烧了。SMU的本质是一个“可控的源加一个同步测量的表”。它施加电压的同时通过回路里的采样电阻实时测量电流或者施加电流的同时测量端口电压。这两件事不是“先加后测”而是在同一个控制周期内同时完成闭环响应速度通常在微秒到毫秒级别。同时SMU内置了限压、限流、限功率保护无论负载怎么变化它都会先把输出钳在安全范围内。这点对测击穿电压、测电池充放电、测LED这种“跨过一个临界点电流就指数级上升”的器件极其重要。USMU作为一个开源项目做的正是这件事把源和表在电路上真正融合在一起而不是简单地把两个模块拼起来。看它的设计文档会发现最核心的工程量都花在模拟链路的同步采样和状态切换上这也是区分“DIY电源”和“SMU”的关键门槛。1.2 四象限的含义不是宣传噱头而是硬需求SMU参数页上最喜欢强调“四象限输出”听起来很专业其实用坐标图一句话就能说清。以输出端口为原点横轴是电压纵轴是电流第一象限是正电压正电流第二象限是正电压负电流第三象限是负电压负电流第四象限是负电压正电流。第一象限好理解就是给负载供电像普通电源一样第三象限也好理解就是反向供电。但第二象限和第四象限就有点反直觉了电压是正的电流却是负的意思是SMU此时在“吸收”电流扮演的不是电源而是电子负载。那什么器件会工作在第二象限呢最典型的就是太阳能电池片。你测一片光伏电池的光照特性时电池本身在发电SMU给它施加一个正向偏压电流却从电池流入SMU这时候就需要SMU既能源出又能吸收电流方向随时可能反转。再比如测二极管反向漏电你在二极管两端加反向电压理想情况下没有电流但实际上会有微安甚至纳安级的漏电流这个电流是“从被测件流向SMU”同样处在负电流象限。商业SMU能做四象限是因为它的输出级是一对互补功率管配合双极性电源轨可以平滑地跨越零点切换工作状态。很多自制电源项目只能做第一象限正电压正电流就是因为输出级用了单电源轨加单个功率管根本无法吸收反向电流。USMU这类开源方案要做的就是把这个双向功率级做出来这也是它相比普通自制电源最有含金量的地方。1.3 开源USMU在其中的位置单象限容易四象限难做一套只能“输出电压”的恒压源有多简单一片基准、一个运放、一个大功率管半天就能搭出来。但做一台能“施压的同时测流、还能吸收电流、还能自动换挡”的SMU工作量完全不在一个量级上。我个人的理解是USMU这类开源项目的价值恰恰在于它把“四象限源表”这个看似高不可攀的领域拉回到了一个认真投入的工程师能独立做到的程度。它的目标不是对标实验室里几十万的计量级源表而是覆盖三类典型场景半导体器件的基础特性分析、教学实验室的课程验证、以及对测量链路有定制需求的研发调试。换句话说如果你只是想给LED加个恒定电流看它亮不亮那不需要USMU一个恒流驱动板就行。但你要测LED正向压降随温度的变化曲线要测二极管反向恢复特性要测电池在不同放电倍率下的端电压平台要给MOSFET扫一组完整的输出特性曲线族这时候USMU就是一台能真正干活的小型源测单元。下面这张表是我根据自己的搭建实测整理的参考范围具体性能取决于器件的选择和PCB布局水平仅作大方向的对比参数维度开源USMU典型实现范围商业入门级SMU参考范围计量级SMU参考范围电压输出量程±10V到±30V±20V到±100V±200V以上电流输出量程±1mA到±200mA±100nA到±1A±fA到±10A电压分辨率约100μV约10μV到100μV1μV以下电流分辨率约10nA约1nA到10nAfA级采样率100S/s到1kS/s10kS/s到100kS/s1MS/s以上四象限能力有但功率范围受限有有软件/校准可控性完全开源可改封闭依赖原厂封闭需原厂校准所以说USMU并不是要替代商业SMU而是给“预算有限但有动手能力”的人一条可行的路。2. USMU的硬件核心恒流恒压环路与关键器件选型2.1 控制环路的三种常见拓扑我推荐哪一种源表最核心的电路是输出级和反馈控制环路。开源的SMU方案里我见过三种主流拓扑这里一个个拆开讲。第一种是“误差放大器加功率管”的线性方案。原理和精密线性稳压电源一脉相承DAC输出目标电压误差放大器比较目标值和反馈采样值输出驱动信号控制功率管让功率管调整导通程度使输出稳定在目标值。电流测量则在功率管和负载的回路上串一个精密采样电阻用ADC读采样电阻两端电压。这种方案的优势是结构直观、噪声低、响应快调试难度适中特别适合第一版跑通功能。第二种是Howland电流泵拓扑。它主要用来做恒流源能把电压信号线性转换为双向电流用两个运放和几个精密电阻实现。优点是电流方向可以正负双向适合做四象限电流源缺点是负载范围受限于运放输出电压和电阻匹配精度功率做不大而且对电阻的精度和温漂要求极高。在我看到的开源SMU方案里Howland泵通常不是主输出级而是作为小电流档位的辅助恒流源使用。第三种是开关电源加线性调整级。先做一级DCDC把电压压到目标值附近再用线性电路做精细调整。好处是效率高、能做大功率坏处是开关噪声对精密测量是灾难必须有极其严格的滤波和屏蔽对DIY来说调试难度会翻倍。USMU这类开源源表绝大多数选择了基于第一种线性方案的变体只是把功率级改成互补推挽结构配合正负电源轨实现四象限输出。我也更推荐从这条路入手原因很简单它能把“源精度”和“测精度”分开调试哪个环节出了问题都好定位。2.2 DAC与ADC的选择逻辑SMU的精度天花板很大程度上是从数模转换和模数转换这两个器件开始的。先说DAC。输出分辨率取决于DAC位数例如在10V量程下16位DAC的理论最小步进是10V除以65536大约0.15mV。这个分辨率做常规半导体IV曲线已经够用。但如果希望输出能到更精细的步进比如测LED低电流区间的电压变化就要考虑18位或更高位数的DAC。不过位数只是第一层重要的是线性度和温漂。很多中低端DAC的积分非线性折合到输出电压上可能达到几个mV这比分辨率数字难看得多。所以实际选型要重点看DNL和INL指标而不是只看位数。ADC那边开路测试的量测链路通常分两路电压回读用SAR型ADC速度高、延迟低适合做快速电压采样电流回读用Δ-Σ型ADC分辨率极高、抗噪好适合做微电流测量。我搭USMU时用的配置是电压通道16位SAR型ADC电流通道24位Δ-Σ型ADC加可编程增益放大器。有了PGA2mA档位时把信号放大到ADC满量程附近比固定增益方案在低电流档位上的表现好很多。还有两个容易被忽略的器件电压基准和低通滤波器。基准源的温漂直接决定整机输出的温度稳定性稳漂超过10ppm的基准源基本不适合用在SMU上。DAC输出的纹波和毛刺则要靠滤波电容和运放缓冲器压下来否则示波器上看是干净的接上负载后电流读数会抖得厉害。2.3 采样电阻与量程切换SMU量电流的方式本质上就是测一个精密采样电阻上的压降。这里最关键的选型参数是电阻值和温度系数。以200mA量程为例如果采样电阻取1Ω满量程压降0.2V功耗0.04W尚可接受但如果直接拿这个1Ω电阻去测2mA量程压降只有2mV已经接近ADC的噪声底部。所以SMU必须设置多个量程不同量程切换不同阻值的采样电阻。典型量程设计如下200mA档用0.1Ω电阻20mA档用1Ω2mA档用10Ω200μA档用100Ω。切换方式通常用低导通电阻的继电器或模拟开关。这里我不太推荐用模拟开关切采样电阻因为导通电阻本身会串联进采样回路带来额外误差而且在微安档位模拟开关的漏电流可能就是测量误差的主要来源。相比而言信号继电器或干簧继电器的接触电阻稳定性和一致性更好。再强调一点采样电阻一定要开尔文接线。也就是把“流过电流的路径”和“测量电压的路径”分开走线。电流走粗线电压用细线单独引到ADC输入端。否则采样电阻的引线焊盘电阻会被算进采样压降里0.1Ω的采样电阻配2mΩ焊盘电阻就是2%误差这个比例在高精度测量里完全不可接受。2.4 功率级与电源树线性功率级的输出能力由电源轨和功率管决定。要实现四象限需要正负对称的电源轨例如±12V或±15V输出级用一对互补功率管分别负责源出正电流和吸收负电流。需要注意的是功率管的基极驱动电流不能直接从精密运放输出端取通常需要加一级中功率驱动管构成达林顿结构否则运放会因输出电流超限而过热。功率级的保护电路也必须到位。我在实测时遇到过输出端被外部误接反电压的情况瞬间一个大电流灌进输出端口要不是有功率管后级的限流电阻和过流检测估计一块功率管就要烧掉。建议是输出端加串联保险或者PTC功率管附近加温度检测固件在温度超过阈值时强制切换为安全状态。3. 零点误差与校准链路为什么不能直接相信DAC读数3.1 误差链路上有哪些看不见的坑很多人搭完硬件直接用DAC设定的电压值和ADC读回的电流值出结果发现精度差得离谱就来问我是不是器件选得不够好。其实大部分情况下问题不在器件而在“没有校准”。误差链路上至少叠加了这几层DAC的增益误差和偏置误差基准源的初始误差放大器的输入失调电压分压网络的电阻比例误差采样电阻的绝对值误差还有PCB上不同金属接点形成的热电势。这些误差叠加起来可能让实际输出和理论值偏差达到百分之几而任何一层单独看元器件本身的数据手册都是合格的。要把这些系统性误差压掉唯一可靠的办法就是校准测出每一档位的实际增益和偏置然后在软件里反过来修正它。3.2 校准的完整流程实测版本我自己的校准流程是这样做的前提是你手里有一样可靠的标准源或标准表哪怕是借来的六位半万用表也比什么都没有强很多。第一步准备标准设备。一个高精度直流电压基准或一台经过计量校准的数字万用表一组低温度系数的精密电阻阻值覆盖你要校准的各个档位。第二步校准电压输出和电压回读。在每个电压量程上分别输出量程的10%、50%、90%用标准表测实际电压记录目标值与实际值。第三步校准电流档位。用精密电阻作为负载让SMU输出恒流用标准表测电阻上的压降算出实际电流和SMU报告值对比。第四步把测试点用最小二乘法拟合出线性方程也就是求出每个档位的增益系数和偏置系数存到非易失存储器里。第五步在上电初始化时加载校准系数所有输出和回读值都经过修正后再显示。有一点要注意不要只做两点校准。两点校准假设误差完全是线性的但DAC的差分非线性会让实际曲线在中段有起伏用三点甚至五点拟合能把这类非线性误差压低一个数量级。3.3 四线制测量为什么必须坚持校准只能修正系统误差但没法修正“你接错线导致”的误差。典型的错误就是用两线制去测小电阻或测低电压。举个例子你给被测件供200mA电流测试线缆和接触电阻加一起0.1Ω线上压降就是20mV。如果SMU用两线制它以为输出端已经有2V实际上被测件两端只有1.98V而且这0.1Ω还会随温度漂移你读到的不稳定根本不是器件的问题而是接线的误差。四线制则是给被测件单独引两条感应线到高阻抗输入端感应线上几乎没有电流所以线缆压降对电压测量没有影响。USMU的终端接口必须做成四线开尔文结构哪怕对外的连接器是普通的四芯终端也要把源端和感应端分开连接。3.4 验证测量的参考流程校准做完我会用一套固定流程来验证整机是否达标。先拿精度0.1%的精密电阻做负载设置恒压1V看电流读数是否和理论值吻合再设置恒流10mA看电阻上的压降是否准确。接着测一个已知正向特性的二极管扫描0到2V看正向压降值和曲线形状是否合理再测一个稳压管验证恒流模式下的反向击穿电压。最后是重复性测试同一条件下连续测10次看标准偏差是否在预期范围内。这些验证做完才有底气说这台USMU是真的能用来干活了。4. 固件与上位机从“能加电”到“能扫描”4.1 输出状态的有限状态机硬件只是SMU的骨架固件状态机才是让它安全稳定工作的肌肉。我见过不少DIY源表硬件做得不错但固件里只有一个“输出目标值”的死循环结果切换量程时一团糟。一个可靠的SMU状态机至少要有这些状态空转态恒压输出态恒流输出态限压保护态限流保护态过温保护态错误复位态。从空转切换到输出时必须软启动也就是把目标值从0逐步拉高避免瞬间阶跃对负载造成冲击。输出过程中ADC实时监控电流和电压一旦超过设定的保护阈值立即从恒压态切换到限流态并在界面上提示状态变化。错误恢复必须由用户主动确认而不是程序自动重试否则负载故障时会反复抽动。4.2 远程控制协议设计我建议USMU的固件里实现一套基于ASCII文本的远程控制协议兼容常见的SCPI风格这样任何语言都能很方便地驱动它。举个例子就是这样的格式:SOUR:VOLT 1.0 ; 设置目标电压为1V :SOUR:CURR 0.05 ; 设置限流为50mA :OUTP ON ; 开启输出 :MEAS:VOLT? ; 查询当前电压 :MEAS:CURR? ; 查询当前电流 :OUTP OFF ; 关闭输出因为协议是文本命令用串口调试助手就能测试用Python脚本也能轻松批量控制。我写上位机时就靠一个简单的串口读写函数实现了整条IV曲线的自动扫描。4.3 上位机和数据处理上位机的核心任务有三个下发扫描序列、收集回读数据、实时绘制曲线。我用Python加一个简单的GUI框架实现核心扫描逻辑大致是下面这段循环import serial import time import matplotlib.pyplot as plt ser serial.Serial(COM3, 115200, timeout0.2) def cmd(s): ser.write(s.encode() b\n) time.sleep(0.05) return ser.readline().decode().strip() voltages [i * 0.02 for i in range(0, 100)] # 0V到2V currents [] cmd(:SOUR:CURR 0.02) # 限制电流20mA cmd(:OUTP ON) for v in voltages: cmd(f:SOUR:VOLT {v:.3f}) currents.append(float(cmd(:MEAS:CURR?))) cmd(:OUTP OFF) plt.plot(voltages, currents) plt.xlabel(Voltage (V)) plt.ylabel(Current (A)) plt.savefig(iv_curve.png)这个脚本虽然简陋但已经能完成一条完整的二极管正向IV曲线测量。再往后可以加测试报告导出、批量器件筛选、多点重复采样取平均等功能都是在这个框架上叠加的。4.4 几种常见测试场景怎么跑下面是我用USMU验证过比较典型的场景。测LED正向IV特性设置从0V扫描到4V每步0.05V限流50mA时间间隔50ms可以得到完整的开启电压和串联电阻信息。测二极管反向漏电设置从0V到反向击穿电压每步0.5V限流1mA记录反向漏电流变化判断器件的击穿特性。测电池放电曲线用恒流模式设置200mA放电每10秒记录一次电池端电压绘制放电平台曲线。这些命令和脚本组合起来基本覆盖了一个半导体实验室常用的基础测试需求。5. USMU实测中翻过的几个车——避坑经验汇总5.1 环路自激震荡症状、定位、修复第一次把USMU的输出端用一根长同轴电缆接到被测件上时电流读数忽然开始剧烈跳动示波器一测输出端叠加了一个频率很高的正弦波原来的直流电压变成了直流加振荡。这个问题是功率级的输入电容和反馈环路共同造成的相位裕度不足属于典型的高增益环路自激在源表驱动容性负载时非常容易犯。定位思路是逐级排查先断开功率级只测前级运放的输出正常接上功率级但不接长线缆也正常接上长线缆后振荡立刻出现。说明问题出在“功率级输出阻抗 线缆电容”形成的极点拉低了相位裕度。修复方案是在功率级输出端预留一个零点补偿网络通常是一个几到十几欧姆的电阻串一个几十纳法电容接在反馈采样的位置高频率时补偿相位。另一个经验是别把运放的增益带宽选得太高50MHz级别的运放配电源应用反而容易自激我后来换成单位增益带宽1MHz左右、压摆率适中的运放问题就消失了。5.2 热电势与连接器温差微安档位的电流读数最容易踩的坑不是电磁干扰而是热电势。只要信号路径上存在两种不同金属的接点且两个接点有温度差就会产生热电偶效应。一个铜到镀金端子的接点在1摄氏度温差下产生的热电势虽然只有几十纳伏到微伏但在测量微弱信号时这个电压会被当成信号的一部分放大出来。对策有几个。第一信号链路上的连接器尽量用同种金属比如端子材料统一用黄铜镀镍配合铜线避免不同金属混搭。第二功率管、采样电阻、继电器这些发热器件要远离高精度信号输入区域用PCB布局上的隔离距离和局部铺地来散热。第三如果测量的信号非常微弱可以考虑把采样电阻附近做等温设计减少元件之间的温差。听起来玄学但在做真正精确的电流测量时这些都是绕不开的细节。5.3 继电器切换的瞬态毛刺自动量程功能很美好但继电器切换到小电流档位时机械触点从打开到闭合的瞬间会有抖动和飞弧这个瞬间会产生几十微秒的电压毛刺。在测脆弱的肖特基二极管或栅氧化层很薄的MOSFET时这个毛刺可能直接造成硬损伤。我实测中的处理方法是在固件状态机里增加“量程切换需要先软关断输出”的逻辑。也就是切换量程前先把输出值降到零让继电器在近乎零电流的条件下动作等它稳定后再重新升到目标值。代价是切换时间变慢大概多花几十毫秒但换来的是被测器件的安全这笔账非常划算。5.4 不要一开始就追求六位半精度最后一条经验也是我最想对新手说的做开源SMU第一版的目标应该是“能稳定测出一条合理的曲线”而不是“每一个读数都对着说明书”。我第一版USMU的精度大概在0.3%到0.5%之间电压分辨率也只有小数点后三位但已经足够完成LED筛选、二极管一致性比对、电池放电曲线记录这类日常工作。直到后来慢慢把基准源换成更低温漂的型号采样电阻全部换成精密电阻校准流程从两点改成五点拟合才把精度提升到0.1%附近。如果一开始就想着每一处都用最高规格的器件大概率会陷入没完没了的调试循环项目热情早消耗光了。我搭建USMU最有成就感的时刻是用自己焊接的板子扫出了一条平滑的二极管正向IV曲线。那条曲线只有数十个数据点精度也谈不上计量级但把它和手册上的参考曲线叠在一起时形状能完美贴合。那一刻真正理解了什么叫“测量链路是整体工程”环环相扣缺一环都跑不出最后的结果。后续如果想继续玩方向也很多加一块高压扩展板把量程推到200V以上做电池循环测试的自动化脚本或者把通信协议升级成网络接口以便接入实验室自动化系统。但我的建议始终是先把单个量程跑熟、跑稳再谈扩展。量程切换带来的设计难度是成倍增加的基础没打牢之前步子迈得太大坑只会更多。