10 REM 74HC4046.BAS 20 REM WRITTEN 10 OCTOBER 2001, REV 0 30 REM REVISIONS: 40 REM SEND BUG REPORTS TO: RUSSELL KINCAID 50 REM 395 SAVAGE ROAD 60 REM MILFORD, NH 03055-3130 90 PI = 3.14159 100 PRINT "THIS PROGRAM DESIGNS A PHASE LOCK LOOP USING THE 74HCT4046A IC" 110 PRINT "THERE ARE 3 PHASE DETECTORS, THE PROGRAM WILL CHOOSE WHICH TO USE" 120 PRINT "BASED ON APPLICATION. YOU NEED ONLY CHOOSE OPERATIONG VOLTAGE (VCC)," 125 PRINT "OPERATING TEMPERATURE and PARAMETERS OF CHOICE." 130 PRINT : PRINT 140 INPUT "WHAT IS THE OPERATING VOLTAGE? (3V MIN, 6V MAX)"; VCC 141 IF VCC>6 THEN PRINT"ABSOLUTE MAX VOLTAGE IS 7, CONTINUE ANYWAY";:INPUT Y$ 142 IF LEFT$(Y$,1)="n" OR LEFT$(Y$,1)="N" THEN END 143 IF VCC<3 THEN PRINT"OPERATION ABOVE VCC=2 VOLTS MAY BE POSSIBLE" 144 REM FIND FMAX=S*VCC+I 145 IF VCC < 3.8 THEN 148 146 FMAX = 1.75 * VCC + 3.1: REM MEGAHERTZ 147 FTYP = 3.18 * VCC + 2.5: GOTO 150 148 FMAX = 3.73 * VCC - 4.47 149 FTYP = 5.77 * VCC - 6.93 150 PRINT "GIVE THE OPERATING TEMPERATURE RANGE:" 152 INPUT "WHAT IS THE LOW TEMP"; TLOW 154 INPUT "WHAT IS THE HIGH TEMP"; THIGH 155 IF TLOW>THIGH THEN PRINT"TRY THAT AGAIN, PLEASE ":GOTO 150 158 IF THIGH-TLOW = 0 THEN 260 160 INPUT "IS THAT DEGREES C (C) OR DEGREES F (F)"; DEG$ 165 IF LEN(DEG$) > 1 THEN PRINT "ONE LETTER PLEASE": GOTO 160 170 IF DEG$ = "C" OR DEG$ = "c" THEN 190 180 IF DEG$ = "F" OR DEG$ = "f" THEN TLOW = (TLOW - 32) * 5 / 9: THIGH = (THIGH - 32) * 5 / 9 190 IF TLOW < -40 OR THIGH > 125 THEN PRINT : PRINT "YOU WILL HAVE TO CONTROL THE TEMPERATURE BETTER": GOTO 150 200 DELTAT = THIGH - TLOW 260 INPUT "WHAT IS THE INSTABILITY OF THE INPUT FREQUENCY (PERCENT)"; DELF2 400 PRINT : PRINT "SELECT THE APPLICATION FROM THIS LIST:" 410 PRINT " 1. RECOVER CARRIER FROM NOISE OR SIDEBANDS" 420 PRINT " 2. DEMODULATE FM SIGNAL" 440 PRINT " 3. DEMODULATE FSK SIGNAL" 450 PRINT " 4. SYNTHESIZE OR MULTIPLY FREQUENCY" 470 PRINT : INPUT "WHICH ONE"; APP 480 ON APP GOTO 1000, 1000, 4000, 5000 1000 REM THIS APP (1) WILL USE THE #1 PHASE DETECTOR 1010 INPUT "WHAT IS THE OSCILLATOR FREQUENCY"; F0 1012 IF FO / 1000000! > FMAX THEN PRINT "OPERATION NOT GUARENTEED, CONTIMUE ANYWAY?": INPUT Y$: GOTO 1018 1014 GOTO 1020 1018 IF LEFT$(Y$, 1) = "Y" OR LEFT$(Y$, 1) = "y" THEN 1020 ELSE END 1020 IF F0 / 1000000! > FTYP THEN PRINT "OPERATION IS NOT LIKELY, CONTINUE ANYWAY?": INPUT Y$: GOTO 1024 1022 GOTO 1026 1024 IF LEFT$(Y$, 1) = "Y" OR LEFT$(Y$, 1) = "y" THEN 1026 ELSE END 1026 INPUT "DO YOU WANT TO CHOOSE THE PLL BANDWIDTH (1) OR LET THE PROGRAM CHOOSE (2)"; BW 1028 ON BW GOTO 1030, 1034 1030 INPUT "WHAT IS THE BANDWIDTH IN Hz"; BW : GOTO 1060 1034 IF APP=1 THEN 1059 1036 INPUT"WHAT IS THE MODULATION BANDWIDTH";BW: GOTO 1060 1059 BW = DELF + .002 * FB 1060 TR = .409 / BW: REM RISE TIME 1070 GOSUB 7000 1220 REM NOW COMPUTE THE OSCILLATOR GAIN, KO BUT FIRST HAVE TO KNOW THE LOCK RANGE (FL) 1230 REM KO=4*FL*PI/((VCC-.9)-.9) 1234 B1 = .18 * VCC - .17 1240 LOG2FL = -1.01 * .4343 * LOG(RC * 1E-09) + B1 1250 FL = 10 ^ (LOG2FL): REM ACTUALLY 2*FL 1280 KO = 2 * FL * PI / ((VCC - .9) - .9) 1290 KP = VCC / PI 1300 REM COMPUTE THE FILTER VALUES. SINCE THE FILTER GAIN IS NOMINALLY 1, COMPUTE CUTOFF FC 1305 IF N > 0 THEN GOLDB = 8.686 * LOG(KO * KP / N): GOTO 1320 1310 GOLDB = 8.686 * LOG(KO * KP): REM OPEN LOOP GAIN IN DB 1320 FX = .159 * 10 ^ (GOLDB / 20): REM FX=ZERO DB INTERCEPT OF OSC ALONE 1330 IF FX > BW THEN 1350 1334 DCGAIN = 8.686 * LOG(BW / FX) 1340 PRINT "YOU MUST ADD GAIN OF "; DCGAIN; " DB" 1344 F1 = BW + .3 * BW: F2 = 0: GOTO 1360 1350 F1 = BW - .5 * BW: F2 = BW + .6 * BW: PRINT "F1="; F1, "F2="; F2 1360 Y = 8.686 * LOG(FX / BW) 1370 F = (Y + Y / 2 + 6) / 20: REM FIND CUTOFF FREQ (FC) 1374 F = 10 ^ F: PRINT "F=FX/FC="; F: REM F=FX/FC 1380 FC = FX / F: REM FC=1/2/PI/R3/C2 - CHOOSE R3 AS LARGE AS PRACTICAL AND COMPUTE C2 1390 IF VCC <= 4.5 THEN R3 = .1 * (66.7 * VCC + 570): REM USE KOHMS & PF 1400 IF VCC > 4.5 THEN R3 = .1 * (325 * VCC + 1750) 1410 C = 1 / 2 / PI / FC / R3 * .001: GOSUB 9180 1411 PRINT "C2 = "; C;" Farads" 1412 C2 = C * 1E+12: R3 = 1 / 2 / PI / FC / C * .001: REM PF & KOHMS 1413 PRINT"R3 = ";R3;" kOhms" 1515 IF F1>BW THEN 1434 1416 R4 = 1 / 2 / PI / F1 / C * .001: REM KOHMS 1420 IF F2=0 THEN 1434 1424 C = 1 / 2 / PI / F2 / R3 * .001: PRINT"R3=";R3,"C=";C:STOP:GOSUB 9180 1430 C3 = C : PRINT"C3 = ";C3;" Farads" 1434 IF APP=4 THEN 6300 1440 INPUT "PREPARE THE PRINTER AND PRESS ENTER WHEN READY", Y$ 1450 GOTO 9300 3999 REM FSK DEMOD ROUTINE 4000 PRINT:INPUT"WHAT IS THE SWITCHING RATE OF THE FSK SIGNAL (HZ)";FSKRATE 4010 FSKPERIOD=1/FSKRATE: REM SET RISE TIME AT 1/10 FSKPERIOD 4020 BW=.409/FSKPERIOD*10 4030 PRINT"GIVE THE UPPER AND LOWER FSK FREQUENCIES:" 4040 INPUT"UPPER FREQUENCY (HZ):";FUP 4050 INPUT"LOWER FREQUENCY (HZ):";FLOW 4060 F0 = (FUP+FLOW)/2 4064 GOSUB 9000 4070 GOTO 1234 : REM REST OF CALCULATION SAME AS APP1 4999 REM APP4 ROUTINE WITH FREQ DIVIDER 5000 PRINT:PRINT" THIS APPLICATION USES THE #2 PHASE DETECTOR WHICH WORKS ON POSITIVE TRANSITIONS" 5010 PRINT"SO THE INPUT DOES NOT HAVE TO BE 50% DUTY CYCLE" 5020 INPUT"WHAT IS THE OSCILLATOR FREQUENCY (HIGHEST, IF SYNTHESIZED)";F0 5040 INPUT "DO YOU WANT TO CHOOSE THE PLL BANDWIDTH (1) OR LET THE PROGRAM CHOOSE (2)"; BW 5050 ON BW GOTO 5060,5070 5060 INPUT "WHAT IS THE BANDWIDTH IN Hz"; BW : GOTO 5114 5070 INPUT "IS THIS SYNTHESIZED (1) OR FIXED FREQUENCY (2)";Y 5080 ON Y GOTO 5090,5110 5090 INPUT"HOW FAST DO YOU NEED THE FREQUENCY TO CHANGE (SECONDS)";TR 5100 BW=.409/TR : GOTO 5114 5110 BW=1 5114 GOSUB 7000 5120 GOTO 1234 6300 INPUT "PREPARE THE PRINTER AND PRESS ENTER WHEN READY", Y$ 6310 OPEN "PRN" FOR OUTPUT AS #1 6320 PRINT #1, DATE$, TIME$ 6330 PRINT #1, "PHASE LOCK LOOP DESIGN FOR 74HCT4046A IC WITH VCC = ";VCC;" VOLTS" 6334 PRINT#1,"OPERATING TEMPERATURE RANGE:";TLOW;" TO ";THIGH;" DEGREES ";DEG$ 6340 PRINT #1, "LOOP PARAMETERS:" 6350 PRINT#1,"F1=";F1,"F2=";F2,"FX=";FX 6360 PRINT #1, "PHASE DET. GAIN", "OSCILLATOR GAIN", "FREQ. DIVIDER RATIO" 6370 PRINT #1, " "; KP, " "; KO, " "; N 6380 PRINT #1, "FREQUENCY OUTPUT = "; F0; " Hz" 6390 PRINT #1, "R3,C2 CUTOFF = "; FC; " Hz" 6400 PRINT #1, "CLOSED LOOP BANDWIDTH = "; BW, " Hz" 6410 IF N = 0 THEN 6430 6420 PRINT #1, "FREQUENCY LOCK RANGE = "; FL * N / 2; " Hz": GOTO 6440 6430 PRINT #1, "FREQUENCY LOCK RANGE = "; FL / 2; " Hz" 6440 PRINT #1, : PRINT #1, "THIS IS THE SCHEMATIC:" 6450 PRINT #1, " |---DEMOD OUT" 6460 PRINT #1, " --------- ------|-----------" 6470 PRINT #1, "SIG IN--|14 13|---R3-----|--|---|9 10 4|---------|--Fout" 6480 PRINT #1, " |DEMOD | R4 | | OSCILLATOR | |" 6490 PRINT #1, " |----|3 1|--| | C3 | 5|-----| |" 6500 PRINT #1, " | --------- R5 C2 | | 11 12 6 7 | GND |" 6510 PRINT #1, " | | | GND --|------|----|-- |" 6520 PRINT #1, " | LED GND R1 |-C1-| |" 6530 PRINT #1, " | | | |" 6540 PRINT #1, " | GND GND |" 6550 IF N > 0 THEN 6580 6560 PRINT #1, " |---------------------------------------------------------|" 6570 GOTO 6610 6580 PRINT #1, " | --------------- |" 6590 PRINT #1, " |----------| DIVIDE BY N |-------------------------------|" 6600 PRINT #1, " ---------------" 6610 PRINT #1, "VCC AT PIN 16, GND AT PIN 8" 6620 PRINT #1, "NOTE: USE LOGIC LEVELS AT SIG IN" 6630 PRINT #1, "COMPONENT VALUES (R IN KOHMS, C IN PF):" 6640 PRINT #1, " R1", " C1", " R3", " R4", " C2" 6650 PRINT #1, INT(R1 * 100 + .5) / 100; "K", C1; "PF", INT(R3 * 100 + .5) / 100; "K", INT(R4 * 100 + .5) / 100; "K", C2; "PF" 6660 PRINT #1, " C3" 6670 PRINT #1, C3 * 1E+12; "PF" 6680 PRINT #1, 6690 PRINT #1, "R1 TOLERANCE = "; R1TOL; " PERCENT", "C1 TOLERANCE = "; C1TOL; " PERCENT" 6700 GOTO 9700 7000 GOSUB 9000: REM COMPUTE THE R & C FOR THE VCO 7010 C1 = C: R1 = RC / C1 7020 PRINT : PRINT "R1 = "; R1; " KOHMS", "C1 = "; C1; " PF": PRINT 7030 REM SENS=OSC TEMP SENSITIVITY IN %/DEG C 7034 IF THIGH-TLOW=0 THEN 7160 7040 IF R1 >= 10 AND VCC >= 4.5 THEN SENS = (3.4E-07 * R1 + .097) / (.22 * VCC + .35) 7050 IF R1 < 10 AND VCC < 4.5 THEN SENS = (8.300001E-06 * R1) / (.61 * VCC - .83) 7060 IF R1 < 10 AND VCC >= 4.5 THEN SENS = (8.300001E-06 * R1) / (2.05 * VCC - 4.6) 7070 PRINT "SENS="; SENS: DELF0 = SENS * DELTAT / 100 7080 PRINT "WILL YOU GIVE THE TEMPERATURE STABILITY OF THE R & C USED IN THE VCO" 7090 PRINT "IN % PER DEGREE C (1) , OR PERCENT TOTAL OVER THE TEMP RANGE (2)" 7100 INPUT "WHICH ONE"; STAB 7110 ON STAB GOTO 7120,7140 7120 INPUT " %/DEG C OF R"; STABR: INPUT " %/deg c of C"; STABC: STABRC = (STABR + STABC) * DELTAT 7130 GOTO 7150 7140 INPUT "TOTAL % CHANGE IN R & C (TOGETHER)"; STABRC 7150 PRINT "GIVE R1,C1 TOLERANCE UNLESS USING TUNING POT. THEN TOLERANCE=0" 7160 INPUT "WHAT IS THE TOLERANCE OF R1 IN PERCENT"; R1TOL 7170 INPUT "WHAT IS THE TOLERANCE OF C1 IN PERCENT"; C1TOL 7180 STABRC = STABRC / 100 + C1TOL / 100 + R1TOL / 100 7190 DELF = STABRC * F0 + DELF2 / 100 * F0 + DELF0 * F0: PRINT : PRINT "FREQUENCY TOLERANCE = "; DELF; " Hz" 7200 INPUT "IS THERE A FREQUENCY DIVIDER IN THE FEEDBACK (Y OR N)"; Y$ 7210 IF LEFT$(Y$, 1) = "N" OR LEFT$(Y$, 1) = "n" THEN FB = F0: GOTO 7240 7220 INPUT "WHAT IS THE DIVIDER RATIO (USE THE MIN, IF PROGRAMMABLE)"; N: FB = F0 / N: DELF = DELF / N 7230 PRINT : PRINT "NOTE: THE BANDWIDTH IS COMPUTED RELATIVE TO THE DIVIDED FREQ.": PRINT 7240 RETURN 9000 REM COMPUTE THE R1 & C1 FOR THE VCO 9010 IF F0 > 4000000! THEN RC = 3.3E+09 / FO ELSE 9030 9011 R1 = 3: PRINT "9010, RC="; RC, "R1="; R1: REM R1 IN KOHMS, C1 IN PF 9012 RELRC = -.36 * VCC + 2.8: RC = RELRC * RC: PRINT "9012, RELRC="; RELRC, "RC="; RC: STOP 9020 GOTO 9050 9030 IF F0 >= 10000! THEN RC = 4E+09 / F0 ELSE 9040 9031 R1 = 10: RELRC = -.28 * VCC + 2.4: RC = RC * RELRC 9035 GOTO 9050 9040 IF F0 >= 100! THEN RC = 4.580001E+09 / F0 ELSE 9046 9041 R1 = 150 9042 IF VCC < 4.5 THEN RELRC = -.13 * VCC + 1.79 9044 IF VCC >= 4.5 THEN RELRC = -.4 * VCC + 3 9045 RC = RC * RELRC: GOTO 9050 9046 IF F0 < 100! THEN RC = 4.8E+09 / F0: R1 = 300 9047 IF VCC < 4.5 THEN RELRC = -.147 * VCC + 1.89 9048 IF VCC >= 4.5 THEN RELRC = -.46 * VCC + 3.3 9049 RC = RC * RELRC 9050 C = RC / R1:PRINT"C1 = ";C;" PF LINE 9050": REM PF 9060 FOR X = 1 TO 8 9070 IF C / 10 ^ X > 1 AND C / 10 ^ X <= 10 THEN 9090 9080 NEXT X 9090 C = C / 10 ^ X 9100 IF C > 1 AND C <= 1.5 THEN C = 1.5 * 10 ^ X: GOTO 9170: REM PF 9110 IF C > 1.5 AND C <= 2.2 THEN C = 2.2 * 10 ^ X: GOTO 9170 9120 IF C > 2.2 AND C <= 3.3 THEN C = 3.3 * 10 ^ X: GOTO 9170 9130 IF C > 3.3 AND C <= 4.7 THEN C = 4.7 * 10 ^ X: GOTO 9170 9140 IF C > 4.7 AND C <= 6.8 THEN C = 6.8 * 10 ^ X: GOTO 9170 9150 IF C > 6.8 AND C <= 10 THEN C = 10 * 10 ^ X 9170 PRINT"C = ";C:STOP: RETURN 9180 FOR X = -1 TO -12 STEP -1 9190 IF C / 10 ^ X > 1 AND C / 10 ^ X <= 10 THEN 9210 9200 NEXT X 9210 C = C / 10 ^ X 9220 IF C > 1 AND C <= 1.5 THEN C = 1.5 * 10 ^ X: GOTO 9280: REM PF 9230 IF C > 1.5 AND C <= 2.2 THEN C = 2.2 * 10 ^ X: GOTO 9280 9240 IF C > 2.2 AND C <= 3.3 THEN C = 3.3 * 10 ^ X: GOTO 9280 9250 IF C > 3.3 AND C <= 4.7 THEN C = 4.7 * 10 ^ X: GOTO 9280 9260 IF C > 4.7 AND C <= 6.8 THEN C = 6.8 * 10 ^ X: GOTO 9280 9270 IF C > 6.8 AND C <= 10 THEN C = 10 * 10 ^ X 9280 RETURN 9300 REM OPTION 1 OUTPUT 9310 OPEN "PRN" FOR OUTPUT AS #1 9320 PRINT #1, DATE$, TIME$ 9322 IF APP=4 THEN STOP 9330 PRINT #1, "PHASE LOCK LOOP DESIGN FOR 74HCT4046A IC WITH VCC = ";VCC;" VOLTS" 9334 PRINT #1,"OPERATING TEMPERATURE RANGE:";TLOW;" TO ";THIGH;" DEGREES ";DEG$ 9340 PRINT #1, "LOOP PARAMETERS:" 9350 PRINT#1,"F1=";F1,"F2=";F2,"FX=";FX 9360 PRINT #1, "PHASE DET. GAIN", "OSCILLATOR GAIN", "FREQ. DIVIDER RATIO" 9370 PRINT #1, " "; KP, " "; KO, " "; N 9380 PRINT #1, "FREQUENCY OUTPUT = "; F0; " Hz" 9390 PRINT #1, "R3,C2 CUTOFF = "; FC; " Hz" 9400 PRINT #1, "CLOSED LOOP BANDWIDTH = "; BW, " Hz" 9410 IF N = 0 THEN 9430 9420 PRINT #1, "FREQUENCY LOCK RANGE = "; FL * N / 2; " Hz": GOTO 9440 9430 PRINT #1, "FREQUENCY LOCK RANGE = "; FL / 2; " Hz" 9440 PRINT #1, : PRINT #1, "THIS IS THE SCHEMATIC:" 9450 PRINT #1, " |---DEMOD OUT" 9460 PRINT #1, " --------- ------|-----------" 9470 PRINT #1, "SIG IN--|14 2|---R3-----|--|---|9 10 4|---------|--Fout" 9480 PRINT #1, " |DEMOD | R4 | | OSCILLATOR | |" 9490 PRINT #1, " |----|3 | | C3 | 5|-----| |" 9500 PRINT #1, " | --------- C2 | | 11 12 6 7 | GND |" 9510 PRINT #1, " | | GND --|------|----|-- |" 9520 PRINT #1, " | GND R1 |-C1-| |" 9530 PRINT #1, " | | |" 9540 PRINT #1, " | GND |" 9550 IF N > 0 THEN 9580 9560 PRINT #1, " |---------------------------------------------------------|" 9570 GOTO 9610 9580 PRINT #1, " | --------------- |" 9590 PRINT #1, " |----------| DIVIDE BY N |-------------------------------|" 9600 PRINT #1, " ---------------" 9610 PRINT #1, "VCC AT PIN 16, GND AT PIN 8" 9620 PRINT #1, "NOTE: USE CAPACITIVE COUPLING AT SIG IN IF LESS THAN LOGIC LEVELS" 9630 PRINT #1, "COMPONENT VALUES (R IN KOHMS, C IN PF):" 9640 PRINT #1, " R1", " C1", " R3", " R4", " C2" 9650 PRINT #1, INT(R1 * 100 + .5) / 100; "K", C1; "PF", INT(R3 * 100 + .5) / 100; "K", INT(R4 * 100 + .5) / 100; "K", C2; "PF" 9660 PRINT #1, " C3" 9670 PRINT #1, C3 * 1E+12; "PF" 9680 PRINT #1, 9690 PRINT #1, "R1 TOLERANCE = "; R1TOL; " PERCENT", "C1 TOLERANCE = "; C1TOL; " PERCENT" 9700 PRINT #1, CHR$(12) 9710 CLOSE #1: GOTO 9999 9999 END