home *** CD-ROM | disk | FTP | other *** search
- 10 CLS:PRINT " Program for Impedance Matching"
- 20 PRINT " using"
- 30 PRINT " Smith Chart - see RF Design - 6/85"
- 40 PRINT:PRINT:PRINT " Richard B. Kolbly "
- 50 PRINT " Golden Rule Systems"
- 60 FOR J=0 TO 1000:NEXT J:CLS
- 70 PRINT:INPUT "Plot discrete frequencies (D) or Smooth plot (S)";D$
- 80 IF D$="d" THEN D$="D"
- 90 IF D$="s" THEN D$="S"
- 100 IF D$<>"S" AND D$<>"D" THEN GOTO 70
- 110 INPUT "Plot what value VSWR circle";VS:IF VS<1 THEN 110
- 120 VR=100*(VS-1)/(VS+1):PI=3.1415928#
- 130 INPUT "What characteristic impedance";Z0
- 140 INPUT "How many frequencies";N
- 150 DIM F(N),R(N),I(N),X(N),Y(N),PX(N),PY(N)
- 160 INPUT "Load from keyboard (K) or from File (F)";L$
- 170 IF L$="F" OR L$="f" THEN GOTO 240
- 180 IF L$="K" OR L$="k" THEN GOTO 190 ELSE GOTO 160
- 190 FOR J=1 TO N
- 200 INPUT "Input Frequency (MHz), Rs, Xs (Ohms)";F(J),R(J),I(J)
- 210 X(J)=R(J):Y(J)=I(J)
- 220 NEXT J
- 230 PRINT:GOTO 340
- 240 INPUT "Name of file to load";F$
- 250 IF LEN(F$)=0 THEN FILES:GOTO 240
- 260 IF LEN(F$)=2 AND RIGHT$(F$,1)=":" THEN FILES F$:GOTO 240
- 270 OPEN "I",1,F$
- 280 FOR J=1 TO N
- 290 INPUT #1,F(J),R(J),I(J)
- 300 X(J)=R(J):Y(J)=I(J)
- 310 IF EOF(1) THEN N=J:GOTO 330
- 320 NEXT J
- 330 CLOSE #1
- 340 FLAG=0
- 350 FOR J=1 TO N-1
- 360 IF F(J)>F(J+1) THEN SWAP F(J),F(J+1):FLAG=1
- 370 NEXT J
- 380 IF FLAG=1 THEN GOTO 340
- 390 PRINT "These were your load impedance inputs":PRINT
- 400 HDR$= " Frequency Rseries Xseries":PRINT HDR$:PRINT
- 410 LD$=" #####.### #####.### #####.###"
- 420 FOR J=1 TO N
- 430 PRINT USING LD$;F(J),X(J),I(J)
- 440 NEXT J
- 450 PRINT
- 460 INPUT "Are you satisfied (Y/N)";A$
- 470 IF A$="Y" OR A$="y" THEN GOTO 590
- 480 IF A$="N" OR A$="n" THEN GOTO 490 ELSE GOTO 460
- 490 INPUT "Frequency to modify (cr to list, 0 to end)";F$
- 500 IF LEN(F$)=0 THEN GOSUB 2730:GOTO 490
- 510 IF VAL(F$)=0 THEN GOTO 420
- 520 F=VAL(F$):J=1
- 530 IF F=F(J) THEN GOTO 560
- 540 IF J=N THEN PRINT "Not found!":GOTO 490
- 550 J=J+1:GOTO 530
- 560 PRINT USING LD$;F(J),X(J),I(J);:INPUT " New R+jX";RR$,II$
- 570 IF LEN(RR$)=0 AND LEN(II$)=0 THEN GOTO 420
- 580 R(J)=VAL(RR$):I(J)=VAL(II$):X(J)=R(J):Y(J)=I(J):GOTO 490
- 590 INPUT "Print load values (Y/N)";A$
- 600 IF A$<>"Y" THEN GOTO 650
- 610 LPRINT "Load Impedance Inputs ";DATE$;" ";TIME$:LPRINT
- 620 FOR J=1 TO N
- 630 LPRINT USING LD$;F(J),X(J),Y(J)
- 640 NEXT J
- 650 INPUT "Plot load impedance (Y/N)";P$
- 660 XM=2.4:IF P$="Y" THEN GOSUB 2070
- 670 GOTO 2350
- 680 PRINT "Choose type of matching section: ":PRINT
- 690 PRINT " 1 - Series Capacitance 2 - Series Inductance"
- 700 PRINT " 3 - Series Tuned (Series LC) 4 - Series Tuned (Parallel LC)"
- 710 PRINT " 5 - Series Transmission Line 6 - Shunt Capacitance"
- 720 PRINT " 7 - Shunt Inductance 8 - Shunt Tuned (Series LC)"
- 730 PRINT " 9 - Shunt Tuned (Parallel LC) 10 - Shunt Transmission Line"
- 740 PRINT "11 - Transformer 12 - Series Resistance"
- 750 PRINT "13 - Shunt Resistance 14 - Continue (no action)"
- 760 PRINT
- 770 INPUT "Choice (1-14)";M
- 780 IF M<1 OR M>14 THEN GOTO 770
- 790 ON M GOTO 810,880,950,1030,1110,1230,1320,1410,1510,1610,1770,1890,1960,800
- 800 CLS:GOTO 2350
- 810 PRINT "Add Series Capacitor"
- 820 INPUT "Value of Capacitor (in pf)";C
- 830 FOR J=1 TO N
- 840 X(J)=R(J)
- 850 Y(J)=I(J)-1/(2*PI*F(J)*C*.000001)
- 860 NEXT J
- 870 GOTO 2300
- 880 PRINT "Add Series Inductor"
- 890 INPUT "Value of Inductor (in uH)";L
- 900 FOR J=1 TO N
- 910 X(J)=R(J)
- 920 Y(J)=I(J)+2*PI*F(J)*L
- 930 NEXT J
- 940 GOTO 2300
- 950 PRINT "Add series-tuned (series LC) network"
- 960 INPUT "What is the value of C (in pf)";C
- 970 INPUT "What is the value of L (in uH)";L
- 980 FOR J=1 TO N
- 990 X(J)=R(J)
- 1000 Y(J)=I(J)+2*PI*F(J)*L-1/(2*PI*F(J)*C*.000001)
- 1010 NEXT J
- 1020 GOTO 2300
- 1030 PRINT "Input Add series (parallel LC) network"
- 1040 INPUT "What is the value of C (in pF)";C
- 1050 INPUT "What is the value of L (in uH)";L
- 1060 FOR J=1 TO N
- 1070 X(J)=R(J)
- 1080 Y(J)=I(J)+(2*PI*F(J)*L)/(1-((2*PI*F(J))^2)*L*C*.000001)
- 1090 NEXT J
- 1100 GOTO 2300
- 1110 PRINT "Add series transmission line"
- 1120 INPUT "Line impedance (ohms)";Z9
- 1130 INPUT "Velocity Factor";V
- 1140 INPUT "Line length (in inches)";LL
- 1150 FOR J=1 TO N
- 1160 T=LL*F(J)/(V*1878.4818#)
- 1170 R=R(J)/Z9:I=I(J)/Z9:R1=R:I1=I+TAN(T)
- 1180 R2=1-I*TAN(T):I2=R*TAN(T)
- 1190 GOSUB 2970
- 1200 X(J)=R*Z9:Y(J)=I*Z9
- 1210 NEXT J
- 1220 GOTO 2300
- 1230 PRINT "Add shunt capacitor"
- 1240 INPUT "Value of capacitor (in pF)";C
- 1250 FOR J=1 TO N
- 1260 W=2*PI*C*.000001
- 1270 D=(1-W*F(J)*I(J))^2+(R(J)*W*F(J))^2
- 1280 X(J)=R(J)/D
- 1290 Y(J)=(I(J)*(1-W*F(J)*I(J))-R(J)^2*W*F(J))/D
- 1300 NEXT J
- 1310 GOTO 2300
- 1320 PRINT "Add shunt inductor"
- 1330 INPUT "Value of inductor (in uH)";L
- 1340 FOR J=1 TO N
- 1350 W=2*PI*F(J)*L
- 1360 D=R(J)^2+(I(J)+W)^2
- 1370 X(J)=R(J)*W^2/D
- 1380 Y(J)=W*(R(J)^2+I(J)^2+W*I(J))/D
- 1390 NEXT J
- 1400 GOTO 2300
- 1410 PRINT "Add shunt tuned (series LC)"
- 1420 INPUT "Value of C (in pF)";C
- 1430 INPUT "Value of L (in uH)";L
- 1440 FOR J=1 TO N
- 1450 W=2*PI*F(J)*L-(1000000!)/(2*PI*F(J)*C)
- 1460 D=R(J)^2+(I(J)+W)^2
- 1470 X(J)=R(J)*W^2/D
- 1480 Y(J)=W*(R(J)^2+I(J)^2+W*I(J))/D
- 1490 NEXT J
- 1500 GOTO 2300
- 1510 PRINT "Add shunt tuning (parallel LC)"
- 1520 INPUT "Value of C (in pF)";C
- 1530 INPUT "Value of L (in uH)";L
- 1540 FOR J=1 TO N
- 1550 W=(2*PI*F(J)*L)/(1-((2*PI*F(J))^2)*L*C*.000001)
- 1560 D=R(J)^2+(I(J)+W)^2
- 1570 X(J)=R(J)*W^2/D
- 1580 Y(J)=W*(R(J)^2+I(J)^2+W*I(J))/D
- 1590 NEXT J
- 1600 GOTO 2300
- 1610 PRINT "Add shunt transmission line"
- 1620 INPUT "What is line impedance (ohms)";Z1
- 1630 INPUT "What is line velocity factor";V
- 1640 INPUT "What is length (in inches)";LL
- 1650 INPUT "Open (O) or shorted (S) stub";S$
- 1660 IF (S$<>"O" OR S$<>"o")AND(S$<>"S" OR S$<> "s") THEN GOTO 1650
- 1670 INPUT "Choice (1-14)";M
- 1680 FOR J=1 TO N
- 1690 T=LL*F(J)*1.2/39.37/V
- 1700 IF S$="S" OR S$="s" THEN W=Z1*TAN(T*PI/180)
- 1710 IF S$="O" OR S$="o" THEN W=Z1*TAN((T+90)*PI/180)
- 1720 D=R(J)^2+(I(J)+W)^2
- 1730 X(J)=R(J)*W^2/D
- 1740 Y(J)=W*(R(J)^2+I(J)^2+W*I(J))/D
- 1750 NEXT J
- 1760 GOTO 2300
- 1770 PRINT "Add transformer"
- 1780 INPUT "Step up (U) or step-down (D)";T$
- 1790 IF T$="u" THEN T$="U"
- 1800 IF T$="d" THEN T$="D"
- 1810 IF T$<>"D" AND T$<>"U" THEN GOTO 1780
- 1820 INPUT "What transformation ratio";W
- 1830 IF T$="D" THEN W=1/W
- 1840 FOR J=1 TO N
- 1850 X(J)=W*R(J)
- 1860 Y(J)=W*I(J)
- 1870 NEXT J
- 1880 GOTO 2300
- 1890 PRINT "Add series resistor"
- 1900 INPUT "Value of resistor (in ohms)";RS
- 1910 FOR J=1 TO N
- 1920 X(J)=R(J)+RS
- 1930 Y(J)=I(J)
- 1940 NEXT J
- 1950 GOTO 2300
- 1960 PRINT "Add shunt resistor"
- 1970 INPUT "Value of resistor (in ohms)";RS
- 1980 FOR J=1 TO N
- 1990 D=(R(J)+RS)^2+I(J)^2
- 2000 X(J)=RS*(R(J)^2+RS*R(J)+I(J)^2)/D
- 2010 Y(J)=I(J)*RS^2/D
- 2020 NEXT J
- 2030 GOTO 2300
- 2040 INPUT "Want to run another one";A$
- 2050 IF LEFT$(A$,1)="Y" THEN GOTO 70
- 2060 CLS:END
- 2070 CLS:SCREEN 2:LOCATE 3,1:PRINT USING "Z0 =###.#";Z0
- 2080 LOCATE 4,1:PRINT USING "VSWR Ref = ###.#";VS
- 2090 CIRCLE (320,100),200
- 2100 CIRCLE (520,16),200,,PI,3*PI/2
- 2110 CIRCLE (370,100),150
- 2120 CIRCLE (520,184),200,,PI/2,PI
- 2130 CIRCLE (420,100),100
- 2140 LINE (120,100)-(520,100)
- 2150 CIRCLE (320,100),2*VR
- 2160 REM
- 2170 REM
- 2180 X(0)=X(1):Y(0)=Y(1)
- 2190 FOR J = 1 TO N
- 2200 X=X(J):Y=Y(J)
- 2210 GOSUB 3190
- 2220 PX(J)=X:PY(J)=Y
- 2230 IF D$="S" THEN GOTO 2250
- 2240 PSET (PX(J),PY(J)):GOTO 2260
- 2250 IF J>1 THEN LINE (PX(J-1),PY(J-1))-(PX(J),PY(J))
- 2260 NEXT J
- 2270 LOCATE 1,23:PRINT "Press any key to continue";
- 2280 X$=INKEY$:IF LEN(X$)=0 THEN GOTO 2280
- 2290 RETURN
- 2300 PRINT HDR$:PRINT
- 2310 FOR J=1 TO N
- 2320 PRINT USING LD$;F(J),X(J),Y(J)
- 2330 NEXT J
- 2340 INPUT "Press <ret> to continue...",QQ$
- 2350 CLS:PRINT " 1 - Plot on clean screen for viewing 2 - Display R,X values"
- 2360 PRINT " 3 - Plot on last screen 4 - Print R,X values"
- 2370 PRINT " 5 - Bad value-discard this try 6 - Change Z0"
- 2380 PRINT " 7 - Good value-keep and proceed 8 - Change VSWR Circle"
- 2390 PRINT " 9 - File Operations 10 - Exit Program"
- 2400 PRINT:INPUT "Enter choice";QQ
- 2410 ON QQ GOTO 2430,2460,2490,2520,2540,2690,2590,2640,3440,2680
- 2420 GOTO 2400
- 2430 XM=2.4:REM plot on screen
- 2440 GOSUB 2070
- 2450 GOTO 2350
- 2460 REM Display R,X values
- 2470 GOSUB 2730
- 2480 GOTO 2340
- 2490 GOSUB 2070:REM plot on last screen
- 2500 GOSUB 2850
- 2510 GOTO 2350
- 2520 GOSUB 2790:REM Print R,X values on printer
- 2530 GOTO 2340
- 2540 CLS
- 2550 FOR J=1 TO N
- 2560 X(J)=R(J):Y(J)=I(J)
- 2570 NEXT J
- 2580 GOTO 2350
- 2590 FOR J=1 TO N
- 2600 R(J)=X(J):I(J)=Y(J)
- 2610 NEXT J
- 2620 PRINT:CLS
- 2630 GOTO 680
- 2640 PRINT USING "Constant VSWR Circle = ###.# - Input new Value";VS;
- 2650 INPUT VS$:IF LEN(VS$)=0 THEN GOTO 2350
- 2660 IF VAL(VS$)<1 THEN GOTO 2350
- 2670 VS=VAL(VS$):VR=100*(VS-1)/(VS+1):GOTO 2350
- 2680 CLS:END
- 2690 PRINT USING "Z0 = ###.# Input new value (cr for no change)";Z0;
- 2700 INPUT Z$:IF LEN(Z$)=0 THEN GOTO 2350
- 2710 IF VAL(Z$)<=0 THEN GOTO 2690
- 2720 Z0=VAL(Z$):GOTO 2350
- 2730 CLS:PRINT HDR$:PRINT
- 2740 FOR J=1 TO N
- 2750 PRINT USING LD$;F(J),X(J),Y(J)
- 2760 NEXT J
- 2770 PRINT
- 2780 RETURN
- 2790 LPRINT DATE$;" ";TIME$:LPRINT
- 2800 LPRINT HDR$:LPRINT
- 2810 FOR J=1 TO N
- 2820 LPRINT USING LD$;F(J),X(J),Y(J)
- 2830 NEXT J
- 2840 RETURN
- 2850 X(0)=R(1):Y(0)=R(1)
- 2860 FOR J = 1 TO N
- 2870 X=R(J):Y=I(J)
- 2880 GOSUB 3190
- 2890 PX(J)=X:PY(J)=Y
- 2900 IF D$="S" THEN GOTO 2920
- 2910 PSET (PX(J),PY(J)):GOTO 2930
- 2920 IF J>1 THEN LINE (PX(J-1),PY(J-1))-(PX(J),PY(J))
- 2930 NEXT J
- 2940 LOCATE 1,23:PRINT "Press any key to continue";
- 2950 X$=INKEY$:IF LEN(X$)=0 THEN GOTO 2950
- 2960 CLS:RETURN
- 2970 R=R1:I=I1:GOSUB 3130
- 2980 Z1=Z:TH1=TH
- 2990 R=R2:I=I2:GOSUB 3130
- 3000 Z2=Z:TH2=TH
- 3010 Z=Z1/Z2:TH=TH1-TH2
- 3020 IF TH<0 THEN TH=TH+PI*2
- 3030 GOSUB 3180
- 3040 RETURN
- 3050 R=R1:I=I1:GOSUB 3130
- 3060 Z1=Z:TH1=TH
- 3070 R=R2:I=12:GOSUB 3130
- 3080 Z2=Z:TH2=TH
- 3090 Z=Z1*Z2:TH=TH1+TH2
- 3100 IF TH>PI*2 THEN TH=TH-PI*2
- 3110 GOSUB 3180
- 3120 RETURN
- 3130 Z=SQR(R*R+I*I)
- 3140 IF R=0 THEN TH=SGN(I)*PI/2 ELSE TH=ATN(I/R)
- 3150 IF TH<0 THEN TH=TH+PI*2
- 3160 IF R<0 THEN TH=TH+PI
- 3170 RETURN
- 3180 R=Z*COS(TH):I=Z*SIN(TH):RETURN
- 3190 X=X/Z0:Y=Y/Z0:' This subroutine is for x,y (R+jX) input
- 3200 Z1=SQR(X*X+2*X+1+Y*Y)
- 3210 THETA1=ATN(Y/(X+1))
- 3220 Z2=SQR(X*X-2*X+1+Y*Y)
- 3230 IF X=1 THEN THETA2=SGN(Y)*PI/2 ELSE THETA2=ATN(Y/(X-1))
- 3240 Z=Z2/Z1:THETA=THETA2-THETA1
- 3250 IF X<1 THEN THETA=THETA+PI
- 3260 X=Z*COS(THETA):Y=Z*SIN(THETA):' Point has been transformed
- 3270 ' Now scale the values for plotting
- 3280 X=X*200+320
- 3290 Y=100-5*200*Y/12
- 3300 RETURN
- 3310 R=(X-1)/(X+1):' Convert VSWR into reflection coeffient
- 3320 THETA=Y*PI/180:' Convert phase angle into radians
- 3330 GOTO 3350
- 3340 THETA=Y*PI/180:R=X
- 3350 X=R*COS(THETA):Y=R*SIN(THETA)
- 3360 GOTO 3280:' Scale parameters for plotting and return
- 3370 THETA=THETA*PI/180: 'Convert to Radians
- 3380 R=R/RMAX: ' Normalize to unit circle
- 3390 X=R*COS(THETA):Y=R*SIN(THETA)
- 3400 ' Now scale values of X and Y for plotting
- 3410 X=X*200+320
- 3420 Y=100-5*200*Y/12
- 3430 RETURN
- 3440 CLS:SCREEN 0,0,0:PRINT " FILE MANIPULATION ROUTINES"
- 3450 PRINT:PRINT " 1 -Create Data File 2 - Review File Max, Min Values"
- 3460 PRINT " 3 -Return to Main Menu"
- 3470 PRINT:INPUT "Select Option ",C
- 3480 C=INT(C):IF C<1 OR C>3 THEN PRINT "Invalid Choice!":GOTO 3470
- 3490 IF C=3 THEN GOTO 2350
- 3500 IF C=2 THEN GOTO 3540
- 3510 IF C=1 THEN GOTO 3550
- 3520 PRINT "Invalid Option!":GOTO 1930
- 3530 '
- 3540 GOSUB 3560:GOTO 3450
- 3550 GOSUB 3780:GOTO 3440
- 3560 INPUT "File to be reviewed";F$
- 3570 OPEN "I",#1,F$
- 3580 COUNT=0
- 3590 IF EOF(1) THEN PRINT "Empty File!":GOTO 3560
- 3600 INPUT #1,F,X,Y:FMAX=F:FMIN=F:XMAX=X:XMIN=X:YMAX=Y:YMIN=Y:COUNT=1
- 3610 IF EOF(1) THEN GOTO 3730
- 3620 INPUT #1,F,X,Y
- 3630 IF F<FMIN THEN FMIN=F
- 3640 IF F>FMAX THEN FMAX=F
- 3650 IF X<XMIN THEN XMIN=X
- 3660 IF X>XMAX THEN XMAX=X
- 3670 IF Y<YMIN THEN YMIN=Y
- 3680 IF Y>YMAX THEN YMAX=Y
- 3690 COUNT=COUNT+1
- 3700 IF EOF(1) THEN GOTO 3720
- 3710 GOTO 3620
- 3720 PRINT USING "Minimum F = ##.##^^^^ Maximum F = ##.##^^^^";FMIN,FMAX
- 3730 PRINT USING "Minimum R = ##.##^^^^ Maximum R = ##.##^^^^";XMIN,XMAX
- 3740 PRINT USING "Minimum X = ##.##^^^^ Maximum X = ##.##^^^^";YMIN,YMAX
- 3750 PRINT USING " Elements in file = ####";COUNT
- 3760 CLOSE #1
- 3770 RETURN
- 3780 INPUT "Name of File to Save Data (cr gives directory)";F$
- 3790 IF LEN(F$)=0 THEN FILES:GOTO 3780
- 3800 IF LEN(F$)=2 AND RIGHT$(F$,1)=":" THEN FILES F$:GOTO 3780
- 3810 OPEN "O",1,F$
- 3820 FOR J=1 TO N
- 3830 PRINT #1,F(J),R(J),I(J)
- 3840 NEXT J
- 3850 CLOSE #1
- 3860 RETURN