100 REM IFOA.BAS Copyright 1989 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 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 400 INPUT"INVERTING INPUT RESISTANCE IN OHMS ( 50 NOMINAL):";RIN 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 640 F1G=RIN2/(RIN*(F2G+1)+1) 650 I1=IB2*(F1G+1) 660 RB2=RIN*(F2G+1)-RB1/F1G 670 GAIN=A/R2/1000 680 VBE1=-IB2*RB1+VOFF 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)/R3/W2*1000000! : REM C3 IN PF 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 844 844 K=TT:GOSUB 1340 845 PRINT#1,".MODEL DOL D TT=";K$+"NS" 850 PRINT#1," ECM 10"+ NN$+"9 0 ";ECM 852 IF RF=0 THEN 860 854 PRINT#1," RF 3 1 ";RF 860 PRINT#1," RIN2"+ NN$+"0 ";RIN2 870 PRINT#1," C1 10 0 ";CIN$+"PF" 880 PRINT#1," GRB1 16 10 16 10 ";1/RB1 890 PRINT#1," D1 16 7 GD" 900 PRINT#1," VCMP 4 7 ";VCMP 910 PRINT#1," VBE1 16 9 ";VBE1 920 K=F1G: GOSUB 1340 930 PRINT#1," F1 0 9 VBE1 ";F1G 940 PRINT#1," I1 9 0 ";I1 950 K=1/RB2:GOSUB 1340 960 PRINT#1," GRB2 9 6 9 6 ";K$ 970 PRINT#1," VBE2"+NI$+"6 0" 980 PRINT#1," F2"+NI$+"11 POLY(1) VBE2 ";IB2;" 100" 990 PRINT#1," D2 11"+NI$+"GD" 1000 PRINT#1," VCMN 11 5 ";VCMN 1010 K=IC2:GOSUB 1340 1020 PRINT#1," IC2 11 0 ";K$ 1030 PRINT#1," FA 8 0 VCMN ";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" 1120 PRINT#1," D3 13 29 DLIM" 1130 PRINT#1," D4 29 24 DLIM" 1140 PRINT#1," ILIM 24 13 ";ILIM 1150 PRINT#1," D5 8 32 DOL" 1160 PRINT#1," D6 13 18 DF" 1170 PRINT#1," D7 14 24 DF" 1180 PRINT#1," D8 12 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 12 5 ";VOLN 1290 PRINT#1,".ENDS ";SUBNAM$ 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 1470 REM THIS ROUTINE GENERATES SUBCIRCUITS FOR NOISE SOURCES 1480 KTB=4*1.38E-23*300 : RVN=.01656 : RIN=16560 : NN$=" 25 " : NI$=" 21 " 1490 CLS 1500 PRINT"********************************************************" 1510 PRINT" NOISE CURRENT AND VOLTAGE CALCULATIONS" 1520 PRINT" AND SUBCIRCUIT GENERATION" 1560 REM PINK NOISE 1570 PRINT"This noise is constant below 1 hZ and rolls off at 20dB/decade to a" 1580 PRINT"corner frequency above which it remains constant.":PRINT 1585 PRINT" NON-INVERTING INPUT:" 1590 INPUT"VOLTAGE NOISE CORNER FREQUENCY IN HZ";FV 1600 INPUT"CURRENT NOISE CORNER FREQUENCY IN HZ";FI 1610 INPUT"CONSTANT NOISE LEVEL (NV/RT HZ):";NV 1620 INPUT"CONSTANT NOISE LEVEL (PA/RT HZ):";NI 1630 DECADE=.4343*LOG(FV): NXV=10^DECADE 1640 RXV=1E+18*KTB/NXV^2 : RXV = RXV*RVN/(RVN-RXV) 1650 LXV=RXV/2/P 1660 DECADE=.4343*LOG(FI):NXI=10^DECADE 1670 RXI=1E+24*KTB/NXI^2 : RXI=RXI*RIN/(RIN-RXI) 1680 LXI=RXI/2/P 1690 PRINT#1,".SUBCKT PINK 1 2 3 1700 PRINT#1,"* Noise generator, Fcv=";FV;", Fci=";FI;" 1710 PRINT#1,"* Vn=";NV;"nV/rt hZ, In=";NI;"pA/rt hZ" 1720 PRINT#1,"RVN 4 0 ";RVN 1730 PRINT#1,"RXV 0 5 ";RXV 1740 PRINT#1,"LXV 4 5 ";LXV 1750 PRINT#1,"VN 4 0 0" 1760 PRINT#1,"H1 1 2 VN ";NV 1770 PRINT#1,"RIN 6 0 ";RIN 1780 PRINT#1,"RXI 0 7 ";RXI 1790 PRINT#1,"LXI 6 7 ";LXI 1800 PRINT#1,"VI 6 0 0" 1810 PRINT#1,"F1 2 3 VI ";NI 1820 PRINT#1,".ENDS PINK" 2000 PRINT#1,"XNOISE 2 25 0 PINK" 2010 PRINT 2050 PRINT"This noise is constant below 1 hZ and rolls off at 20dB/decade to a" 2060 PRINT"corner frequency above which it remains constant.":PRINT 2070 INPUT"INVERTING INPUT CURRENT NOISE CORNER FREQUENCY IN HZ";FI 2075 IF FI=0 THEN RETURN 2080 INPUT"INVERTING INPUT CONSTANT NOISE LEVEL (PA/RT HZ):";NI 2082 DECADE=.4343*LOG(FI):NXI=10^DECADE 2084 RXI=1E+24*KTB/NXI^2 : RXI=RXI*RIN/(RIN-RXI) 2086 LXI=RXI/2/P 2088 PRINT#1,".SUBCKT PINV 1 2 " 2100 PRINT#1,"* Noise generator, Fci=";FI;" 2110 PRINT#1,"* Vn=";NV;"nV/rt hZ, In=";NI;"pA/rt hZ" 2112 PRINT#1,"RIN 6 0 ";RIN 2114 PRINT#1,"RXI 0 7 ";RXI 2116 PRINT#1,"LXI 6 7 ";LXI 2118 PRINT#1,"VI 6 0 0" 2120 PRINT#1,"F1 1 2 VI ";NI 2200 PRINT#1,".ENDS PINV" 2210 PRINT#1,"XVN 1 21 PINV" 2220 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 3 1 ";RF 2350 PRINT#1," C1 2 0 ";CIN$+"PF" 2360 PRINT#1," GRB1 16 2 16 2 ";1/RB1 2390 PRINT#1," VBE1 16 9 ";VBE1 2400 K=F1G: GOSUB 1340 2410 PRINT#1," F1 0 9 VBE1 ";F1G 2420 PRINT#1," I1 9 0 ";I1 2430 K=1/RB2:GOSUB 1340 2440 PRINT#1," GRB2 9 6 9 6 ";K$ 2450 PRINT#1," VBE2 1 6 0" 2460 PRINT#1," F2 1 11 POLY(1) VBE2 ";IB2;" 100" 2480 PRINT#1," VCMN 11 0 0" 2490 K=IC2:GOSUB 1340 2500 PRINT#1," IC2 11 0 ";K$ 2510 PRINT#1," FA 8 0 VCMN ";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" 2720 IF LO=0 THEN 2750 2740 PRINT#1," LO 29 17 ";LO$+"NH" 2750 PRINT#1," RO 17 3 ";ROUT-1 2780 PRINT#1,".ENDS ";SUBNAM$ 2790 CLOSE#1 2800 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE FILE ";NAM$ 2802 REM ********* NOISE MODEL ************* 2804 STOP 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 NP$=LEFT$(NP$,1):IF NP$="Y" OR NP$="y" THEN GOSUB 1470 2865 IF RF=0 THEN 2930 2870 PRINT#1," RF 3 1 ";RF 2930 PRINT#1," C1 2 0 ";CIN$+"PF" 2940 PRINT#1," GRB1 16 2 16 2 ";1/RB1 2970 PRINT#1," VBE1 16 9 ";VBE1 2980 K=F1G: GOSUB 1340 2990 PRINT#1," F1 0 9 VBE1 ";F1G 3000 PRINT#1," I1 9 0 ";I1 3010 K=1/RB2:GOSUB 1340 3020 PRINT#1," GRB2 9 6 9 6 ";K$ 3030 PRINT#1," VBE2 1 6 0" 3040 PRINT#1," F2 1 11 POLY(1) VBE2 ";IB2;" 100" 3060 PRINT#1," VCMN 11 0 0 " 3070 K=IC2:GOSUB 1340 3080 PRINT#1," IC2 11 0 ";K$ 3090 PRINT#1," FA 8 0 VCMN ";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" 3290 IF LO=0 THEN 3320 3310 PRINT#1," LO 29 17 ";LO$+"NH" 3320 PRINT#1," RO 17 3 ";ROUT-1 3350 PRINT#1,".ENDS ";SUBNAM$ 3360 CLOSE#1 3370 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE FILE ";NAM$ 3380 SYSTEM 9999 END