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

  1. 10 CLS:PRINT "          Program for Impedance Matching"
  2. 20     PRINT "                     using"
  3. 30  PRINT    "       Smith Chart - see RF Design - 6/85"
  4. 40 PRINT:PRINT:PRINT "       Richard B. Kolbly "
  5. 50 PRINT "         Golden Rule Systems"
  6. 60 FOR J=0 TO 1000:NEXT J:CLS
  7. 70 PRINT:INPUT "Plot discrete frequencies (D) or Smooth plot (S)";D$
  8. 80 IF D$="d" THEN D$="D"
  9. 90 IF D$="s" THEN D$="S"
  10. 100 IF D$<>"S" AND D$<>"D" THEN GOTO 70
  11. 110 INPUT "Plot what value VSWR circle";VS:IF VS<1 THEN 110
  12. 120 VR=100*(VS-1)/(VS+1):PI=3.1415928#
  13. 130 INPUT "What characteristic impedance";Z0
  14. 140 INPUT "How many frequencies";N
  15. 150 DIM F(N),R(N),I(N),X(N),Y(N),PX(N),PY(N)
  16. 160 INPUT "Load from keyboard (K) or from File (F)";L$
  17. 170 IF L$="F" OR L$="f" THEN GOTO 240
  18. 180 IF L$="K" OR L$="k" THEN GOTO 190 ELSE GOTO 160
  19. 190  FOR J=1 TO N
  20. 200  INPUT "Input Frequency (MHz), Rs, Xs (Ohms)";F(J),R(J),I(J)
  21. 210  X(J)=R(J):Y(J)=I(J)
  22. 220  NEXT J
  23. 230 PRINT:GOTO 340
  24. 240 INPUT "Name of file to load";F$
  25. 250 IF LEN(F$)=0 THEN FILES:GOTO 240
  26. 260 IF LEN(F$)=2 AND RIGHT$(F$,1)=":" THEN FILES F$:GOTO 240
  27. 270 OPEN "I",1,F$
  28. 280 FOR J=1 TO N
  29. 290 INPUT #1,F(J),R(J),I(J)
  30. 300 X(J)=R(J):Y(J)=I(J)
  31. 310 IF EOF(1) THEN N=J:GOTO 330
  32. 320 NEXT J
  33. 330 CLOSE #1
  34. 340 FLAG=0
  35. 350 FOR J=1 TO N-1
  36. 360 IF F(J)>F(J+1) THEN SWAP F(J),F(J+1):FLAG=1
  37. 370 NEXT J
  38. 380 IF FLAG=1 THEN GOTO 340
  39. 390 PRINT "These were your load impedance inputs":PRINT
  40. 400 HDR$= "   Frequency      Rseries     Xseries":PRINT HDR$:PRINT
  41. 410 LD$="   #####.###     #####.###  #####.###"
  42. 420 FOR J=1 TO N
  43. 430 PRINT USING LD$;F(J),X(J),I(J)
  44. 440 NEXT J
  45. 450 PRINT
  46. 460 INPUT "Are you satisfied (Y/N)";A$
  47. 470 IF A$="Y" OR A$="y" THEN GOTO 590
  48. 480 IF A$="N" OR A$="n" THEN GOTO 490 ELSE GOTO 460
  49. 490 INPUT "Frequency to modify (cr to list, 0 to end)";F$
  50. 500 IF LEN(F$)=0 THEN GOSUB 2730:GOTO 490
  51. 510 IF VAL(F$)=0 THEN GOTO 420
  52. 520 F=VAL(F$):J=1
  53. 530 IF F=F(J) THEN GOTO 560
  54. 540 IF J=N THEN PRINT "Not found!":GOTO 490
  55. 550 J=J+1:GOTO 530
  56. 560 PRINT USING LD$;F(J),X(J),I(J);:INPUT "   New R+jX";RR$,II$
  57. 570 IF LEN(RR$)=0 AND LEN(II$)=0 THEN GOTO  420
  58. 580 R(J)=VAL(RR$):I(J)=VAL(II$):X(J)=R(J):Y(J)=I(J):GOTO 490
  59. 590 INPUT "Print load values (Y/N)";A$
  60. 600 IF A$<>"Y" THEN GOTO 650
  61. 610 LPRINT "Load Impedance Inputs ";DATE$;" ";TIME$:LPRINT
  62. 620 FOR J=1 TO N
  63. 630 LPRINT USING LD$;F(J),X(J),Y(J)
  64. 640 NEXT J
  65. 650 INPUT "Plot load impedance (Y/N)";P$
  66. 660 XM=2.4:IF P$="Y" THEN GOSUB 2070
  67. 670 GOTO 2350
  68. 680 PRINT "Choose type of matching section: ":PRINT
  69. 690 PRINT " 1 -  Series Capacitance         2 - Series Inductance"
  70. 700 PRINT " 3 -  Series Tuned (Series LC)   4 - Series Tuned (Parallel LC)"
  71. 710 PRINT " 5 -  Series Transmission Line   6 - Shunt Capacitance"
  72. 720 PRINT " 7 -  Shunt Inductance           8 - Shunt Tuned (Series LC)"
  73. 730 PRINT " 9 -  Shunt Tuned (Parallel LC) 10 - Shunt Transmission Line"
  74. 740 PRINT "11 -  Transformer               12 - Series Resistance"
  75. 750 PRINT "13 -  Shunt Resistance          14 - Continue (no action)"
  76. 760 PRINT
  77. 770 INPUT "Choice (1-14)";M
  78. 780 IF M<1 OR M>14 THEN GOTO 770
  79. 790 ON M GOTO 810,880,950,1030,1110,1230,1320,1410,1510,1610,1770,1890,1960,800
  80. 800 CLS:GOTO 2350
  81. 810 PRINT "Add Series Capacitor"
  82. 820 INPUT "Value of Capacitor (in pf)";C
  83. 830 FOR J=1 TO N
  84. 840 X(J)=R(J)
  85. 850 Y(J)=I(J)-1/(2*PI*F(J)*C*.000001)
  86. 860 NEXT J
  87. 870 GOTO 2300
  88. 880 PRINT "Add Series Inductor"
  89. 890 INPUT "Value of Inductor (in uH)";L
  90. 900 FOR J=1 TO N
  91. 910 X(J)=R(J)
  92. 920 Y(J)=I(J)+2*PI*F(J)*L
  93. 930 NEXT J
  94. 940 GOTO 2300
  95. 950 PRINT "Add series-tuned (series LC) network"
  96. 960 INPUT "What is the value of C (in pf)";C
  97. 970 INPUT "What is the value of L (in uH)";L
  98. 980 FOR J=1 TO N
  99. 990 X(J)=R(J)
  100. 1000 Y(J)=I(J)+2*PI*F(J)*L-1/(2*PI*F(J)*C*.000001)
  101. 1010 NEXT J
  102. 1020 GOTO 2300
  103. 1030 PRINT "Input Add series (parallel LC) network"
  104. 1040 INPUT "What is the value of C (in pF)";C
  105. 1050 INPUT "What is the value of L (in uH)";L
  106. 1060 FOR J=1 TO N
  107. 1070 X(J)=R(J)
  108. 1080 Y(J)=I(J)+(2*PI*F(J)*L)/(1-((2*PI*F(J))^2)*L*C*.000001)
  109. 1090 NEXT J
  110. 1100 GOTO 2300
  111. 1110 PRINT "Add series transmission line"
  112. 1120 INPUT "Line impedance (ohms)";Z9
  113. 1130 INPUT "Velocity Factor";V
  114. 1140 INPUT "Line length (in inches)";LL
  115. 1150 FOR J=1 TO N
  116. 1160 T=LL*F(J)/(V*1878.4818#)
  117. 1170 R=R(J)/Z9:I=I(J)/Z9:R1=R:I1=I+TAN(T)
  118. 1180 R2=1-I*TAN(T):I2=R*TAN(T)
  119. 1190 GOSUB 2970
  120. 1200 X(J)=R*Z9:Y(J)=I*Z9
  121. 1210 NEXT J
  122. 1220 GOTO 2300
  123. 1230 PRINT "Add shunt capacitor"
  124. 1240 INPUT "Value of capacitor (in pF)";C
  125. 1250 FOR J=1 TO N
  126. 1260 W=2*PI*C*.000001
  127. 1270 D=(1-W*F(J)*I(J))^2+(R(J)*W*F(J))^2
  128. 1280 X(J)=R(J)/D
  129. 1290 Y(J)=(I(J)*(1-W*F(J)*I(J))-R(J)^2*W*F(J))/D
  130. 1300 NEXT J
  131. 1310 GOTO 2300
  132. 1320 PRINT "Add shunt inductor"
  133. 1330 INPUT "Value of inductor (in uH)";L
  134. 1340 FOR J=1 TO N
  135. 1350 W=2*PI*F(J)*L
  136. 1360 D=R(J)^2+(I(J)+W)^2
  137. 1370 X(J)=R(J)*W^2/D
  138. 1380 Y(J)=W*(R(J)^2+I(J)^2+W*I(J))/D
  139. 1390 NEXT J
  140. 1400 GOTO 2300
  141. 1410 PRINT "Add shunt tuned (series LC)"
  142. 1420 INPUT "Value of C (in pF)";C
  143. 1430 INPUT "Value of L (in uH)";L
  144. 1440 FOR J=1 TO N
  145. 1450 W=2*PI*F(J)*L-(1000000!)/(2*PI*F(J)*C)
  146. 1460 D=R(J)^2+(I(J)+W)^2
  147. 1470 X(J)=R(J)*W^2/D
  148. 1480 Y(J)=W*(R(J)^2+I(J)^2+W*I(J))/D
  149. 1490 NEXT J
  150. 1500 GOTO 2300
  151. 1510 PRINT "Add shunt tuning (parallel LC)"
  152. 1520 INPUT "Value of C (in pF)";C
  153. 1530 INPUT "Value of L (in uH)";L
  154. 1540 FOR J=1 TO N
  155. 1550 W=(2*PI*F(J)*L)/(1-((2*PI*F(J))^2)*L*C*.000001)
  156. 1560 D=R(J)^2+(I(J)+W)^2
  157. 1570 X(J)=R(J)*W^2/D
  158. 1580 Y(J)=W*(R(J)^2+I(J)^2+W*I(J))/D
  159. 1590 NEXT J
  160. 1600 GOTO 2300
  161. 1610 PRINT "Add shunt transmission line"
  162. 1620 INPUT "What is line impedance (ohms)";Z1
  163. 1630 INPUT "What is line velocity factor";V
  164. 1640 INPUT "What is length (in inches)";LL
  165. 1650 INPUT "Open (O) or shorted (S) stub";S$
  166. 1660 IF (S$<>"O" OR S$<>"o")AND(S$<>"S" OR S$<> "s") THEN GOTO 1650
  167. 1670 INPUT "Choice (1-14)";M
  168. 1680 FOR J=1 TO N
  169. 1690 T=LL*F(J)*1.2/39.37/V
  170. 1700 IF S$="S" OR S$="s" THEN W=Z1*TAN(T*PI/180)
  171. 1710 IF S$="O" OR S$="o" THEN W=Z1*TAN((T+90)*PI/180)
  172. 1720 D=R(J)^2+(I(J)+W)^2
  173. 1730 X(J)=R(J)*W^2/D
  174. 1740 Y(J)=W*(R(J)^2+I(J)^2+W*I(J))/D
  175. 1750 NEXT J
  176. 1760 GOTO 2300
  177. 1770 PRINT "Add transformer"
  178. 1780 INPUT "Step up (U) or step-down (D)";T$
  179. 1790 IF T$="u" THEN T$="U"
  180. 1800 IF T$="d" THEN T$="D"
  181. 1810 IF T$<>"D" AND T$<>"U" THEN GOTO 1780
  182. 1820 INPUT "What transformation ratio";W
  183. 1830 IF T$="D" THEN W=1/W
  184. 1840 FOR J=1 TO N
  185. 1850 X(J)=W*R(J)
  186. 1860 Y(J)=W*I(J)
  187. 1870 NEXT J
  188. 1880 GOTO 2300
  189. 1890 PRINT "Add series resistor"
  190. 1900 INPUT "Value of resistor (in ohms)";RS
  191. 1910 FOR J=1 TO N
  192. 1920 X(J)=R(J)+RS
  193. 1930 Y(J)=I(J)
  194. 1940 NEXT J
  195. 1950 GOTO 2300
  196. 1960 PRINT "Add shunt resistor"
  197. 1970 INPUT "Value of resistor (in ohms)";RS
  198. 1980 FOR J=1 TO N
  199. 1990 D=(R(J)+RS)^2+I(J)^2
  200. 2000 X(J)=RS*(R(J)^2+RS*R(J)+I(J)^2)/D
  201. 2010 Y(J)=I(J)*RS^2/D
  202. 2020 NEXT J
  203. 2030 GOTO 2300
  204. 2040 INPUT "Want to run another one";A$
  205. 2050 IF LEFT$(A$,1)="Y" THEN GOTO 70
  206. 2060 CLS:END
  207. 2070 CLS:SCREEN 2:LOCATE 3,1:PRINT USING "Z0 =###.#";Z0
  208. 2080 LOCATE 4,1:PRINT USING "VSWR Ref = ###.#";VS
  209. 2090 CIRCLE (320,100),200
  210. 2100 CIRCLE (520,16),200,,PI,3*PI/2
  211. 2110 CIRCLE (370,100),150
  212. 2120 CIRCLE (520,184),200,,PI/2,PI
  213. 2130 CIRCLE (420,100),100
  214. 2140 LINE (120,100)-(520,100)
  215. 2150 CIRCLE (320,100),2*VR
  216. 2160 REM
  217. 2170 REM
  218. 2180 X(0)=X(1):Y(0)=Y(1)
  219. 2190 FOR J = 1 TO N
  220. 2200 X=X(J):Y=Y(J)
  221. 2210 GOSUB 3190
  222. 2220 PX(J)=X:PY(J)=Y
  223. 2230 IF D$="S" THEN GOTO 2250
  224. 2240 PSET (PX(J),PY(J)):GOTO 2260
  225. 2250 IF J>1 THEN LINE (PX(J-1),PY(J-1))-(PX(J),PY(J))
  226. 2260 NEXT J
  227. 2270 LOCATE 1,23:PRINT "Press any key to continue";
  228. 2280 X$=INKEY$:IF LEN(X$)=0 THEN GOTO 2280
  229. 2290 RETURN
  230. 2300 PRINT HDR$:PRINT
  231. 2310 FOR J=1 TO N
  232. 2320 PRINT USING LD$;F(J),X(J),Y(J)
  233. 2330 NEXT J
  234. 2340 INPUT "Press <ret> to continue...",QQ$
  235. 2350 CLS:PRINT "  1 - Plot on clean screen for viewing 2 - Display R,X values"
  236. 2360 PRINT "  3 - Plot on last screen              4 - Print R,X values"
  237. 2370 PRINT "  5 - Bad value-discard this try       6 - Change Z0"
  238. 2380 PRINT "  7 - Good value-keep and proceed      8 - Change VSWR Circle"
  239. 2390 PRINT "  9 - File Operations                 10 - Exit Program"
  240. 2400 PRINT:INPUT "Enter choice";QQ
  241. 2410 ON QQ GOTO 2430,2460,2490,2520,2540,2690,2590,2640,3440,2680
  242. 2420 GOTO 2400
  243. 2430 XM=2.4:REM plot on screen
  244. 2440 GOSUB 2070
  245. 2450 GOTO 2350
  246. 2460 REM Display R,X values
  247. 2470 GOSUB 2730
  248. 2480 GOTO 2340
  249. 2490 GOSUB 2070:REM plot on last screen
  250. 2500 GOSUB 2850
  251. 2510 GOTO 2350
  252. 2520 GOSUB 2790:REM Print R,X values on printer
  253. 2530 GOTO 2340
  254. 2540 CLS
  255. 2550 FOR J=1 TO N
  256. 2560 X(J)=R(J):Y(J)=I(J)
  257. 2570 NEXT J
  258. 2580 GOTO 2350
  259. 2590 FOR J=1 TO N
  260. 2600 R(J)=X(J):I(J)=Y(J)
  261. 2610 NEXT J
  262. 2620 PRINT:CLS
  263. 2630 GOTO 680
  264. 2640 PRINT USING "Constant VSWR Circle = ###.# - Input new Value";VS;
  265. 2650 INPUT VS$:IF LEN(VS$)=0 THEN GOTO 2350
  266. 2660 IF VAL(VS$)<1 THEN GOTO 2350
  267. 2670 VS=VAL(VS$):VR=100*(VS-1)/(VS+1):GOTO 2350
  268. 2680 CLS:END
  269. 2690 PRINT USING "Z0 = ###.# Input new value (cr for no change)";Z0;
  270. 2700 INPUT Z$:IF LEN(Z$)=0 THEN GOTO 2350
  271. 2710 IF VAL(Z$)<=0 THEN GOTO 2690
  272. 2720 Z0=VAL(Z$):GOTO 2350
  273. 2730 CLS:PRINT HDR$:PRINT
  274. 2740 FOR J=1 TO N
  275. 2750 PRINT USING LD$;F(J),X(J),Y(J)
  276. 2760 NEXT J
  277. 2770 PRINT
  278. 2780 RETURN
  279. 2790 LPRINT DATE$;"   ";TIME$:LPRINT
  280. 2800 LPRINT HDR$:LPRINT
  281. 2810 FOR J=1 TO N
  282. 2820 LPRINT USING LD$;F(J),X(J),Y(J)
  283. 2830 NEXT J
  284. 2840 RETURN
  285. 2850 X(0)=R(1):Y(0)=R(1)
  286. 2860 FOR J = 1 TO N
  287. 2870 X=R(J):Y=I(J)
  288. 2880 GOSUB 3190
  289. 2890 PX(J)=X:PY(J)=Y
  290. 2900 IF D$="S" THEN GOTO 2920
  291. 2910 PSET (PX(J),PY(J)):GOTO 2930
  292. 2920 IF J>1 THEN LINE (PX(J-1),PY(J-1))-(PX(J),PY(J))
  293. 2930 NEXT J
  294. 2940 LOCATE 1,23:PRINT "Press any key to continue";
  295. 2950 X$=INKEY$:IF LEN(X$)=0 THEN GOTO 2950
  296. 2960 CLS:RETURN
  297. 2970 R=R1:I=I1:GOSUB 3130
  298. 2980 Z1=Z:TH1=TH
  299. 2990 R=R2:I=I2:GOSUB 3130
  300. 3000 Z2=Z:TH2=TH
  301. 3010 Z=Z1/Z2:TH=TH1-TH2
  302. 3020 IF TH<0 THEN TH=TH+PI*2
  303. 3030 GOSUB 3180
  304. 3040 RETURN
  305. 3050 R=R1:I=I1:GOSUB 3130
  306. 3060 Z1=Z:TH1=TH
  307. 3070 R=R2:I=12:GOSUB 3130
  308. 3080 Z2=Z:TH2=TH
  309. 3090 Z=Z1*Z2:TH=TH1+TH2
  310. 3100 IF TH>PI*2 THEN TH=TH-PI*2
  311. 3110 GOSUB 3180
  312. 3120 RETURN
  313. 3130 Z=SQR(R*R+I*I)
  314. 3140 IF R=0 THEN TH=SGN(I)*PI/2 ELSE TH=ATN(I/R)
  315. 3150 IF TH<0 THEN TH=TH+PI*2
  316. 3160 IF R<0 THEN TH=TH+PI
  317. 3170 RETURN
  318. 3180 R=Z*COS(TH):I=Z*SIN(TH):RETURN
  319. 3190 X=X/Z0:Y=Y/Z0:' This subroutine is for x,y (R+jX) input
  320. 3200 Z1=SQR(X*X+2*X+1+Y*Y)
  321. 3210 THETA1=ATN(Y/(X+1))
  322. 3220 Z2=SQR(X*X-2*X+1+Y*Y)
  323. 3230 IF X=1 THEN THETA2=SGN(Y)*PI/2 ELSE THETA2=ATN(Y/(X-1))
  324. 3240 Z=Z2/Z1:THETA=THETA2-THETA1
  325. 3250 IF X<1 THEN THETA=THETA+PI
  326. 3260 X=Z*COS(THETA):Y=Z*SIN(THETA):' Point has been transformed
  327. 3270 ' Now scale the values for plotting
  328. 3280 X=X*200+320
  329. 3290 Y=100-5*200*Y/12
  330. 3300 RETURN
  331. 3310 R=(X-1)/(X+1):' Convert VSWR into reflection coeffient
  332. 3320 THETA=Y*PI/180:' Convert phase angle into radians
  333. 3330 GOTO 3350
  334. 3340 THETA=Y*PI/180:R=X
  335. 3350 X=R*COS(THETA):Y=R*SIN(THETA)
  336. 3360 GOTO 3280:' Scale parameters for plotting and return
  337. 3370 THETA=THETA*PI/180: 'Convert to Radians
  338. 3380 R=R/RMAX: ' Normalize to unit circle
  339. 3390 X=R*COS(THETA):Y=R*SIN(THETA)
  340. 3400 ' Now scale values of X and Y for plotting
  341. 3410 X=X*200+320
  342. 3420 Y=100-5*200*Y/12
  343. 3430 RETURN
  344. 3440 CLS:SCREEN 0,0,0:PRINT "                FILE MANIPULATION ROUTINES"
  345. 3450 PRINT:PRINT " 1 -Create Data File        2 - Review File Max, Min Values"
  346. 3460       PRINT " 3 -Return to Main Menu"
  347. 3470 PRINT:INPUT "Select Option ",C
  348. 3480 C=INT(C):IF C<1 OR C>3 THEN PRINT "Invalid Choice!":GOTO 3470
  349. 3490 IF C=3 THEN GOTO 2350
  350. 3500 IF C=2 THEN GOTO 3540
  351. 3510 IF C=1 THEN GOTO 3550
  352. 3520 PRINT "Invalid Option!":GOTO 1930
  353. 3530 '
  354. 3540 GOSUB 3560:GOTO 3450
  355. 3550 GOSUB 3780:GOTO 3440
  356. 3560 INPUT "File to be reviewed";F$
  357. 3570 OPEN "I",#1,F$
  358. 3580 COUNT=0
  359. 3590 IF EOF(1) THEN PRINT "Empty File!":GOTO 3560
  360. 3600 INPUT #1,F,X,Y:FMAX=F:FMIN=F:XMAX=X:XMIN=X:YMAX=Y:YMIN=Y:COUNT=1
  361. 3610 IF EOF(1) THEN GOTO 3730
  362. 3620 INPUT #1,F,X,Y
  363. 3630 IF F<FMIN THEN FMIN=F
  364. 3640 IF F>FMAX THEN FMAX=F
  365. 3650 IF X<XMIN THEN XMIN=X
  366. 3660 IF X>XMAX THEN XMAX=X
  367. 3670 IF Y<YMIN THEN YMIN=Y
  368. 3680 IF Y>YMAX THEN YMAX=Y
  369. 3690 COUNT=COUNT+1
  370. 3700 IF EOF(1) THEN GOTO 3720
  371. 3710 GOTO 3620
  372. 3720 PRINT USING "Minimum F = ##.##^^^^        Maximum F = ##.##^^^^";FMIN,FMAX
  373. 3730 PRINT USING "Minimum R = ##.##^^^^        Maximum R = ##.##^^^^";XMIN,XMAX
  374. 3740 PRINT USING "Minimum X = ##.##^^^^        Maximum X = ##.##^^^^";YMIN,YMAX
  375. 3750 PRINT USING "           Elements in file = ####";COUNT
  376. 3760 CLOSE #1
  377. 3770 RETURN
  378. 3780 INPUT "Name of File to Save Data (cr gives directory)";F$
  379. 3790 IF LEN(F$)=0 THEN FILES:GOTO 3780
  380. 3800 IF LEN(F$)=2 AND RIGHT$(F$,1)=":" THEN FILES F$:GOTO 3780
  381. 3810 OPEN "O",1,F$
  382. 3820 FOR J=1 TO N
  383. 3830 PRINT #1,F(J),R(J),I(J)
  384. 3840 NEXT J
  385. 3850 CLOSE #1
  386. 3860 RETURN
  387.