"Prober03-ibw.txt"의 두 판 사이의 차이

(새 문서: 프루버 <pre> 10 !프루버를 수동으로 조작할 때 자동으로 측정하는 프로그램 20 !hp 3478A DMM 30 !hp 4284A LCR 40 !Keithley 2420 SourceMeter...)
 
 
1번째 줄: 1번째 줄:
 
[[프루버]]
 
[[프루버]]
 
<pre>
 
<pre>
10    !프루버를 수동으로 조작할 때 자동으로 측정하는 프로그램
+
10    !프루버를 수동으로 조작해 다이 좌표를 추출함.
 +
11    !  inst=4는 V-I커브 데이터(nop)를 샘플수(Nos)만큼 추출함.
 
20    !hp 3478A DMM
 
20    !hp 3478A DMM
 
30    !hp 4284A LCR
 
30    !hp 4284A LCR
 
40    !Keithley 2420 SourceMeter
 
40    !Keithley 2420 SourceMeter
50    DIM Infilename$[20],Outfilename$[20],Dhms$[8]
+
50     OPTION BASE 1
60     INTEGER I,J,X,X_pre,Y,Y_pre,Zup,Len
+
60     DIM Infilename$[20],Outfilename$[20],Dhms$[8]
70     DIM Tmp$[1]
+
70     INTEGER I,J,X,X_pre,Y,Y_pre,Zup,Len,Nop,Nos
80     Time$=TIME$(TIMEDATE)
+
80     DIM Tmp$[1]
90    Date$=DATE$(TIMEDATE)
+
90     Time$=TIME$(TIMEDATE)
100   Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
+
100    Date$=DATE$(TIMEDATE)
110   Outfilename$=Dhms$&".txt"
+
110   Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
120   CREATE Outfilename$,1
+
120   Outfilename$=Dhms$&".txt"
130   ASSIGN @Outfile TO Outfilename$;FORMAT ON
+
130   CREATE Outfilename$,1
140   ASSIGN @Probe TO 402
+
140   ASSIGN @Outfile TO Outfilename$;FORMAT ON
150   Inst=3
+
150   ASSIGN @Probe TO 402
160   Zup=220      ! 척 Z UP일 때 높이
+
160   Inst=4
170   SELECT Inst
+
170    Nop=101      !측정 지점수
180   CASE 1  !3478A
+
180    Nos=100    !측정 샘플 수량
190     ASSIGN @Dmm TO 427
+
190   Zup=220      ! 척 Z UP일 때 높이
200     OUTPUT @Outfile;"No.,Time,X,Y,R"
+
200   SELECT Inst
210   CASE 2  !4284A
+
210   CASE 1  !3478A
220     ASSIGN @Lcr TO 417
+
220     ASSIGN @Dmm TO 427
230     OUTPUT @Lcr;"TRIG:SOUR BUS"
+
230     OUTPUT @Outfile;"No.,Time,X,Y,R"
240     OUTPUT @Lcr;"ABORT;:INIT"
+
240   CASE 2  !4284A
250     OUTPUT @Outfile;"No.,Time,X,Y,A-value,B-value"
+
250     ASSIGN @Lcr TO 417
260   CASE 3  !2420
+
260     OUTPUT @Lcr;"TRIG:SOUR BUS"
270     ASSIGN @Sm TO 424
+
270     OUTPUT @Lcr;"ABORT;:INIT"
280     OUTPUT @Sm;"FORM:ELEM VOLT, CURR"
+
280     OUTPUT @Outfile;"No.,Time,X,Y,A-value,B-value"
290     OUTPUT @Sm;"SOURCE:CLEAR:AUTO ON"
+
290   CASE 3  !2420 single trigger 측정
300     OUTPUT @Outfile;"No.,Time,X,Y,Volt,Curr"
+
300     ASSIGN @Sm TO 424
310   END SELECT  
+
310     OUTPUT @Sm;"FORM:ELEM VOLT, CURR"
320   I=0
+
320     OUTPUT @Sm;"SOURCE:CLEAR:AUTO ON"
330   T0=TIMEDATE
+
330     OUTPUT @Outfile;"No.,Time,X,Y,Volt,Curr"
340   LOOP
+
340    CASE 4  !2420 log sweep 측정
350     ! 척 UP될때까지 기다린다.
+
350      ASSIGN @Sm TO 424
360     LOOP
+
360      OUTPUT @Sm;"FORM:ELEM VOLT, CURR"
370       OUTPUT @Probe;"?ZO"    !현재 척높이는? Znnnn
+
370      OUTPUT @Sm;"SOURCE:CLEAR:AUTO ON"
380       WAIT .1
+
380      ALLOCATE D(Nos,Nop),D0(Nop,2)    !샘플 100개, Nop, 전압/전류
390       ENTER @Probe;Res_z$
+
390      OUTPUT @Sm;"SOUR:FUNC CURR"
400       Len=LEN(Res_z$)
+
400      OUTPUT @Sm;"SOUR:CURR:MODE SWE"
410       Zheight=VAL(Res_z$[2,Len])        ![start;length] [start,stop]
+
410      OUTPUT @Sm;"SOUR:SWE:SPAC LOG"
420       Zheight=INT(Zheight/10)    ! 0.1단위이므로
+
420      OUTPUT @Sm;"SOUR:CURR:STAR .0001"  !-10mA 부터
430     EXIT IF Zheight=Zup
+
430      OUTPUT @Sm;"SOUR:CURR:STOP 0.03"    !+10mA 까지
440     END LOOP  
+
440      OUTPUT @Sm;"SOUR:SWE:POIN ";Nop    ! 101 번 측정
450     I=I+1
+
450      OUTPUT @Sm;"SENS:FUNC ""VOLT"""
460     ! 이 때 다이좌표를 읽는다.
+
460      OUTPUT @Sm;"SENS:VOLT:NPLC 0.01"
470     GOSUB Read_xy
+
470      OUTPUT @Sm;"TRIG:COUN ";Nop
480     T1=TIMEDATE-T0
+
480      OUTPUT @Sm;"*OPC?"
490     SELECT Inst
+
490      ENTER @Sm;Tmp      !앞 명령이 다 수행될 때까지 기다려
500     CASE 1  !3478A
+
500   END SELECT  
510       ENTER @Dmm;R
+
510   I=0
520       PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"R=";R
+
520   T0=TIMEDATE
530       OUTPUT @Outfile;I,T1,X,Y,R
+
530   LOOP
540     CASE 2  !4284A
+
540     ! 척 UP될때까지 기다린다.
550       OUTPUT @Lcr;"TRIGGER:IMMEDIATE"
+
550     LOOP
560       OUTPUT @Lcr;"FETCH?"
+
560       OUTPUT @Probe;"?ZO"    !현재 척높이는? Znnnn
570       ENTER @Lcr;A,B,C
+
570       WAIT .1
580       PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"A=";A,"B=";B
+
580       ENTER @Probe;Res_z$
590       OUTPUT @Outfile;I,T1,X,Y,A,B
+
590       Len=LEN(Res_z$)
600     CASE 3  !2420
+
600       Zheight=VAL(Res_z$[2,Len])        ![start;length] [start,stop]
610       OUTPUT @Sm;"READ?"
+
610       Zheight=INT(Zheight/10)    ! 0.1단위이므로
620       ENTER @Sm;Volt,Curr
+
620     EXIT IF Zheight=Zup
630       PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"V=";Volt,"i=";Curr
+
630     END LOOP  
640       OUTPUT @Outfile;I,T1,X,Y,Volt,Curr
+
640     I=I+1
650     END SELECT  
+
650     ! 이 때 다이좌표를 읽는다.
660   ! 다음위치 이동 때까지 대기한다.
+
660     GOSUB Read_xy
670     X_pre=X!현재 위치 기억
+
670     T1=TIMEDATE-T0
680     Y_pre=Y
+
680     SELECT Inst
690     LOOP
+
690     CASE 1  !3478A
700       GOSUB Read_xy
+
700       ENTER @Dmm;R
710     EXIT IF X<>X_pre
+
710       PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"R=";R
720     EXIT IF Y<>Y_pre
+
720       OUTPUT @Outfile;I,T1,X,Y,R
730     END LOOP  
+
730     CASE 2  !4284A
740   END LOOP  
+
740       OUTPUT @Lcr;"TRIGGER:IMMEDIATE"
750    STOP
+
750       OUTPUT @Lcr;"FETCH?"
760 Read_xy:   !!!
+
760       ENTER @Lcr;A,B,C
770    LOOP
+
770       PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"A=";A,"B=";B
780      OUTPUT @Probe;"?P"        !현재 다이좌표는?
+
780       OUTPUT @Outfile;I,T1,X,Y,A,B
790      ENTER @Probe;Res_xy$        !Xn...Yn...
+
790     CASE 3  !2420
800    EXIT IF POS(Res_xy$,"X")=1
+
800       OUTPUT @Sm;"READ?"
810    END LOOP  
+
810       ENTER @Sm;Volt,Curr
820    Len=LEN(Res_xy$)
+
820       PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"V=";Volt,"i=";Curr
830          ! POS(A$,B$) A$에서 B$ 위치. 0 이면 없다.
+
830       OUTPUT @Outfile;I,T1,X,Y,Volt,Curr
840    X=VAL(Res_xy$[2,POS(Res_xy$,"Y")-1])          !두번째부터 Y등장 바로앞까지
+
840      CASE 4
850    Y=VAL(Res_xy$[POS(Res_xy$,"Y")+1,Len])        !Y등장 다음부터 len까지
+
850        OUTPUT @Sm;"READ?"                  !Trigger sweep and acquire data.
860    RETURN
+
860        ENTER @Sm;D0(*)
870    END
+
870        FOR J=1 TO Nop
 +
