10 REM BIGOP.BAS Copyright 1989 by Russell Kincaid 20 REM Kincaid Engineering, Savage Road, Milford, NH 03055 30 REM VERSION 1.0 WRITTEN 9/24/1989 40 CLS 50 PRINT "**********************************************************************" 60 PRINT" THIS PROGRAM GENERATES A SPICE DECK THAT DESCRIBES AN OP AMP CIRCUIT" 70 PRINT" Written by: Russ Kincaid, Milford, NH 03055" 80 PRINT:PRINT" This is shareware, see the file README.DOC" 90 PRINT"**********************************************************************" 100 PRINT:PRINT 110 ISD=1E-12 : P=3.14162 : RGB= 1000 : V=.02585 : BF=1000 120 INPUT"WHAT IS THE INTERNAL COMPENSATION CAPACITOR IN PF :";C2 130 IF C2<=0 THEN PRINT :PRINT "MUST BE GREATER THAN ZERO":GOTO 120 140 PRINT:PRINT 150 INPUT"CAN AN EXTERNAL COMPENSATION CAPACITOR BE ATTACHED ";EXT$ 160 IF LEFT$(EXT$,1)="N" OR LEFT$(EXT$,1)="n" THEN EXT$="N":GOTO 180 170 INPUT"IS IT CONNECTED FROM 1 PIN TO GND (1), OR BETWEEN TWO PINS (2) ";COMP 180 INPUT"POSITIVE SLEW RATE IN V/US :";S 190 INPUT"NEGATIVE SLEW RATE IN V/US :";SN 200 INPUT"INPUT BIAS CURRENT :";IB 210 INPUT"BIPOLAR (1) OR FET (2) INPUT";BI 220 IF BI>2 OR BI<1 THEN PRINT"HOW'S THAT?":PRINT:GOTO 210 230 IF BI=2 THEN 250 240 INPUT"NPN (1) OR PNP (2) INPUT";NPN 250 INPUT"INPUT OFFSET CURRENT :";IOS 260 IF BI=2 THEN INPUT"P, N, OR MOS TYPE FET";FET$ 270 IF LEFT$(FET$,1)="M" OR LEFT$(FET$,1)="m" THEN FET$="N" 280 IF LEFT$(FET$,1)="n" OR LEFT$(FET$,1)="N" THEN FET$="N" 290 INPUT"INPUT OFFSET VOLTAGE :";VOFF 300 INPUT"GAIN IN DB (1) OR VOLTS/MV (2) ";Y 310 IF Y=1 THEN 330 320 INPUT"DC VOLTAGE GAIN IN V/MV ";A:A=A*1000: ADB=8.686*LOG(A) : GOTO 340 330 INPUT"DC VOLTAGE GAIN IN DB :";ADB : A=EXP(ADB/8.686) 340 INPUT"FIRST CUT FREQUENCY (1) OR ZERO dB FREQUENCY (2) ";Y 350 IF Y>2 OR Y<1 THEN PRINT" ONE OR TWO, DUMMY!":PRINT:GOTO 340 360 ON Y GOTO 370, 390 370 INPUT"FIRST CUT FREQUENCY (HZ)";F3DB 380 W0=2*P*F3DB*(10^(ADB/20))/1000000! : GOTO 410 390 INPUT"ZERO DB FREQUENCY AS IF SINGLE CUT (IN mHZ)";F0 400 F3DB=F0/(10^(ADB/20))*1000000! : W0=2*P*F0 410 W3DB=2*P*F3DB 420 R2=1/W3DB/C2*1000000! : REM R2 IN MEGOHMS 430 INPUT"DIFFERENTIAL INPUT RESISTANCE IN MEGHOMS :";RIN 440 INPUT"DIFFERENTIAL INPUT CAPACITANCE IN PF " ;CIN 450 INPUT"COMMON-MODE INPUT RESISTANCE IN MEGOHMS (ZERO IF NOT SPECIFIED) :";RCM 460 IF RCM=0 THEN 480 470 RCM= RCM-RIN/4 480 PRINT"IF THE INPUT COMMON MODE RANGE IS VCC-X TO VEE+Y, WHAT IS:" 490 INPUT" X = ";VCMP: VCMP=VCMP+.5 500 INPUT" Y = ";VCMN: VCMN=VCMN+.5 510 INPUT"PHASE MARGIN (1) OR 2ND CUT FREQ (2)";D 520 ON D GOTO 530,580 530 INPUT"PHASE MARGIN IN DEGREES :";PM :PM=PM*P/180 540 INPUT"ACTUAL 0dB FREQUENCY IN mHZ";F0:W0=2*P*F0 550 XC2=1/W0/C2 : P2=ATN(R2/XC2) 560 P3=P-P2-PM 570 XC3=RGB/TAN(P3) : C3=1/XC3/W0*1000000! : GOTO 600 : REM C3 IN PF 580 INPUT"2ND CUT FREQ (MHZ) ";F2 590 C3=1/2/P/RGB/F2*1000000! : REM PICOFARADS 600 INPUT"ARE YOU CONCERNED WITH GAIN VARIATION OVER TEMPERATURE";Y$ 610 IF LEFT$(Y$,1)><"y" AND LEFT$(Y$,1)><"Y" THEN 660 614 INPUT"IS YOUR DATA GAIN & TEMP (1) OR BANDWIDTH & TEMP (2)";D 615 IF D>2 OR D<1 THEN PRINT"TRY AGAIN!":GOTO 614 616 ON D GOTO 620,644 620 PRINT"GIVE TWO DATA POINTS (TEMP,GAIN):" 630 INPUT"LOW TEMP (T,Av) :";T1,A1 640 INPUT"HIGH TEMP (T,Av):";T2,A2 642 TC=(A2-A1)/A/(T2-T1): GOTO 660 644 PRINT"GIVE TWO DATA POINTS (BANDWIDTH, TEMP):" 645 INPUT"LOW FREQ (mHZ) (Bw,T):";B1,T1:INPUT"HIGH FREQ (mHZ) (Bw,T):";B2,T2 647 R=LOG(F0/B1)/LOG(2):DA=EXP(6*R/8.686) : A1=A/DA:PRINT A1 648 R=LOG(B2/F0)/LOG(2):DA=EXP(6*R/8.686) : A2=DA*A:PRINT A2:GOTO 642 660 INPUT"STANDBY POWER DISSAPATION :";PD 670 PRINT " AT VCC = ";:INPUT VCC : PRINT" AT VEE = ";:INPUT VEE 680 RP=((VCC-VEE)^2)/(PD-VCC*2*IC*.000001-ABS(VEE*IEE*.000001)) 690 INPUT"COMMON-MODE REJECTION RATIO IN DB :";CM 700 ECM=1/EXP((CM)/8.686) 710 INPUT"OUTPUT RESISTANCE AT LOW FREQUENCY :";ROUT : L1=0 720 PRINT:PRINT"IF THE MAX OUTPUT SWING IS VCC-X TO VEE+Y, WHAT ARE:" 730 INPUT" X = ";VC: VOLP=VC+V*LOG(S*C2/ISD) 740 INPUT" Y = ";VE: VOLN=VE+V*LOG(SN*C2/ISD) 750 INPUT"OUTPUT CURRENT LIMIT IN AMPS (SOURCE) :";ISCU 760 INPUT"OUTPUT CURRENT LIMIT IN AMPS (SINK) :";ISCD 770 IF ISCU=ISCD THEN 800 780 IF ISCU>ISCD THEN BF1=1000:BF2=1000*ISCU/ISCD:ISC=ISCU:GOTO 820 790 BF2=1000:BF1=BF*ISCD/ISCU:ISC=ISCD:GOTO 820 800 BF2=1000:BF1=BF:ISC=ISCU 810 REM ****** END OF OP AMP PARAMETER INPUT ****** 820 RS=R2*(1-1/1000) 830 VSLEWP=S*RS*C2-V*LOG(C2*S/ISD) 840 VSLEWN=SN*RS*C2-V*LOG(C2*SN/ISD) 850 IB1=IB+IOS/2 : IB2=IB-IOS/2 860 IF IB1>VCC*1E-12 AND IB2>VCC*1E-12 OR FET$>"N" THEN 880 870 PRINT"Ib TOO SMALL TO MODEL WITH A DIODE":FET$="":GOTO 890 880 IF IB1"N" THEN 870 890 INPUT"WHAT WILL YOU NAME THIS MODEL : ";SUBNAM$ 900 A1=ASC(LEFT$(SUBNAM$,1)) 910 IF A1<65 OR A1 > 122 THEN PRINT"NAME MUST BEGIN WITH A LETTER":GOTO 890 920 NAM$=SUBNAM$+".MDL" 930 OPEN NAM$ FOR OUTPUT AS #1 940 PRINT#1,"" 950 IF EXT$="N" OR EXT$="NO" THEN 970 960 ON COMP GOTO 990,1010 970 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 4 5 " 980 PRINT#1,"*** -IN +IN OUT V+ V- *** " :GOTO 1030 990 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 4 5 8" 1000 PRINT#1,"*** -IN +IN OUT V+ V- COMP ***" :GOTO 1030 1010 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 4 5 8 26" 1020 PRINT#1,"*** -IN +IN OUT V+ V- COMP1 COMP2 ***" 1030 K=ISD:GOSUB 1870 1040 PRINT#1,".MODEL DG D RS=1 IS=";K$ 1050 PRINT#1,".MODEL DLIM D IS=1E-16" 1060 K=IB1:GOSUB 1870 1070 PRINT#1,".MODEL DIB1 D IS=";K$ 1080 K=IB2:GOSUB 1870 1090 PRINT#1,".MODEL DIB2 D IS=";K$ 1100 K=BF1:GOSUB 1870 1110 PRINT#1,".MODEL Q1 NPN BF=";K$;" ISE=1E-16" 1120 K=BF2:GOSUB 1870 1130 PRINT#1,".MODEL Q2 PNP BF=";K$;" ISE=1E-16" 1140 PRINT#1,"VOFF 2 15 ";VOFF 1150 PRINT#1,"VSLEWP 13 0 ";VSLEWP 1160 PRINT#1,"VSLEWN 0 16 ";VSLEWN 1170 PRINT#1,"D3 11 13 DG" 1180 PRINT#1,"D4 16 11 DG" 1190 K=RIN/2 1200 PRINT#1,"RIN1 15 18 ";STR$(K)+"MEG" 1210 PRINT#1,"RIN2 18 24 ";STR$(K)+"MEG" 1220 IF RCM=0 THEN 1250 1230 K=RCM-RIN/4 : GOSUB 1870 1240 PRINT#1,"RCM 18 0 ";STR$(K)+"MEG" 1250 PRINT#1,"RP 4 5 " ;RP 1260 IF FET$>"" THEN 1320 1270 IF NPN=2 OR LEFT$(FET$,1)="P" OR LEFT$(FET$,1)="p" THEN 1300 1280 PRINT#1,"IB2 24 0 ";IB2 1290 PRINT#1,"IB1 15 0 ";IB1: GOTO 1420 1300 PRINT#1,"IB2 0 1 ";IB2 1310 PRINT#1,"IB1 15 0 ";IB1 : GOTO 1420 1320 PRINT:PRINT"CHECK TO SEE IF D1, D2 LEAKAGE IS SIGNIFICANT":PRINT 1330 IF FET$="N" THEN 1380 1340 PRINT#1,"DIB2 5 15 DIB2" 1350 PRINT#1,"DIB1 5 1 DIB1" : GOTO 1420 1380 PRINT#1,"DIB2 15 4 DIB2" 1390 PRINT#1,"DIB1 1 4 DIB1" 1420 IF C1=0 THEN 1440 1430 PRINT#1,"C1 15 24 ";STR$(CIN)+"PF" 1440 K=A:GOSUB 1870 1450 IF LEFT$(Y$,1)="Y" OR LEFT$(Y$,1)="y" THEN 1470 1460 PRINT#1,"EA 14 0 20 10 ";K : GOTO 1510 1470 PRINT#1,"EA 14 0 POLY(2) 20 10 27 0 0 0 0 0 1 1480 PRINT#1,"IGAIN 0 27 ";A 1490 K=TC:GOSUB 1870 1500 PRINT#1,"RGAIN 0 27 1 TC=";K$ 1510 PRINT#1,"R9 20 15 1K" 1520 PRINT#1,"R10 10 24 1K" 1530 PRINT#1,"D1 20 12 DG" : PRINT#1,"D2 7 10 DG" 1540 PRINT#1,"VCMP 4 12 ";VCMP : PRINT#1,"VCMN 7 5 ";VCMN 1550 K=R2*(1-1/1000):GOSUB 1870 1560 PRINT#1,"R2 11 8 ";K$+"MEG" 1570 K=R2/1000:GOSUB 1870 1580 PRINT#1,"R22 14 11 ";K$+"MEG" 1590 N$=STR$(C2)+"PF" 1600 IF COMP<2 THEN 1630 1610 PRINT#1,"C2 8 26 ";N$ 1620 PRINT#1,"VC2 26 0 0" : GOTO 1640 1630 PRINT#1,"C2 8 0 ";N$ 1640 PRINT#1,"D5 8 19 DG" 1650 PRINT#1,"GB 0 17 8 0 .001" 1660 PRINT#1,"RGB 17 0 1K" 1670 K=C3 : GOSUB 1870 1680 PRINT#1,"C3 17 0 ";K$+"PF" 1690 PRINT#1,"D6 22 8 DG" 1700 PRINT#1,"VOLP 4 19 ";VC+.5: PRINT#1,"VOLN 22 5 ";VE+.5 1710 K=R2/1000:GOSUB 1870 1720 K=ECM : GOSUB 1870 1730 PRINT#1,"ECM 24 1 0 18 ";K$ 1740 PRINT#1,"EOUT 21 0 17 0 1" 1750 PRINT#1,"ROUT 9 3 ";ROUT 1760 PRINT#1,"D7 25 21 DLIM" 1770 PRINT#1,"D8 21 6 DLIM" 1780 K=ISC/BF:GOSUB 1870 1790 PRINT#1,"ILIM 6 25 ";K$ 1800 PRINT#1,"Q1 4 25 9 Q1" 1810 PRINT#1,"Q2 5 6 9 Q2" 1820 PRINT#1,".ENDS ";SUBNAM$ 1822 PRINT#1,"**********" 1830 CLOSE#1 1840 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE FILE ";NAM$ 1850 GOTO 1970 1860 REM ROUNDOFF ROUTINE 1870 IF K=0 THEN RETURN 1880 IF ABS(K)<1 THEN 1920 1890 FOR T=0 TO 16 :K2=K/10^T 1900 IF ABS(K2)<10 THEN 1950 1910 NEXT T : PRINT K;" IS TOO LARGE":STOP 1920 FOR T=0 TO 16 : K2=K*10^T 1930 IF ABS(K2)>1 THEN 1960 1940 NEXT T : PRINT K;" IS TOO SMALL": STOP 1950 K=10^T*INT(K2*1000+.5)/1000 : GOTO 1962 1960 K=INT(K2*1000+.5)/1000/10^T 1962 IF K<0 THEN K$=STR$(K):GOTO 1966 1964 K$=RIGHT$(STR$(K),LEN(STR$(K))-1) 1966 RETURN 1970 END