10 ' ATT.BAS an attenuator design program by G4PMK 20 ' copyright R P Blackwell 1990. 30 ' version 1.2 23 October 1990 40 DIM R(26) 60 DEF FNA (X) = (INT(10 * X + .5)) / 10 70 DEF FNZ (X) = INT(200 * LOG(X) / LOG(10)) / 10 80 DEF FNB (X) = INT(10 * X) / 10 90 DEF FNC (X) = INT(LOG(X) / LOG(10)) ' number to integer power of 10 100 DEF FND (X) = VAL("1E" + STR$(INT(X)))' power of 10 in integer to number 110 KEY OFF: CLS : COLOR 11, 0: LOCATE 1, 20 120 PRINT " ATT - attenuator design by G4PMK" 130 COLOR 7, 0 140 PRINT : PRINT 150 PRINT " This program designs symmetrical T and ã attenuators for any system impedance." 160 PRINT 170 PRINT " It calculates exact values, then also gives performance for attenuators" 180 PRINT " built with the nearest E12 preferred values. Power dissipation for" 190 PRINT " each resistor is also shown." 191 PRINT 192 PRINT " VSWR and return loss for each practical attenuator are also shown." 200 PRINT 210 PRINT " This program is suitable for attenuators in the range 0.5 to 50dB." 220 PRINT 230 PRINT : PRINT " To finish the program enter an attenuation of 0 (zero)." 240 PRINT 270 PRINT " Do you wish to use E12 - a" 271 PRINT " or E24 - b preferred values?" 272 COLOR 11, 0: PRINT : PRINT " press a or b (A/b) > "; 273 ZZ$ = INPUT$(1): IF ZZ$ = "B" OR ZZ$ = "b" THEN J = 25 ELSE J = 13 274 IF J = 25 THEN RESTORE 1365: FOR I = 1 TO 25: READ R(I): NEXT 275 IF J = 13 THEN RESTORE 1360: FOR I = 1 TO 13: READ R(I): NEXT 277 CLS 280 COLOR 3 290 GOSUB 1370: PRINT " Attenuation range is 0.5 to 50dB. quits this program."; 300 COLOR 7, 0 310 LOCATE 10, 10 320 INPUT " Desired attenuation (dB): ", DB: IF DB <= 0 THEN CLS : COLOR 7, 0: END 330 IF DB > 50 OR DB < .5 THEN BEEP: COLOR 4, 0: LOCATE 12, 12: PRINT "Impractical value": FOR K = 1 TO 2000: NEXT: CLS : GOTO 280 340 COLOR 3, 0 350 GOSUB 1370: PRINT " Power input range is 0.5 to 100W gives the default of 1.0W"; 360 AV = 10 ^ (DB / 20) 370 COLOR 7, 0 380 LOCATE 10, 10 390 GOSUB 1420 400 INPUT " Maximum Input power (W): ", W: PRINT 410 IF W = 0 THEN W = 1 420 IF W < .5 OR W > 100 THEN BEEP: COLOR 4, 0: LOCATE 12, 12: PRINT "Impractical value": FOR K = 1 TO 2000: NEXT: CLS : GOTO 370 430 GOSUB 1370 440 COLOR 3, 0 450 PRINT " Enter the system impedance 5 to 999ê gives the default of 50ê"; 460 LOCATE 10, 10 470 COLOR 7, 0 480 GOSUB 1420 490 INPUT "Enter system Zo (ê) : ", Z: IF Z = 0 THEN Z = 50 500 IF Z < 5 OR Z > 999 THEN BEEP: COLOR 4, 0: LOCATE 12, 12: PRINT "Impractical value": FOR K = 1 TO 2000: NEXT: CLS : GOTO 430 510 VIN = SQR(W * Z): VOUT = VIN / AV 520 DV = VIN - VOUT 530 R1P = Z * (AV + 1) / (AV - 1): P1P = VIN * VIN / R1P: IF P1P < .1 THEN P1P = .1 540 R2P = Z * (AV * AV - 1) / (2 * AV): P2P = DV * DV / R2P: IF P2P < .1 THEN P2P = .1 550 R3P = R1P: P3P = VOUT * VOUT / R3P: IF P3P < .1 THEN P3P = .1 560 R1T = Z * (AV - 1) / (AV + 1): R3T = R1T 570 VMID = VOUT * (R3T + Z) / Z 580 DV = VIN - VMID: P1T = DV * DV / R1T: IF P1T < .1 THEN P1T = .1 590 R2T = Z * 2 * AV / (AV * AV - 1) 600 P2T = VMID * VMID / R2T: IF P2T < .1 THEN P2T = .1 610 DV = VMID - VOUT: P3T = DV * DV / R3T: IF P3T < .1 THEN P3T = .1 620 CLS : COLOR 11, 0 630 GOSUB 1370 640 PRINT USING " ##.#dB attenuator max input ###W system impedance ###ê"; DB; W; Z; 650 GOSUB 950 660 ' 670 COLOR 7, 0 680 PRINT 690 PRINT USING " R1 ######.#ê ##.#W R1 ######.#ê ##.#W "; FNA(R1T); FNA(P1T); FNA(R1P); FNA(P1P) 700 PRINT USING " R2 ######.#ê ##.#W R2 ######.#ê ##.#W "; FNA(R2T); FNA(P2T); FNA(R2P); FNA(P2P) 710 PRINT USING " R3 ######.#ê ##.#W R3 ######.#ê ##.#W "; FNA(R3T); FNA(P3T); FNA(R3P); FNA(P3P) 720 PRINT 730 COLOR 14, 0 740 PRINT " Practical values"; 741 IF J = 25 THEN PRINT " using E24 resistors" ELSE PRINT " using E12 resistors" 750 COLOR 7, 0 760 PRINT 770 RR = R1T: GOSUB 1120: R1T = RR: PRINT TAB(7); "R1 "; : GOSUB 1220: PRINT Z$; 780 RR = R1P: GOSUB 1120: R1P = RR: PRINT TAB(46); "R1 "; : GOSUB 1220: PRINT Z$ 790 RR = R2T: GOSUB 1120: R2T = RR: PRINT TAB(7); "R2 "; : GOSUB 1220: PRINT Z$; 800 RR = R2P: GOSUB 1120: R2P = RR: PRINT TAB(46); "R2 "; : GOSUB 1220: PRINT Z$ 810 RR = R3T: GOSUB 1120: R3T = RR: PRINT TAB(7); "R3 "; : GOSUB 1220: PRINT Z$; 820 RR = R3P: GOSUB 1120: R3P = RR: PRINT TAB(46); "R3 "; : GOSUB 1220: PRINT Z$ 830 RX = 1 / ((1 / R2T) + 1 / (R3T + Z)): A = 1 / ((RX / (RX + R1T)) * Z / (Z + R3T)) 840 DBT = 20 * LOG(A) / LOG(10) 845 RHOT = (R1T + RX - Z) / (R1T + RX + Z): RHOT = ABS(RHOT) 846 SWRT = (1 + RHOT) / (1 - RHOT): RLT = FNZ(RHOT) 850 PRINT 860 PRINT USING " attenuation ##.##dB"; DBT; 870 PRINT TAB(40); 880 RX = 1 / ((1 / R3P) + (1 / Z)) 885 RY = RX + R2P: RZ = 1 / ((1 / RY) + (1 / R1P)) 886 RHOP = (RZ - Z) / (RZ + Z): RHOP = ABS(RHOP) 887 SWRP = (1 + RHOP) / (1 - RHOP): RLP = FNZ(RHOP) 890 A = RY / RX 900 DBP = 20 * LOG(A) / LOG(10) 910 PRINT USING " attenuation ##.##dB"; DBP 915 PRINT USING " Rtn loss +##.#dB VSWR #.###"; RLT; SWRT; 916 PRINT TAB(40); 917 PRINT USING " Rtn loss +##.#dB VSWR #.###"; RLP; SWRP; 920 PRINT : PRINT 930 PRINT " Press space to continue > "; : ZZ$ = INPUT$(1) 940 CLS : GOTO 280 950 CLS 2 960 COLOR 11, 0 970 COLOR 7, 0 980 PRINT " ÄÄÄ R1 ÄÄÄÂÄÄÄ R3 ÄÄÄ ÄÄÄÄÂÄÄÄ R2 ÄÄÄÂÄÄÄÄ" 990 PRINT " ³ ³ ³" 1000 PRINT 1010 PRINT " R2 R1 R3" 1020 PRINT 1030 PRINT " ³ ³ ³" 1040 PRINT " ÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄ" 1050 COLOR 11, 0 1060 PRINT " T attenuator ã attenuator" 1070 COLOR 14, 0 1080 PRINT " exact values" 1090 COLOR 7, 0 1100 RETURN 1110 ' pref value routine 1120 Y = FNC(RR): RVAL = RR / FND(Y) 1130 I = 1 1140 WHILE RVAL >= R(I) 1150 I = I + 1 1160 WEND 1170 IF R(I) - RVAL > (R(I) - R(I - 1)) / 2 THEN I = I - 1 1180 IF J = 13 THEN IF I = 13 THEN I = 1: Y = Y + 1 1185 IF J = 25 THEN IF I = 25 THEN I = 1: Y = Y + 1 1190 RR = R(I) * FND(Y) 1200 RETURN 1210 ' Pretty-print resistors 1220 Y = FNC(RR) 1230 Q = RR / FND(Y): IF Q = 10 THEN Y = Y + 1 1240 Z$ = STR$(R(I)) 1250 IF Z$ = " 1" THEN Z$ = " 1.0" 1252 IF Z$ = " 2" THEN Z$ = " 2.0" 1253 IF Z$ = " 3" THEN Z$ = " 3.0" 1260 Z$ = MID$(Z$, 2, LEN(Z$) - 1) 1270 L$ = LEFT$(Z$, 1): R$ = RIGHT$(Z$, 1) 1280 V = INT(Y / 3) + 1 1290 M$ = "R": IF V > 1 THEN M$ = "k": IF V > 2 THEN M$ = "M" 1300 IF Y = -1 THEN Z$ = M$ + L$ + R$ 1310 IF Y = 0 OR Y = 3 OR Y = 6 THEN Z$ = L$ + M$ + R$ 1320 IF Y = 1 OR Y = 4 OR Y = 7 THEN Z$ = L$ + R$ + M$ 1330 IF Y = 2 OR Y = 5 OR Y = 8 THEN Z$ = L$ + R$ + "0" + M$ 1340 IF LEN(Z$) < 4 THEN Z$ = " " + Z$: GOTO 1340 1350 RETURN 1360 DATA 1,1.2,1.5,1.8,2.2,2.7,3.3,3.9,4.7,5.6,6.8,8.2,10 1365 DATA 1,1.1,1.2,1.3,1.5,1.6,1.8,2.0,2.2,2.4,2.7,3.0 1366 DATA 3.3,3.6,3.9,4.3,4.7,5.1,5.6,6.2,6.8,7.5,8.2,9.1,10 1370 ' clear line 25 1380 LOCATE 25, 1 1390 PRINT SPACE$(79); 1400 LOCATE 25, 1 1410 RETURN 1420 ' clear eol 1430 OLDPOS = POS(0) 1440 OLDLINE = CSRLIN 1450 PRINT SPACE$(78 - OLDPOS); 1460 LOCATE OLDLINE, OLDPOS 1470 RETURN