你好。
我有一个B2902A,我正在尝试对二极管实施3点测试,我希望它尽可能快地运行。
在我的测试中,我想测量正向电压Vf,反向击穿电压Vr和反向漏电流Il。
我开始编写一些简单的代码,通过GPIB一次一个地将每个命令发送到仪器。
我的代码包括初始设置的一部分,然后是一些循环运行的代码,一遍又一遍地重复测试。
我的编码环境是
labview 2011.我发送的命令如下:* CLS; * RST;:SYST:BEEP:STAT OFF;:DISP:ENAB 0;:SENS:REM ON;:SENS:CURR:NPLC 0.01;:
SENS:VOLT:NPLC 0.01;:SOUR:CURR:RANG:AUTO OFF;:SOUR:VOLT:RANG:AUTO OFF;:SOUR:WAIT:AUTO OFF;:SOUR:WAIT OFF;:SENSE:VOLT:RANG:AUTO OFF
;:SENSE:CURR:RANG:AUTO OFF;:SENSE:WAIT:AUTO OFF;:SENSE:WAIT OFF;:FORM REAL,32 ;:FORM:BORD NORM;'预设SMU配置以加速第一次迭代
测试:SENS:VOLT:PROT 2.000000;:SENS:VOLT:RANG 2.000000;:SOUR:CURR:RANG 1.000000;:SOUR:FUNC:MODE CURR;:OUTP ON;'
开始在这里循环命令'============================:SENS:VOLT:PROT 2.000000;:SENS:VOLT:RANG 2.000000;
:SOUR:CURR:RANG 1.000000;:SOUR:FUNC:MODE CURR;:TRIG:ACQ:DEL 0.000100;:SOUR:CURR:TRIG 1.000000;:SENS:FUNC:OFF:ALL;:SENS:FUNC'VOLT';:
FORM:ELEM:SENS VOLT;:READ?
'测量Vf:SOUR:CURR:RANG -1.000000E-5;:SENS:VOLT:PROT 200.000000 ;:SENS:VOLT:RANG 200.000000 ;:TRIG:ACQ:DEL 0.000600 ;:SOUR:CURR:TRIG -1.000000E-5
;:读?
'测量Vr:SOUR:VOLT:RANG -50.000000;:SENS:CURR:PROT 0.000100;:SENS:CURR:RANG 0.000100;:SOUR:FUNC:MODE VOLT;:TRIG:ACQ:DEL 0.000000;:SOUR:VOLT:TRIG
-50.000000;:SENS:FUNC:OFF:ALL;:SENS:FUNC'CURR';: FORM:ELEM:SENS CURR;:READ?
'测量Il'============================'在这里结束循环:OUTP OFF;:DISP:ENAB 1;我跑了
在For循环中循环部分命令100次并测量运行所花费的时间并发现循环每秒运行大约12次。
我读到程序存储器应该通过消除单个命令的总线传输来加速代码执行,并且因为命令将被“预编译”,所以我想也许如果我使用它我可以让它更快。查看
通过手册并试一试,我发现我不能将循环命令抛入程序存储器,因为不支持查询命令,所以:READ?
命令必须去。
我稍微更改了命令以支持使用缓冲区,我只是在最后检索数据。
我的代码再次分解为初始设置部分和循环部分。我的程序存储器代码如下所示:* CLS; * RST;:PROG:DEL:ALL;:SYST:BEEP:STAT OFF;:DISP:
ENAB 0;:SENS:REM ON;:SENS:CURR:NPLC 0.01;:SENS:VOLT:NPLC 0.01 ;: SOUR:CURR:RANG:AUTO OFF ;:SOUR:VOLT:RANG:AUTO OFF ;: SOUR:WAIT:
AUTO OFF;:SOUR:WAIT OFF;:SENSE:VOLT:RANG:AUTO OFF;:SENSE:CURR:RANG:AUTO OFF;:SENSE:WAIT:AUTO OFF;:SENSE:WAIT Off ;:FORM REAL,32;:
FORM:BORD NORM;:FORM:ELEM:SENS VOLT,CURR ;: SENS:VOLT:PROT 2.000000;:SENS:VOLT:RANG 2.000000;:SOUR:CURR:RANG 1.000000;:SOUR:FUNC:MODE CURR;:TRAC:
FEED:CONT NEV;:TRAC:CLE;:TRAC:POIN 30;:TRAC:FEED SENS;:TRAC:FEED:CONT NEXT;:PROG:NAME“diodetest”;:PROG:DEF#0:SENS:VOLT:PROT
2.000000;:PROG:APP#0:PROG:APP#0:SENS:VOLT:RANG 2.000000;:PROG:APP#0:SOUR:CURR:RANG 1.000000;:PROG:APP#0:SOUR:FUNC:MODE CURR;
:PROG:APP#0:TRIG:ACQ:DEL 0.000100;:PROG:APP#0:SOUR:CURR:TRIG 1.000000;:PROG:APP#0:SENS:FUNC:OFF:ALL;:PROG:APP#0:
SENS:FUNC'VOLT';: PROG:APP#0:INIT;:PROG:APP#0:SOUR:CURR:RAN
G -1.000000E-5;:PROG:APP#0:SENS:VOLT:PROT 200.000000;:PROG:APP#0:SENS:VOLT:RANG 200.000000 ;:PROG:APP#0:TRIG:ACQ:DEL 0.000600;:
PROG:APP#0:SOUR:CURR:TRIG -1.000000E-5;:PROG:APP#0:INIT;:PROG:APP#0:SOUR:VOLT:RANG -50.000000;:PROG:APP#0:SENS:
CURR:PROT 0.000100;:PROG:APP#0:SENS:CURR:RANG 0.000100;:PROG:APP#0:SOUR:FUNC:MODE VOLT;:PROG:APP#0:TRIG:ACQ:DEL 0.000000;:PROG:
APP#0:SOUR:VOLT:TRIG -50.000000;:PROG:APP#0:SENS:FUNC:OFF:ALL;:PROG:APP#0:SENS:FUNC'CURR';: PROG:APP#0:INIT;
:OUTP ON;'
开始在这里循环代码'=======================:PROG:EXEC; * OPC?'============
==========='结束循环代码:TRAC:DATA?:OUTP OFF;:DISP:ENAB 1;我再次运行循环100次并计时它,这次我找到了循环
每秒只运行8次而不是12次。实际上速度较慢!我的问题如下:我做错了什么?
为什么它变慢?有没有办法让程序存储器在循环中运行并且可能使它更快?在两个版本的测试中,我的SMU点击很多,好像互锁继电器或输出继电器点击并且
很多,但我的联锁一直在使用。
我怀疑它可能是高压和低压范围之间的切换,但是当我重新测试时,确保仅使用20V或更低的范围,它仍然会产生咔嗒声。
这些点击是什么?我还能做些什么来让这个测试更快地运行?
以上来自于谷歌翻译
以下为原文
Hi. I have a B2902A and I am trying to implement a 3 point test on a diode and I want it to run as fast as possible. In my test I want to measure the forward voltage Vf, the reverse breakdown voltage Vr, and the reverse leakage current Il. I started by wri
ting some simple code that would send each command to the instrument one at a time over GPIB. My code includes a portion at the beginning for intial setup and then some code which I run in a loop to repeat the test over and over again. My coding environment is LabVIEW 2011.
The commands I sent were as follows:
*CLS;
*RST;
:SYST:BEEP:STAT OFF;
:DISP:ENAB 0;
:SENS:REM ON;
:SENS:CURR:NPLC 0.01;
:SENS:VOLT:NPLC 0.01;
:SOUR:CURR:RANG:AUTO OFF;
:SOUR:VOLT:RANG:AUTO OFF;
:SOUR:WAIT:AUTO OFF;
:SOUR:WAIT OFF;
:SENSE:VOLT:RANG:AUTO OFF;
:SENSE:CURR:RANG:AUTO OFF;
:SENSE:WAIT:AUTO OFF;
:SENSE:WAIT OFF;
:FORM REAL,32;
:FORM:BORD NORM;
'Preset the SMU configuration to speed up the first iteration of the test
:SENS:VOLT:PROT 2.000000;
:SENS:VOLT:RANG 2.000000;
:SOUR:CURR:RANG 1.000000;
:SOUR:FUNC:MODE CURR;
:OUTP ON;
' Start looping the commands here
'============================
:SENS:VOLT:PROT 2.000000;
:SENS:VOLT:RANG 2.000000;
:SOUR:CURR:RANG 1.000000;
:SOUR:FUNC:MODE CURR;
:TRIG:ACQ:DEL 0.000100;
:SOUR:CURR:TRIG 1.000000;
:SENS:FUNC:OFF:ALL;
:SENS:FUNC 'VOLT';
:FORM:ELEM:SENS VOLT;
:READ? ' Measure Vf
:SOUR:CURR:RANG -1.000000E-5;
:SENS:VOLT:PROT 200.000000;
:SENS:VOLT:RANG 200.000000;
:TRIG:ACQ:DEL 0.000600;
:SOUR:CURR:TRIG -1.000000E-5;
:READ? ' Measure Vr
:SOUR:VOLT:RANG -50.000000;
:SENS:CURR:PROT 0.000100;
:SENS:CURR:RANG 0.000100;
:SOUR:FUNC:MODE VOLT;
:TRIG:ACQ:DEL 0.000000;
:SOUR:VOLT:TRIG -50.000000;
:SENS:FUNC:OFF:ALL;
:SENS:FUNC 'CURR';
:FORM:ELEM:SENS CURR;
:READ? ' Measure Il
'============================
'End the loop here
:OUTP OFF;
:DISP:ENAB 1;
I ran the loop portion of the commands in a For loop 100 times and measured how long it took to run and found that the loop ran approximately 12 times per second. I read that program memory should speed up code execution by eliminating the bus transfers of the individual commands and because the commands would be "pre-compiled" so to speak so I thought maybe if I use that I can get it to go faster.
Looking through the manual and trying it out I found that I couldn't just throw the loop commands into a program memory because query commands are not supported so the :READ? commands would have to go. I changed the commands a little to support using the buffer and I would just retrieve the data at the end. Again my code was broken up into an initial setup portion and a portion I would loop.
My program memory code looks as follows:
*CLS;
*RST;
:PROG:DEL:ALL;
:SYST:BEEP:STAT OFF;
:DISP:ENAB 0;
:SENS:REM ON;
:SENS:CURR:NPLC 0.01;
:SENS:VOLT:NPLC 0.01;
:SOUR:CURR:RANG:AUTO OFF;
:SOUR:VOLT:RANG:AUTO OFF;
:SOUR:WAIT:AUTO OFF;
:SOUR:WAIT OFF;
:SENSE:VOLT:RANG:AUTO OFF;
:SENSE:CURR:RANG:AUTO OFF;
:SENSE:WAIT:AUTO OFF;
:SENSE:WAIT Off;
:FORM REAL,32;
:FORM:BORD NORM;
:FORM:ELEM:SENS VOLT,CURR;
:SENS:VOLT:PROT 2.000000;
:SENS:VOLT:RANG 2.000000;
:SOUR:CURR:RANG 1.000000;
:SOUR:FUNC:MODE CURR;
:TRAC:FEED:CONT NEV;
:TRAC:CLE;
:TRAC:POIN 30;
:TRAC:FEED SENS;
:TRAC:FEED:CONT NEXT;
:PROG:NAME "diodetest";
:PROG:DEF #0:SENS:VOLT:PROT 2.000000;
:PROG:APP #0
:PROG:APP #0:SENS:VOLT:RANG 2.000000;
:PROG:APP #0:SOUR:CURR:RANG 1.000000;
:PROG:APP #0:SOUR:FUNC:MODE CURR;
:PROG:APP #0:TRIG:ACQ:DEL 0.000100;
:PROG:APP #0:SOUR:CURR:TRIG 1.000000;
:PROG:APP #0:SENS:FUNC:OFF:ALL;
:PROG:APP #0:SENS:FUNC 'VOLT';
:PROG:APP #0:INIT;
:PROG:APP #0:SOUR:CURR:RANG -1.000000E-5;
:PROG:APP #0:SENS:VOLT:PROT 200.000000;
:PROG:APP #0:SENS:VOLT:RANG 200.000000;
:PROG:APP #0:TRIG:ACQ:DEL 0.000600;
:PROG:APP #0:SOUR:CURR:TRIG -1.000000E-5;
:PROG:APP #0:INIT;
:PROG:APP #0:SOUR:VOLT:RANG -50.000000;
:PROG:APP #0:SENS:CURR:PROT 0.000100;
:PROG:APP #0:SENS:CURR:RANG 0.000100;
:PROG:APP #0:SOUR:FUNC:MODE VOLT;
:PROG:APP #0:TRIG:ACQ:DEL 0.000000;
:PROG:APP #0:SOUR:VOLT:TRIG -50.000000;
:PROG:APP #0:SENS:FUNC:OFF:ALL;
:PROG:APP #0:SENS:FUNC 'CURR';
:PROG:APP #0:INIT;
:OUTP ON;
' Start looping the code here
'=======================
:PROG:EXEC;
*OPC?
'=======================
' End looping the code here
:TRAC:DATA?
:OUTP OFF;
:DISP:ENAB 1;
Once again I ran the loop 100 times and timed it and this time I found the loop only ran about 8 times per second instead of 12. It was actually slower!
My questions are the following:
- What am I doing wrong? Why is it slower?
- Is there a way to get the program memory to run in a loop and maybe make it go faster?
- In both versions of the test my SMU clicks a lot as if the interlock relays or the output relays are clicking on and off a lot, but my interlock is engaged the whole time. I suspected it might be the switch between the high voltage and low voltage ranges, but when I re-ran the test being sure to use only the 20V range or lower it still made the clicks. What are these clicks?
- Is there anything else I can do to make this test run faster?