home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HAM Radio 1
/
HamRadio.cdr
/
tech
/
design2
/
rfdesign.asc
< prev
next >
Wrap
Text File
|
1986-04-02
|
13KB
|
387 lines
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