100 REM COMLIN.BAS Copyright 1990 by Russell Kincaid 110 REM Kincaid Engineering, Savage Road, Milford, NH 03055 120 REM VERSION 1.0 WRITTEN 10/20/1989 122 REM VERSION 2.0 WRITTEN 1/6/1990 124 REM VERSION 3.0 WRITTEN 1/12/1990 REVISED 9 FEB 1990 130 CLS 140 PRINT "**********************************************************************" 150 PRINT" THIS PROGRAM GENERATES A SPICE DECK THAT DESCRIBES A" 160 PRINT" CURRENT MODE OP AMP CIRCUIT" 170 PRINT" Written by: Russ Kincaid, Milford, NH 03055" 180 PRINT:PRINT" This is shareware, see the file README.DOC" 190 PRINT"**********************************************************************" 200 PRINT:PRINT 210 ISD=1E-12 : P=3.14162 : R3 = 1 : V=.02585 : NN$=" 2 " : NI$=" 1 " 220 PRINT:PRINT 230 C2=10 : REM PF STARTING VALUE IS ARBITRARY 240 INPUT"INPUT BIAS CURRENT (NON-INV INPUT):";IB2 250 INPUT"INPUT BIAS CURRENT (INVERTING INPUT):";IB1 260 INPUT"INPUT OFFSET VOLTAGE :";VOFF 270 INPUT"INVERTING TRANSIMPEDANCE GAIN IN DB (1) OR OHMS (2) ";Y 280 IF Y=1 THEN 300 290 INPUT"DC V/I GAIN IN OHMS ";A: ADB=8.686*LOG(A) : GOTO 310 300 INPUT"DC V/I GAIN IN DB :";ADB : A=EXP(ADB/8.686) 310 INPUT"FIRST CUT FREQUENCY (1) OR ZERO dB FREQUENCY (2) ";Y 320 IF Y>2 OR Y<1 THEN PRINT" ONE OR TWO, DUMMY!":PRINT:GOTO 310 330 ON Y GOTO 340, 360 340 INPUT"FIRST CUT FREQUENCY (HZ)";F3DB 350 W0=2*P*F3DB*(10^(ADB/20))/1000000! : GOTO 380 360 INPUT"ZERO DB FREQUENCY AS IF SINGLE CUT (IN mHZ)";F0 370 F3DB=F0/(10^(ADB/20))*1000000! : W0=2*P*F0 380 W3DB=2*P*F3DB 390 R2=1/W3DB/C2*1E+09 : REM R2 IN KOHMS 392 INPUT"PEAK FREQUENCY (MHZ) OF NON-INVERTING GAIN (OR 3DB PT IF NO PEAK)";FP 394 INPUT"EXCESS OF NON-INVERTING GAIN OVER INVERTING GAIN (DB)";DB 395 F1=1.41*FP/(10^3): AC1=1/2/P/F1/5*.000001 : REM PF 396 IF DB>.8 THEN SLP=.00032:INTC=14000! 397 IF DB<.8 THEN SLP=.000156:INTC=16830! 398 AC2=AC1/(INTC-DB/SLP) 400 INPUT"INVERTING INPUT RESISTANCE IN OHMS ( 50 NOMINAL):";RIN 404 INPUT"INVERTING INPUT CAPACITANCE IN PF: ";CI 410 INPUT"NON-INVERTING INPUT CAPACITANCE IN PF " ;CIN$ 420 INPUT"NON-INVERTING INPUT RESISTANCE IN OHMS ";RIN2 430 PRINT"IF THE INPUT COMMON MODE RANGE IS VCC-X TO VEE+Y, WHAT IS:" 440 INPUT" X = ";VCMP: VCMP=VCMP+.5 450 INPUT" Y = ";VCMN: VCMN=VCMN+.5 455 PRINT"IF PHASE AT LOW FREQ. IS 180 DEGREES," 460 PRINT:PRINT"GIVE HIGHEST FREQUENCY AND PHASE DATA POINT:" 470 INPUT"PHASE (DEGREES):";PT:PT=P-(P/180*PT) : PRINT PT*180/P;"=PT" 480 INPUT"FREQUENCY (mHZ):";F2:W2=2*P*F2 490 INPUT"LOAD RESISTANCE FOR PHASE MEASUREMENT:";RL 494 INPUT "POWER FROM (1) MAX CURRENT (2) POWER";C 496 ON C GOTO 498,500 498 INPUT"MAX SUPPLY CURRENT (AMPS)";C:INPUT" AT VCC=";VCC:INPUT" AT VEE=";VEE 499 PD=C*(VCC-VEE):GOTO 520 500 INPUT"STANDBY POWER DISSAPATION :";PD 510 PRINT " AT VCC = ";:INPUT VCC : PRINT" AT VEE = ";:INPUT VEE 520 INPUT"COMMON-MODE REJECTION RATIO IN DB :";CM 530 ECM=1/EXP((CM)/8.686) 540 INPUT"OUTPUT RESISTANCE AT LOW FREQUENCY :";ROUT 550 INPUT"OUTPUT INDUCTANCE (nH):";LO:LO$=STR$(LO) 560 PRINT:PRINT"IF THE MAX OUTPUT SWING IS VCC-X TO VEE+Y, WHAT ARE:" 570 INPUT" X = ";VOLP : VOLP=VOLP+.5 580 INPUT" Y = ";VOLN : VOLN=VOLN+.5 584 INPUT"OUTPUT DELAY WHEN OVERDRIVEN (nS) (ZERO FOR NONE):";TT :TT=TT/2 590 INPUT"OUTPUT CURRENT LIMIT IN AMPS :";ISC 600 INPUT"WILL YOU MODEL THE NOISE PERFORMANCE";NP$ 604 INPUT"INTERNAL FEEDBACK RESISTOR, OHMS (ZERO FOR NONE):";RF 610 REM ****** END OF OP AMP PARAMETER INPUT ****** 620 F2G=100: N1$="12":N2$="13" : ISE=1E-14 : RB1=1000 630 IC2=IB1 670 GAIN=A/R2/1000 690 ILIM=ISC/100 700 F3I0=PD/(VCC-VEE)-.001 710 PLO=ATN(W2*LO/1000/RL) : PC2=ATN(R2*.001*W2*C2) 720 PC3=PT-PC2-PLO 730 C3= TAN(PC3/2)/R3/W2*1000000! : REM C3 IN PF & C4=C3/10 740 INPUT"WHAT WILL YOU NAME THIS MODEL : ";SUBNAM$ 750 A1=ASC(LEFT$(SUBNAM$,1)) 760 IF A1<65 OR A1 > 122 THEN PRINT"NAME MUST BEGIN WITH A LETTER":GOTO 740 770 NAM$=SUBNAM$+".MDL" 780 OPEN NAM$ FOR OUTPUT AS #1 790 PRINT#1,"" 800 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 4 5 " 810 PRINT#1,"*** -IN +IN OUT V+ V- *** " 830 PRINT#1,".MODEL GD D RS=1" 840 PRINT#1,".MODEL DLIM D IS=1E-16" 841 PRINT#1,".MODEL DF D IS=1E-16 N=1.2" 843 IF TT=0 THEN K$="0":GOTO 845 844 K=TT:GOSUB 1340 845 PRINT#1,".MODEL DOL D TT=";K$+"NS" 850 PRINT#1," ECM 11 1 10 0 ";ECM 852 IF RF=0 THEN 856 854 PRINT#1," RF 15 1 ";RF 856 PRINT#1,".SUBCKT AMP 2 5 6 12" 858 PRINT#1,"CIN 2 0 ";CIN$+"PF" 860 PRINT#1,"RIN 2 0 ";STR$(RIN2/1000)+"K" 864 PRINT#1,"IBIAS 2 0 ";IB2 868 PRINT#1,"EA 3 0 2 5 1000" 870 PRINT#1,"R1 3 4 5" 874 PRINT#1,"R2 4 5 50" 876 PRINT#1,"C1 4 0 ";STR$(AC1) 878 PRINT#1,"C2 5 0 ";STR$(AC2) 879 PRINT#1,"D1 4 6 GD" 880 PRINT#1,"D2 12 4 GD" 882 PRINT#1,".ENDS AMP" 884 PRINT#1,"XAMP 2 10 6 12 AMP" 886 PRINT#1,"VOFF 9 10 ";VOFF 890 PRINT#1,"RI 9 11 ";RIN 900 PRINT#1,"INVI 1 0 ";IB1 904 PRINT#1,"CI 1 0 ";STR$(CI)+"PF" 910 PRINT#1,"D3 9 6 GD" 920 PRINT#1,"D4 12 9 GD" 930 PRINT#1,"VCMP 4 6 ";VCMP 940 PRINT#1,"VCMN 12 5 ";VCMN 1030 PRINT#1," FA 8 0 VOFF ";GAIN 1040 K=R2:GOSUB 1340 1050 REM R2 SHOULD NOT BE LESS THAN 1K 1060 PRINT#1," R2 8 0 ";K$+"K" 1070 PRINT#1," C2 8 0 ";STR$(C2)+"PF" 1080 PRINT#1," GB 0 29 8 0 1" 1090 K=C3:GOSUB 1340 1100 PRINT#1," R3 0 29 1" 1110 PRINT#1," C3 0 29 ";K$+"PF" 1112 PRINT#1," R4 29 40 10" 1113 K=C3/10:GOSUB 1340 1114 PRINT#1," C4 40 0 ";K$+"PF" 1120 PRINT#1," D7 13 40 DLIM" 1130 PRINT#1," D8 40 24 DLIM" 1140 PRINT#1," ILIM 24 13 ";ILIM 1150 PRINT#1," D5 8 32 DOL" 1160 PRINT#1," D9 13 18 DF" 1170 PRINT#1," D10 14 24 DF" 1180 PRINT#1," D6 16 8 DOL" 1190 PRINT#1," V3 18 17 0" 1200 PRINT#1," V4 17 14 0" 1210 PRINT#1," F3 4 17 V3 ";F3I0;" 100" 1220 PRINT#1," F4 17 5 V4 ";F3I0;" 100" 1230 IF LO=0 THEN 1260 1240 PRINT#1," RO 17 15 ";ROUT 1250 PRINT#1," LO 15 3 ";LO$+"NH":GOTO 1270 1260 PRINT#1," RO 17 3 ";ROUT 1270 PRINT#1," VOLP 4 32 ";VOLP 1280 PRINT#1," VOLN 16 5 ";VOLN 1290 PRINT#1,".ENDS ";SUBNAM$ 1292 PRINT#1,"*********" 1300 CLOSE#1 1310 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE FILE ";NAM$ 1320 GOTO 2230 1330 REM ROUNDOFF ROUTINE 1340 IF K=0 THEN RETURN 1350 IF ABS(K)<1 THEN 1390 1360 FOR T=0 TO 16 :K2=K/10^T 1370 IF ABS(K2)<10 THEN 1420 1380 NEXT T : PRINT K;" IS TOO LARGE":STOP 1390 FOR T=0 TO 16 : K2=K*10^T 1400 IF ABS(K2)>1 THEN 1430 1410 NEXT T : PRINT K;" IS TOO SMALL": STOP 1420 K=10^T*INT(K2*1000+.5)/1000 : GOTO 1440 1430 K=INT(K2*1000+.5)/1000/10^T 1440 IF K<0 THEN K$=STR$(K):GOTO 1460 1450 K$=RIGHT$(STR$(K),LEN(STR$(K))-1) 1460 RETURN 1465 REM THIS ROUTINE GENERATES SUBCIRCUITS FOR NOISE SOURCES 1470 REM PINK.BAS A PROGRAM TO MODEL NOISE THAT FALLS AT LESS THAN 20DB/DECADE 1472 REM REVISION #4, 3/19/90 1474 DIM R$(20),L$(20) 1476 DATA R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R20 1478 FOR J=0 TO 20:READ R$(J):NEXT J 1480 DATA L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,L15,L16,L17,L18,L19,L20 1482 FOR J=0 TO 20:READ L$(J):NEXT J 1484 A=0:K=0: KTB=4*1.38E-23*300: PI=3.14162 1486 REM PROGRAM TO COMPUTE VOLTAGE AND CURRENT NOISE SOURCE VALUES FROM 1488 REM DBM DATA GIVEN FOR A PARTICULAR CIRCUIT. 1490 INPUT "MAX NOISE DATA IN DBM(1) OR NV/RT HZ (2):";DBM 1491 ON DBM GOTO 1492,1495 1492 INPUT"MAX NOISE DATA IN DBM:";DBM 1493 NV1=SQR(.05*10^(DBM/10)) 1494 PRINT "NV1=";NV1 : PRINT:GOTO 1496 1495 INPUT"MAX NOISE DATA IN NV/RT HZ:";NV1:NV1=NV1*1E-9 1496 INPUT"GAIN RESISTOR VALUE:";RG 1498 INPUT"TYPICAL VOLTAGE NOISE AT NON-INVERTING INPUT (NV/RT HZ):";VN 1500 VN=VN*1E-09 1502 INPUT"TYPICAL CURRENT NOISE AT INVERTING INPUT (PA/RT HZ):";PA 1504 PA=PA*1E-12 1506 F=1.01 : P0=PA 1508 PA=PA*F : VN=VN*F 1510 VN2=SQR((PA*F*RG)^2 + (VN*F)^2) 1512 PRINT"VN2=";VN2 1514 IF VN210 THEN 1542 1540 GOTO 1544 1542 NEXT J 1544 FD=.4343*LOG(K) 1546 FOR Q=1 TO 3 1548 IF Q=1 THEN V=VN/1000 :REM EVERYTHING IS IN PICO UNITS, MULT BY 1000 LATER 1550 IF Q=2 THEN V=PN 1552 IF Q=3 THEN V=PA 1554 DB0=8.686*LOG(V) 1556 FOR K=J TO 0 STEP -1 : DB=DBD*K + FD*DBD + DB0 : T=J-K 1558 N(T)=EXP(DB/8.686) 1560 NEXT K : N(J+1)=V 1562 FOR X=0 TO J+1:PRINT X,"NV=";N(X):NEXT X 1564 IF A=0 THEN KR=J+1: A=1 1566 R(J+1)=KTB/N(J+1)^2 1568 FOR P=J TO 0 STEP -1 : W=2*PI*10^P : N2=N(J+1)^2 1570 FOR T=J TO P+1 STEP -1: N2=N2+N(T)^2:NEXT T 1572 R(P)= KTB/(N(P)^2-N2) : L(P)= R(P)/W 1574 NEXT P 1576 IF Q=1 THEN GOSUB 1586 1578 IF Q=2 THEN GOSUB 1608 1580 IF Q=3 THEN NME$="PINK2":GOSUB 1626 1582 NEXT Q 1584 RETURN 1586 NME$="PINK1" 1590 PRINT#1,".SUBCKT ";NME$+" 1 2 3" 1592 PRINT#1,R$(J+1);" 0 4 ";R(J+1) 1594 FOR P=0 TO J 1596 PRINT#1,R$(P);" 4 ";6+P;" ";R(P) 1598 PRINT#1,L$(P);6+P;" 0 ";L(P) 1600 NEXT P 1602 PRINT#1,"VV 4 0 0" 1604 PRINT#1,"H1 1 2 VV 1E3" 1606 RETURN 1608 PRINT#1,R$(KR+1);" 0 5 ";R(J+1) 1610 FOR P=0 TO J 1612 PRINT#1,R$(P+KR+2);" 5 ";6+P+KR;" ";R(P) 1614 PRINT#1,L$(P+KR+2);6+P+KR;" 0 ";L(P) 1616 NEXT P 1618 PRINT#1,"VI 5 0 0 " 1620 PRINT#1,"F1 2 3 VI 1" 1622 PRINT#1,".ENDS ";NME$ 1624 RETURN 1626 PRINT#1,".SUBCKT ";NME$+" 2 3" 1628 PRINT#1,R$(KR+1);" 0 5 ";R(J+1) 1630 FOR P=0 TO J 1632 PRINT#1,R$(P+KR+2);" 5 ";6+P+KR;" ";R(P) 1634 PRINT#1,L$(P+KR+2);6+P+KR;" 0 ";L(P) 1636 NEXT P 1638 PRINT#1,"VI 5 0 0 " 1640 PRINT#1,"F1 2 3 VI 1" 1642 PRINT#1,".ENDS ";NME$ 1644 RETURN 2222 REM ********** THE SIMPLE MODEL *************** 2230 NAM$=SUBNAM$+".SMP" 2240 OPEN NAM$ FOR OUTPUT AS #1 2250 PRINT#1,"" 2260 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 " 2270 PRINT#1,"*** -IN +IN OUT *** " 2280 IF RF=0 THEN 2350 2290 PRINT#1,"RF 17 1 ";RF 2350 PRINT#1,"CIN 2 0 ";CIN$+"PF" 2352 PRINT#1,"RIN 2 0 ";STR$(RIN2/1000)+"K" 2354 PRINT#1,"IBIAS 2 0 ";IB2 2356 PRINT#1,"ENI 9 10 2 0 1" 2380 PRINT#1,"VOFF 10 0 ";VOFF 2390 PRINT#1,"RI 9 1 ";RIN 2400 PRINT#1,"INVI 1 0 ";IB1 2404 PRINT#1,"CI 1 0 ";STR$(CI)+"PF" 2510 PRINT#1," FA 8 0 VOFF ";GAIN 2520 K=R2:GOSUB 1340 2530 REM R2 SHOULD NOT BE LESS THAN 1K 2540 PRINT#1," R2 8 0 ";K$+"K" 2560 PRINT#1," C2 8 0 ";STR$(C2)+"PF" 2570 PRINT#1," GB 0 29 8 0 1" 2580 K=C3:GOSUB 1340 2590 PRINT#1," R3 0 29 1" 2600 PRINT#1," C3 0 29 ";K$+"PF" 2602 PRINT#1," R4 29 40 10" 2603 K=C3/10:GOSUB 1340 2604 PRINT#1," C4 40 0 ";K$+"PF" 2720 IF LO=0 THEN 2764 2740 PRINT#1," LO 3 17 ";LO$+"NH" 2750 PRINT#1," RO 17 40 ";ROUT-11 :GOTO 2780 2764 PRINT#1,"RO 40 3 ";ROUT-11 2780 PRINT#1,".ENDS ";SUBNAM$ 2782 PRINT#1,"**********" 2790 CLOSE#1 2800 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE FILE ";NAM$ 2802 REM ********* NOISE MODEL ************* 2804 IF LEFT$(NP$,1)="N" OR LEFT$(NP$,1)="n" THEN 3360 2810 NAM$=SUBNAM$+".NSE" 2820 OPEN NAM$ FOR OUTPUT AS #1 2830 PRINT#1,"" 2840 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 " 2850 PRINT#1,"*** -IN +IN OUT *** " 2860 GOSUB 1470 2862 PRINT#1,"XNON 2 25 0 PINK1" 2864 PRINT#1,"XINV 1 0 PINK2" 2865 IF RF=0 THEN 2882 2870 PRINT#1," RF 17 1 ";RF 2882 PRINT#1,"CIN 2 0 ";CIN$+"PF" 2883 K=1/RIN2 : GOSUB 1340 2884 PRINT#1,"GRIN 2 0 2 0 ";K$ 2886 PRINT#1,"IBIAS 2 0 ";IB2 2890 PRINT#1,"ENI 9 10 2 0 1" 2904 PRINT#1,"VOFF 10 0 ";VOFF 2905 K=1/RIN:GOSUB 1340 2906 PRINT#1,"GRI 9 1 9 1 ";K$ 2908 PRINT#1,"INVI 1 0 ";IB1 2909 PRINT#1,"CI 1 0 ";STR$(CI)+"PF" 3090 PRINT#1," FA 8 0 VOFF ";GAIN 3100 K=R2:GOSUB 1340 3110 REM R2 SHOULD NOT BE LESS THAN 1K 3111 IF R2>1 THEN 3120 3112 PRINT" ERROR - R2 IS LESS THAN 1K": PRINT 3120 PRINT#1," R2 8 0 ";K$+"K" 3130 PRINT#1," C2 8 0 ";STR$(C2)+"PF" 3140 PRINT#1," GB 0 29 8 0 1" 3150 K=C3:GOSUB 1340 3160 PRINT#1," R3 0 29 1" 3170 PRINT#1," C3 0 29 ";K$+"PF" 3172 PRINT#1," R4 29 40 10" 3173 K=C3/10:GOSUB 1340 3174 PRINT#1," C4 40 0 ";K$+"PF" 3290 IF LO=0 THEN 3330 3310 PRINT#1," LO 3 17 ";LO$+"NH" 3320 PRINT#1," RO 17 40 ";ROUT-11 : GOTO 3350 3330 PRINT#1," RO 40 3 ";ROUT-11 3350 PRINT#1,".ENDS ";SUBNAM$ 3352 PRINT#1,"**********" 3360 CLOSE#1 3370 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE FILE ";NAM$ 3380 SYSTEM 9999 END