ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于LabVIEW与2400源表的I-V特性扫描系统设计与实现

基于LabVIEW与2400源表的I-V特性扫描系统设计与实现 1. 从一台2400和一根USB线说起I-V扫描到底在扫什么很多人第一次接触2400源表脑子里冒出的问题是这不就是个电源吗。实际上2400系列数字源表SourceMeter的核心价值在于它把电源和测量单元塞进了同一个机箱——它既能输出电压/电流又能在输出激励的同时高精度测量电流/电压。做半导体器件、二极管、太阳能电池、传感器这类非线性元件的I-V特性测试时这种边供边测的能力是普通电源加万用表拼不出来的。I-V曲线扫描的本质是给被测器件DUT施加一系列离散的电压或电流激励点在每个点上同步采集对应的电流或电压响应最后把这一串V, I数据点连成曲线。听起来简单但真正动手时会发现一堆问题扫描点数怎么定、每点之间要不要延时、量程怎么选、四线还是两线、数据怎么实时传回上位机、曲线怎么实时刷新。这些细节决定了你拿到的是能用的数据还是一堆噪声。用LabVIEW做上位机来驱动2400是实验室和产线里非常常见的一套组合。原因很直接LabVIEW的图形化数据流编程天然适合采集-处理-显示这种流水线而且它内置的VISA接口对SCPI命令的支持非常成熟不用自己写底层通信协议。这套方案适合做器件研发测试的工程师、高校做实验的学生以及需要快速搭一套自动化测试台架的产线技术人员。我下面要讲的不是把手册翻译一遍而是把从零搭一套2400 LabVIEW 扫I-V系统时真正会卡住你的地方按实际动手顺序拆开讲。包括通信怎么建、SCPI命令怎么写、扫描逻辑怎么设计、数据怎么处理、以及那些手册上不会写但会让你调一整天的坑。2. 通信链路搭建VISA、SCPI和那个总被忽略的终止符2.1 为什么是VISA而不是直接串口2400背面有GPIB、USB、RS-232几种接口。现在新机器基本都用USB后面是个USBTMC设备老设备可能走GPIB。不管走哪种物理接口LabVIEW里统一用**VISAVirtual Instrument Software Architecture**来访问。VISA的好处是把你从这个接口要调这个DLL、那个接口要调那个驱动的泥潭里捞出来同一套VISA Open、VISA Write、VISA Read、VISA Close函数换个资源地址就能切换接口。资源地址的写法要记牢接口类型资源地址格式示例USBUSB0::厂商ID::产品ID::序列号::INSTRUSB0::0x05E6::0x2400::1234567::INSTRGPIBGPIB0::主地址::INSTRGPIB0::24::INSTRRS-232ASRL端口号::INSTRASRL3::INSTRUSB地址里的厂商ID和产品IDKeithley的USB设备厂商ID一般是0x05E6。序列号那一段如果你不确定可以在NI MAXMeasurement Automation Explorer里直接看到设备枚举出来的完整地址强烈建议直接从MAX里复制地址别手敲敲错一个字符就是半小时的排查。2.2 SCPI命令的读写节奏2400遵循SCPIStandard Commands for Programmable Instruments标准。SCPI命令分两类设置类不带问号只写和查询类带问号写完要读。这里有个新手最容易踩的坑——写查询命令后必须紧接着读写设置命令后一般不需要读但如果你混着发读回来的东西可能对不上号。一个典型的初始化序列长这样*RST 复位到出厂状态 :SOUR:FUNC VOLT 源功能设为电压源 :SOUR:VOLT:MODE SWE 电压模式设为扫描 :SENS:FUNC CURR 测量功能设为电流 :SENS:CURR:PROT 0.01 电流保护限值10mA :SOUR:VOLT:STAR 0 扫描起始电压0V :SOUR:VOLT:STOP 1 扫描终止电压1V :SOUR:VOLT:STEP 0.01 步进10mV :TRIG:COUN 101 触发计数扫描点数 :FORM:ELEM VOLT,CURR 返回数据包含电压和电流 :OUTP ON 打开输出 :READ? 触发并读取注意:FORM:ELEM VOLT,CURR这一句。默认情况下2400的:READ?可能只返回电流值如果你要同时拿到电压和电流必须显式设置返回元素。这个设置漏了你会发现读回来的数据长度只有预期的一半然后对着数组索引抓狂。2.3 终止符那个让通信看起来通了但读不到数据的元凶SCPI命令在物理层传输时每条命令末尾需要加终止符。常见的是\n换行ASCII 10或\r\n。2400默认接受\r\n或\n作为命令终止返回数据时默认以\r\n结尾。在LabVIEW里用VISA Write写命令时字符串末尾一定要手动加上终止符。很多人写:READ?就直接发出去了仪器收到没有终止符的命令会一直等等不到就超时。正确写法是:READ?\n或者用LabVIEW的字符串常量拼一个换行符。读取时更微妙。VISA Read需要指定读取字节数但你不确定仪器会返回多少字节。标准做法是先发:READ?然后用一个足够大的字节数去读或者用VISA的读取直到终止符模式。LabVIEW的VISA Read有个超时设置配合终止符使能可以让它读到\n就停。如果你用固定字节数读读少了数据被截断读多了会一直等到超时——两种情况都会让你怀疑人生。提示在NI MAX里有一个与仪器通信的交互面板可以手动发命令看返回。搭LabVIEW程序之前先在MAX里把初始化序列和:READ?跑通确认仪器响应正常再去写代码。这一步能帮你排除掉一半的通信问题。3. 扫描逻辑设计点数、延时和那个绕不开的源-测时序3.1 扫描点数与步进的取舍扫描点数不是越多越好。点数多了单次扫描时间长器件可能发热漂移点数少了曲线拐点处会失真。经验上对于二极管正向特性这种指数型曲线拐点附近要密线性区可以疏。但2400的线性扫描模式只支持等步进所以要么整体加密要么用列表扫描模式:SOUR:LIST自定义每个点的电压值。一个实用的折中先用101点100步粗扫一遍看曲线形状确定拐点大概位置后再在拐点区间用列表模式加密。比如二极管从0到0.8V可以在0到0.5V用10mV步进0.5到0.8V用2mV步进。扫描方向也要考虑。单向扫描和双向扫描拿到的曲线可能不一样因为器件存在迟滞效应比如某些忆阻器、电池材料。如果你的器件有迟滞双向扫描从起始扫到终止再扫回来能看出回线。2400支持:SOUR:VOLT:DIR设置方向或者用列表模式把往返点都列进去。3.2 每点之间的延时不是可有可无的摆设2400在扫描模式下每个点之间的时间间隔由几个因素决定源建立时间、测量积分时间NPLC、以及你显式设置的延时。NPLCNumber of Power Line Cycles是决定测量精度和速度的关键参数。1 NPLC意味着测量积分一个工频周期50Hz下20ms能有效抑制工频噪声0.01 NPLC速度快但噪声大。对于高阻器件比如反向偏置的二极管电流在nA级建议用1 NPLC甚至更高并且加显式延时让源稳定。对于低阻器件正向导通的二极管mA级0.1 NPLC就够延时可以短一些。在SCPI里设置:SENS:CURR:NPLC 1 电流测量用1个工频周期积分 :SOUR:VOLT:DEL 0.01 每点源建立后延时10ms再测量这个:SOUR:VOLT:DEL就是显式延时。很多人扫出来的曲线在拐点处有毛刺八成是延时不够源还没稳定就测了。我一般会先用一个固定电压点改变延时值看读数什么时候稳定下来以此确定最小可靠延时。3.3 触发模型别让仪器自己跑而你还在等2400的触发模型有点绕。简单说:READ?是一个触发并读取的复合命令它会让仪器按当前配置执行一次完整的源-测循环。但在扫描模式下一次:READ?会执行整个扫描序列由:TRIG:COUN决定点数然后一次性返回所有数据。这里有个陷阱如果你在LabVIEW里循环发:READ?每次都会重新执行整个扫描而不是逐点读取。正确的做法是发一次:READ?然后读回一大串数据在LabVIEW里解析成数组。数据返回格式默认是ASCII每个点用逗号分隔点与点之间用分号或换行分隔。:FORM:ELEM VOLT,CURR设置后每个点返回两个数电压、电流所以101个点会返回202个数。解析时按每两个一组拆分即可。如果数据量大比如几千点ASCII传输会慢。可以切到二进制格式:FORM:DATA REAL,32速度快很多但LabVIEW端要按IEEE 754浮点数解析稍微麻烦一点。对于常规的几百点扫描ASCII足够用别为了省那点时间给自己找解析的麻烦。4. LabVIEW程序架构从能跑到跑得稳的几层设计4.1 最简架构顺序结构够不够用如果只是做一次性的手动扫描一个平铺的顺序结构就能搞定VISA Open → 写初始化命令 → 写:READ?→ VISA Read → 解析 → 显示 → VISA Close。这种写法上手快但问题也很明显界面会卡死。:READ?执行期间如果扫描点数多、延时大整个扫描可能持续几秒到几十秒这期间LabVIEW前面板完全不响应用户点什么都动不了。对于研发调试阶段这种卡一下还能忍。但如果要做产线测试或者需要实时看曲线增长过程就必须把扫描放到独立线程里。4.2 生产者-消费者模式让界面和采集各干各的LabVIEW里处理这种后台采集、前台显示的标准套路是生产者-消费者设计模式。生产者循环负责和2400通信、执行扫描、把原始数据放进队列消费者循环从队列取数据、解析、更新图表、存盘。两个循环通过队列解耦界面就不会卡。具体到I-V扫描生产者循环里可以进一步细分一个状态机控制初始化→配置→触发→读取→解析→入队的流程。消费者循环则负责把数据点追加到波形图表并可选地写入TDMS或CSV文件。队列元素的数据类型建议用一个簇包含时间戳、电压数组、电流数组、扫描序号。这样消费者端拿到的是一个完整的数据包处理起来干净。4.3 实时曲线刷新别每个点都重绘如果扫描是逐点返回的比如用列表模式配合单点触发每来一个点就更新一次图表界面刷新开销会很大。合理的做法是攒够一批点比如10个或20个再刷新一次图表或者用固定时间间隔比如100ms刷新。LabVIEW的波形图表本身有缓冲追加数据比重新赋值整个数组效率高。另外图表的历史长度要设个上限不然扫个几万点内存和刷新都会拖垮程序。在图表属性里设置Chart History Length为一个合理值比如10000超出后自动滚动。4.4 错误处理与资源释放别让仪器锁死VISA会话是独占资源。如果程序异常退出而没有执行VISA Close下次再连可能报资源被占用。务必把VISA Close放在错误处理分支里保证无论正常结束还是出错都能释放。LabVIEW的错误簇机制天然适合做这件事把VISA引用和错误簇串起来出错时走清理分支。还有一个细节2400的输出状态。如果程序崩溃时输出还开着器件可能一直承受电压。稳妥的做法是在初始化时先发:OUTP OFF结束时也发:OUTP OFF并且在错误处理里也补一句。5. 数据解析与曲线呈现从一串字符到一条能看的曲线5.1 ASCII数据的解析陷阱:READ?返回的ASCII字符串大概长这样0.00000E00,1.23456E-06,1.00000E-02,2.34567E-06,...每两个数一组电压、电流用逗号分隔。解析时先按逗号拆成字符串数组再两两转成数值。注意科学计数法里的正负号和指数部分LabVIEW的小数数字符串至数字函数能处理但要确保输入字符串没有多余空格。有时候仪器返回的字符串末尾带\r\n拆分前先trim掉。如果扫描点数多字符串会很长。LabVIEW处理长字符串拆分时用Spreadsheet String To Array函数比手动循环拆分快得多。设置分隔符为逗号数据类型为双精度一次就能转成数值数组。5.2 电压电流配对与单位换算2400返回的电流单位是安培电压是伏特。对于小电流器件画图时可能想用mA或uA做单位在LabVIEW里乘个系数就行。但要注意单位换算只影响显示不影响存盘原始数据。存盘时建议保留原始单位A和V避免后续分析时单位混乱。配对逻辑数值数组索引0是电压、1是电流、2是电压、3是电流……所以偶数索引是电压奇数索引是电流。用LabVIEW的Decimate Array或者按索引抽取都能实现。5.3 曲线呈现的几个实用设置XY Graph比Waveform Graph更适合I-V曲线因为X轴是电压不等间距也可能Y轴是电流。把电压数组接X、电流数组接Y就能画出标准I-V曲线。几个让曲线更好看的设置Y轴用对数坐标如果电流跨几个数量级比如从nA到mA对数坐标能同时看清反向漏电和正向导通。加游标LabVIEW的XY Graph支持游标可以读出任意点的电压电流值方便找阈值电压、计算导通电阻。反向电流取绝对值有些器件反向电流是负的如果只想看大小可以取绝对值再画。5.4 数据存盘TDMS还是CSVTDMS是NI自家的二进制格式写入快、体积小、带元数据适合大量数据。CSV通用性好Excel能直接打开适合少量数据或需要人工查看的场景。我的习惯是两个都存TDMS用于归档和后续程序读取CSV用于快速人工检查。存盘时把扫描参数起始、终止、步进、NPLC、延时也写进文件头不然过两天你自己都忘了这组数据是什么条件测的。6. 那些手册不写但会让你调半天的坑6.1 量程自动切换带来的数据跳变2400默认可能开着自动量程。在扫描过程中当电流跨量程边界时仪器内部继电器会切换切换瞬间可能产生一个尖峰或者读数跳变。如果你的曲线在某个电流值附近有规律地出现毛刺先检查是不是自动量程在作怪。解决办法根据预期电流范围手动固定量程。比如预期电流在uA级就设:SENS:CURR:RANG 1e-510uA量程。固定量程后数据会干净很多。代价是如果实际电流超出量程读数会饱和所以量程要选得比预期最大值大一点。6.2 四线制还是两线制导线电阻什么时候会咬你两线制测量时导线电阻和接触电阻会串在测量回路里。对于低阻器件比如导通电阻几欧姆的器件导线电阻可能就有零点几欧误差不可忽略。四线制Kelvin连接把电流线和测量线分开能消除导线电阻影响。2400支持四线制前面板有对应的端子。SCPI里用:SENS:REM ON开启远端感应。但四线制接线麻烦一倍对于高阻器件电流小导线压降可忽略没必要。判断标准如果器件阻抗和导线电阻在同一数量级就上四线。6.3 自热效应扫得越快器件越凉扫描过程中电流流过器件会产生热量器件温度升高特性会漂移。扫描速度越快单点停留时间越短自热影响越小。但扫描太快又和NPLC、延时矛盾。对于功率敏感器件比如大电流二极管可以用脉冲模式2400支持脉冲扫描占空比低平均功率小。减小扫描范围只测关心的区间。双向扫描取正反两次的平均部分抵消漂移。6.4 LabVIEW版本与VISA驱动的兼容性LabVIEW 2015、2018、2020各个版本对VISA的支持基本一致但VISA驱动NI-VISA的版本要和LabVIEW匹配。如果装完LabVIEW发现VISA函数找不到八成是NI-VISA没装或者版本太老。去NI官网下最新版NI-VISA装上重启LabVIEW就能看到。另外64位LabVIEW需要64位VISA驱动32位对32位。装错了会出现函数存在但调用报错的诡异现象。6.5 字符串终止符在LabVIEW里的隐藏设置LabVIEW的VISA Write有个添加终止符的选项默认可能是关闭的。如果你在字符串里手动加了\n又开了这个选项就会变成两个终止符仪器可能报命令错误。统一策略要么全手动加要么全用VISA的自动终止符别混着来。我习惯手动加因为这样在代码里看得见调试时一目了然。7. 从单次扫描到自动化测试可以继续往下走的方向一套能稳定扫单条I-V曲线的程序搭好之后往自动化方向扩展是很自然的事。比如产线上要对一批器件逐个测试可以在外层加一个循环每次换器件后重新触发扫描把结果按序列号存盘。这时候要注意器件切换时的放电和接触检查避免上一个器件的残余电荷影响下一个。再进一步可以把扫描参数做成配置表不同器件类型对应不同的起始/终止/步进/NPLC组合程序读表自动切换。这样一条测试线能兼容多种产品不用每次改代码。如果要做温度相关的I-V测试可以把2400和温控源表联动在每个温度点扫一条曲线最后画出I-V-T三维图。这时候通信会变成多设备协调建议用LabVIEW的通知器或用户事件来同步各设备的动作别用轮询硬等。我在实际搭这套系统时最大的体会是通信和扫描逻辑本身不难难的是把时序、量程、延时这些参数调到和你的器件匹配。同一套代码换个器件可能就要重新调一遍参数。所以程序里把这些参数都做成前面板可调的输入比写死在代码里强得多。另外每次改完参数先拿一个已知特性的器件比如一个普通二极管验证一遍确认曲线形状对得上再去测未知器件能省下大量到底是器件问题还是程序问题的纠结时间。
返回列表