880          D(I,J)=D0(J,1)        !측정된 전압값을 전체 배열에 입력한다.
 +
890        NEXT J
 +
900     END SELECT  
 +
910   ! 다음위치 이동 때까지 대기한다.
 +
920     X_pre=X!현재 위치 기억
 +
930     Y_pre=Y
 +
940     LOOP
 +
950       GOSUB Read_xy
 +
960     EXIT IF X<>X_pre
 +
970     EXIT IF Y<>Y_pre
 +
980     END LOOP  
 +
990   EXIT IF I=Nos      !현재 샘플수가 지정된 샘플수량이면 루프 탈출
 +
1000  END LOOP  
 +
1010  SELECT Inst
 +
1020  CASE 4
 +
1030    FOR I=1 TO Nop
 +
1040      OUTPUT @Outfile;I,D0(I,2);","; !마지막 측정된 Curr를 출력한다.
 +
1050      FOR J=1 TO Nos
 +
1060        OUTPUT @Outfile;D(J,I);","; !해당 전류에서 측정된 모든 샘플의 전압값을 출력한다.
 +
1070      NEXT J
 +
1080      OUTPUT @Outfile;" "
 +
1090    NEXT I
 +
1100  END SELECT
 +
1110  STOP
 +
1120 Read_xy: !!!
 +
1130  LOOP
 +
1140    OUTPUT @Probe;"?P"        !현재 다이좌표는?
 +
1150    ENTER @Probe;Res_xy$        !Xn...Yn...
 +
1160  EXIT IF POS(Res_xy$,"X")=1
 +
1170  END LOOP  
 +
1180  Len=LEN(Res_xy$)
 +
1190          ! POS(A$,B$) A$에서 B$ 위치. 0 이면 없다.
 +
1200  X=VAL(Res_xy$[2,POS(Res_xy$,"Y")-1])          !두번째부터 Y등장 바로앞까지
 +
1210  Y=VAL(Res_xy$[POS(Res_xy$,"Y")+1,Len])        !Y등장 다음부터 len까지
 +
1220  RETURN
 +
1230  END
 
</pre>
 
</pre>

2020년 5월 23일 (토) 13:51 기준 최신판

프루버

10     !프루버를 수동으로 조작해 다이 좌표를 추출함.
11     !   inst=4는 V-I커브 데이터(nop)를 샘플수(Nos)만큼 추출함.
20     !hp 3478A DMM
30     !hp 4284A LCR
40     !Keithley 2420 SourceMeter
50     OPTION BASE 1
60     DIM Infilename$[20],Outfilename$[20],Dhms$[8]
70     INTEGER I,J,X,X_pre,Y,Y_pre,Zup,Len,Nop,Nos
80     DIM Tmp$[1]
90     Time$=TIME$(TIMEDATE)
100    Date$=DATE$(TIMEDATE)
110    Dhms$=Date$[1;2]&Time$[1;2]&Time$[4;2]&Time$[7;2]
120    Outfilename$=Dhms$&".txt"
130    CREATE Outfilename$,1
140    ASSIGN @Outfile TO Outfilename$;FORMAT ON
150    ASSIGN @Probe TO 402
160    Inst=4
170    Nop=101      !측정 지점수
180    Nos=100     !측정 샘플 수량
190    Zup=220      ! 척 Z UP일 때 높이
200    SELECT Inst
210    CASE 1  !3478A
220      ASSIGN @Dmm TO 427
230      OUTPUT @Outfile;"No.,Time,X,Y,R"
240    CASE 2  !4284A
250      ASSIGN @Lcr TO 417
260      OUTPUT @Lcr;"TRIG:SOUR BUS"
270      OUTPUT @Lcr;"ABORT;:INIT"
280      OUTPUT @Outfile;"No.,Time,X,Y,A-value,B-value"
290    CASE 3  !2420  single trigger 측정
300      ASSIGN @Sm TO 424
310      OUTPUT @Sm;"FORM:ELEM VOLT, CURR"
320      OUTPUT @Sm;"SOURCE:CLEAR:AUTO ON"
330      OUTPUT @Outfile;"No.,Time,X,Y,Volt,Curr"
340    CASE 4  !2420 log sweep 측정
350      ASSIGN @Sm TO 424
360      OUTPUT @Sm;"FORM:ELEM VOLT, CURR"
370      OUTPUT @Sm;"SOURCE:CLEAR:AUTO ON"
380      ALLOCATE D(Nos,Nop),D0(Nop,2)     !샘플 100개, Nop, 전압/전류
390      OUTPUT @Sm;"SOUR:FUNC CURR"
400      OUTPUT @Sm;"SOUR:CURR:MODE SWE"
410      OUTPUT @Sm;"SOUR:SWE:SPAC LOG"
420      OUTPUT @Sm;"SOUR:CURR:STAR .0001"   !-10mA 부터
430      OUTPUT @Sm;"SOUR:CURR:STOP 0.03"    !+10mA 까지
440      OUTPUT @Sm;"SOUR:SWE:POIN ";Nop     ! 101 번 측정
450      OUTPUT @Sm;"SENS:FUNC ""VOLT"""
460      OUTPUT @Sm;"SENS:VOLT:NPLC 0.01"
470      OUTPUT @Sm;"TRIG:COUN ";Nop
480      OUTPUT @Sm;"*OPC?"
490      ENTER @Sm;Tmp       !앞 명령이 다 수행될 때까지 기다려
500    END SELECT 
510    I=0
520    T0=TIMEDATE
530    LOOP
540      ! 척 UP될때까지 기다린다.
550      LOOP
560        OUTPUT @Probe;"?ZO"     !현재 척높이는? Znnnn
570        WAIT .1
580        ENTER @Probe;Res_z$
590        Len=LEN(Res_z$)
600        Zheight=VAL(Res_z$[2,Len])        ![start;length] [start,stop]
610        Zheight=INT(Zheight/10)    ! 0.1단위이므로
620      EXIT IF Zheight=Zup
630      END LOOP 
640      I=I+1
650      ! 이 때 다이좌표를 읽는다.
660      GOSUB Read_xy
670      T1=TIMEDATE-T0
680      SELECT Inst
690      CASE 1   !3478A
700        ENTER @Dmm;R
710        PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"R=";R
720        OUTPUT @Outfile;I,T1,X,Y,R
730      CASE 2   !4284A
740        OUTPUT @Lcr;"TRIGGER:IMMEDIATE"
750        OUTPUT @Lcr;"FETCH?"
760        ENTER @Lcr;A,B,C
770        PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"A=";A,"B=";B
780        OUTPUT @Outfile;I,T1,X,Y,A,B
790      CASE 3   !2420
800        OUTPUT @Sm;"READ?"
810        ENTER @Sm;Volt,Curr
820        PRINT I,INT(T1);"sec","X=";X,"Y=";Y,"V=";Volt,"i=";Curr
830        OUTPUT @Outfile;I,T1,X,Y,Volt,Curr
840      CASE 4
850        OUTPUT @Sm;"READ?"                  !Trigger sweep and acquire data.
860        ENTER @Sm;D0(*)
870        FOR J=1 TO Nop
880          D(I,J)=D0(J,1)        !측정된 전압값을 전체 배열에 입력한다.
890        NEXT J
900      END SELECT 
910    ! 다음위치 이동 때까지 대기한다.
920      X_pre=X!현재 위치 기억
930      Y_pre=Y
940      LOOP
950        GOSUB Read_xy
960      EXIT IF X<>X_pre
970      EXIT IF Y<>Y_pre
980      END LOOP 
990    EXIT IF I=Nos       !현재 샘플수가 지정된 샘플수량이면 루프 탈출
1000   END LOOP 
1010   SELECT Inst
1020   CASE 4
1030     FOR I=1 TO Nop
1040       OUTPUT @Outfile;I,D0(I,2);","; !마지막 측정된 Curr를 출력한다.
1050       FOR J=1 TO Nos
1060         OUTPUT @Outfile;D(J,I);","; !해당 전류에서 측정된 모든 샘플의 전압값을 출력한다.
1070       NEXT J
1080       OUTPUT @Outfile;" "
1090     NEXT I
1100   END SELECT 
1110   STOP
1120 Read_xy:  !!!
1130   LOOP
1140     OUTPUT @Probe;"?P"        !현재 다이좌표는?
1150     ENTER @Probe;Res_xy$        !Xn...Yn...
1160   EXIT IF POS(Res_xy$,"X")=1
1170   END LOOP 
1180   Len=LEN(Res_xy$)
1190          ! POS(A$,B$) A$에서 B$ 위치. 0 이면 없다.
1200   X=VAL(Res_xy$[2,POS(Res_xy$,"Y")-1])          !두번째부터 Y등장 바로앞까지
1210   Y=VAL(Res_xy$[POS(Res_xy$,"Y")+1,Len])        !Y등장 다음부터 len까지
1220   RETURN
1230   END