10 !PROGRAM MEASURES LOW FREQ RMS VOLTAGES (<1KHz) 01/30/92 20 !RE-STORE "GODS_AC" 30 ! 40 !CAN BE ACCURATE TO 0.001% IF Meas_time>30 50 !NOTES: 60 !1. DISTORTED SINEWAVES HAVE HIGHER FREQ HARMONICS 70 ! THAT MAY NOT BE MEASURED IF MEASUREMENT BANDWIDTH IS TOO LOW. 80 ! COMPUTED ERROR IS INCLUDED FOR UP TO 1% HARMONIC DISTORTION. 90 ! THIS ERROR CAN BE REDUCED BY USING SMALLER Aper_targ(LINE 360) 100 !2. ESPECIALLY AT LOW SIGNAL LEVELS, TWO AC VOLTMETERS WITH "PERFECT" 110 ! ACCURACY MAY READ DIFFERENTLY IF THEY HAVE DIFFERENT 120 ! NOISE BANDWIDTHS. THIS IS TRUE ONLY IF THE SIGNAL BEING MEASURED 130 ! CONTAINS APPRECIABLE HIGH FREQUENCY NOISE OR SPURIOUS SIGNALS. 140 ! THIS PROGRAM DISPLAYS THE MEASUREMENT BANDWIDTH WHEN RUN. 150 ! THIS BANDWIDTH VARIES DEPENDING ON Freq. IT IS APPROX= .5/Aper_targ. 160 ! ALSO, MAKING Nharm(LINE 370) HIGHER CAN INCREASE BANDWIDTH, BUT 170 ! CAN HURT BASIC ACCURACY BY FORCING SMALL A/D APERTURES. 180 ! 190 ! 200 !------------------------ MODIFIABLE VARIABLES 210 ! 220 ASSIGN @Vmeter TO 724 !VOLTMETER ADDRESS 230 Meas_time=15 !TARGET MEASUREMENT TIME (SEC) 240 ! 250 ! 260 !------------------------ LESS COMMONLY MODIFIED VARIABLES 270 ! 280 Forcefreq=0 !1=INPUT FREQ. OF SIGNAL, 0= AUTOMATIC IF>1Hz 290 Force=0 !1=FORCE SAMP. PARAMETERS, 0= AUTOMATIC 300 Tsampforce=.001 ! FORCED PARAMETER 310 Aperforce=Tsampforce-3.E-5! FORCED PARAMETER 320 Numforce=800 ! FORCED PARAMETER 330 Aper_targ=.001 !A/D APERTURE TARGET (SEC) 340 Nharm=6 !MINIMUM # HARMONICS SAMPLED BEFORE ALIAS 350 Nbursts=6 !NUMBER OF BURSTS USED FOR EACH MEASUREMENT 360 !------------------------------------------------------ 370 ! 380 OUTPUT 2 USING "#,B,B";255,75 !CLEAR DISPLAY 390 PRINT "" 400 PRINT "*********************************" 410 PRINT "" 420 PRINT "ENTER EXPECTED RMS VALUE OF SIGNAL TO BE MEASURED WITHIN 10%" 430 PRINT "SMALLEST MEASURABLE VOLTAGE IS 1mV, LARGEST IS 700V" 440 PRINT "" 450 PRINT "*********************************" 460 INPUT "ENTER EXPECTED RMS VALUE OF SIGNAL TO BE MEASURED +-10%",Expect 470 Expect=1.55*Expect !PEAK VALUE *1.1 480 IF Expect<.12 THEN 490 Range=.1 500 END IF 510 IF Expect>=.12 AND Expect<1.2 THEN 520 Range=1 530 END IF 540 IF Expect>=1.2 AND Expect<12 THEN 550 Range=10 560 END IF 570 IF Expect>=12 AND Expect<120 THEN 580 Range=100 590 END IF 600 IF Expect>=120 THEN 610 Range=1000 620 END IF 630 OUTPUT 2 USING "#,B,B";255,75 !CLEAR DISPLAY 640 CLEAR @Vmeter 650 OUTPUT @Vmeter;"RESET;DCV 1000" 660 DISP "APPLY INPUT SIGNAL, LET SETTLE, PRESS CONT" 670 BEEP 2500,.05 680 PAUSE 690 DISP "" 700 OUTPUT @Vmeter;"DISP OFF,***GOD'S_AC***" 710 IF Forcefreq=1 THEN !IF MANUALLY ENTERING FREQUENCY 720 BEEP 2500,.1 730 INPUT "ENTER FREQ",Freq 740 ELSE 750 Freq=FNFreq(Expect,@Vmeter) !GET INPUT SIGNAL FREQUENCY 760 END IF 770 IF Force=1 THEN !IF NOT GETTING PARAMETERS AUTOMATICALLY 780 Tsamp=Tsampforce 790 Aper=Aperforce 800 Num=Numforce 810 ELSE !AUTOMATICALLY GET SAMPLING PARAMETERS 820 Samp_parm(Tsamp,Aper,Num,Freq,Meas_time,Aper_targ,Nharm,Nbursts) 830 END IF 840 ! 850 !------------------------------SETUP HP3458A 860 ! 870 OUTPUT @Vmeter;"TARM HOLD;AZERO OFF;DCV ";Range 880 OUTPUT @Vmeter;"APER ";Aper;";NRDGS ";Num;",TIMER" 890 OUTPUT @Vmeter;"TIMER ";Tsamp 900 OUTPUT @Vmeter;"TRIG LEVEL;LEVEL 0,DC;DELAY 0;LFILTER ON" 910 OUTPUT @Vmeter;"MSIZE?" 920 ENTER @Vmeter;Storage 930 Storage=INT(Storage/4) !STORAGE CAPACITY IN VOLTMETER (DINT DATA) 940 IF Num>Storage THEN 950 PRINT "******** NOT ENOUGH VOLTMETER MEMORY FOR NEEDED SAMPLES ***" 960 PRINT " TRY A LARGER Aper_targ VALUE OR SMALLER Num" 970 BEEP 200,1 980 STOP 990 END IF 1000 WAIT .1 1010 !-------------------------------------------- 1020 ! 1030 !--------------------------------- PRELIMINARY COMPUTATIONS 1040 ! 1050 X=PI*Aper*Freq 1060 Sinc=SIN(X)/X !USED TO CORRECT FOR A/D APERTURE ERROR 1070 Bw_corr=FNVmeter_bw(Freq,Range) !USED TO CORRECT FOR Vmeter BANDWIDTH 1080 Err_est(Err,Dist_er,Freq,Range,Num,Aper,Nbursts)!MEASUREMENT UNCERTAINTY 1090 IF Force=1 THEN 1100 PRINT "****** PARAMETERS ARE FORCED, ACCURACY MAY BE DEGRADED! ******" 1110 END IF 1120 PRINT "SIGNAL FREQUENCY(Hz)= ";Freq 1130 PRINT "Number of samples in each of";Nbursts;"bursts= ";Num 1140 PRINT "Sample spacing(sec)= ";Tsamp 1150 PRINT "A/D Aperture(sec)= ";Aper 1160 PRINT "Measurement bandwidth(Hz)= ";INT(5/Aper)/10 1170 PRINT "ESTIMATED TOTAL SINEWAVE MEASUREMENT UNCERTAINTY(ppm)= ";Err 1180 PRINT "ADDITIONAL ERROR FOR 1% DISTORTION(3rd HARMONIC)(ppm)= ";Dist_er 1190 PRINT "NOTE: ERROR ESTIMATE ASSUMES (ACAL DCV) PERFORMED RECENTLY(24HRS)" 1200 !---------------------------------------- 1210 ! 1220 ! 1230 Start: PRINT "" 1240 OUTPUT @Vmeter;"DISP OFF,***GOD'S_AC***" 1250 PRINT "The";Nbursts;"intermediate results:" 1260 Begin=TIMEDATE 1270 Sum=0 1280 Sumsq=0 1290 FOR I=0 TO Nbursts-1 1300 Delay=I/Nbursts/Freq+1.E-6 1310 OUTPUT @Vmeter;"DELAY ";Delay 1320 OUTPUT @Vmeter;"TIMER ";Tsamp 1330 CALL Stat(Mean,Sdev,Num,@Vmeter) !MAKE MEASUREMENT 1340 Sumsq=Sumsq+Sdev*Sdev+Mean*Mean 1350 Sum=Sum+Mean 1360 Temp=Sdev*Bw_corr/Sinc !CORRECT A/D Aper AND Vmeter B.W. 1370 Temp=Range/1.E+7*INT(Temp*1.E+7/Range)!6 DIGIT TRUNCATION 1380 PRINT Temp 1390 NEXT I 1400 Dcrms=SQR(Sumsq/Nbursts) 1410 Dc=Sum/Nbursts 1420 Acrms=Dcrms*Dcrms-Dc*Dc 1430 IF Acrms<0 THEN Acrms=0 !PROTECTION FOR SQR OF NEG NUMBER 1440 Acrms=SQR(Acrms) 1450 Acrms=Acrms*Bw_corr/Sinc !CORRECT A/D Aper AND Vmeter B.W. 1460 Dcrms=SQR(Acrms*Acrms+Dc*Dc) 1470 End=TIMEDATE 1480 Acrms=Range/1.E+7*INT(Acrms*1.E+7/Range+.5) !6 DIGIT TRUNCATION 1490 Dcrms=Range/1.E+7*INT(Dcrms*1.E+7/Range+.5) !6 DIGIT TRUNCATION 1500 ! 1510 !********************** PRINT RMS VALUES *************** 1520 PRINT "AC RMS VOLTAGE= ",Acrms 1530 PRINT "ACDC RMS VOLTAGE= ",Dcrms 1540 DISP USING "K,DDD.DDD";"PRESS CONT FOR NEW READING IF SAME FREQ, MEASUREMENT TIME(sec)= ",End-Begin 1550 OUTPUT @Vmeter;"DISP OFF,";"'";Acrms;" VAC'" 1560 PAUSE 1570 DISP "" 1580 GOTO Start 1590 END 1600 SUB Stat(REAL Mean,Sdev,Num,@Vmeter) 1610 OUTPUT @Vmeter;"MEM FIFO;MFORMAT DINT;TARM SGL" 1620 OUTPUT @Vmeter;"MMATH STAT" 1630 OUTPUT @Vmeter;"RMATH SDEV" 1640 ENTER @Vmeter;Sdev 1650 OUTPUT @Vmeter;"RMATH MEAN" 1660 ENTER @Vmeter;Mean 1670 Sdev=SQR(Sdev*Sdev*(Num-1)/Num) !CORRECT SDEV FORMULA 1680 SUBEND 1690 DEF FNFreq(Expect,@Vmeter) 1700 OUTPUT @Vmeter;"TARM HOLD;LFILTER ON;LEVEL 0,DC;FSOURCE ACDCV" 1710 OUTPUT @Vmeter;"FREQ ";Expect*.9 1720 OUTPUT @Vmeter;"CAL? 245" 1730 ENTER @Vmeter;Cal !FREQUENCY CAL VALUE 1740 OUTPUT @Vmeter;"TARM SGL" 1750 ENTER @Vmeter;Freq 1760 Freq=Freq/Cal !UNCALIBRATED FREQUENCY IS USED 1770 ! FOR MORE ACCURATE SAMPLE DETERMINATION 1780 ! SINCE TIMER IS UNCALIBRATED 1790 IF Freq=0 THEN 1800 BEEP 2500,.1 1810 INPUT "FREQ MEASUREMENT WAS 0, PLEASE ENTER THE FREQ",Freq 1820 IF Freq>1 THEN 1830 BEEP 200,.1 1840 PRINT "******************** WARNING!! ******************" 1850 PRINT "WARNING!! AUTOMATIC FREQUENCY MEASUREMENT SHOULD HAVE WORKED" 1860 DISP "PRESS CONT BUT NOTE THAT LEVEL TRIGGERING MAY FAIL" 1870 PRINT "*************************************************" 1880 PRINT "" 1890 PAUSE 1900 END IF 1910 END IF 1920 RETURN Freq 1930 FNEND 1940 DEF FNVmeter_bw(Freq,Range) 1950 Lvfilter=120000 !LOW VOLTAGE INPUT FILTER B.W. 1960 Hvattn=36000 !HIGH VOLTAGE ATTENUATOR B.W.(NUMERATOR) 1970 Gain100bw=82000 !AMP GAIN 100 B.W. PEAKING CORRECTION! 1980 IF Range<=.12 THEN 1990 Bw_corr=(1+(Freq/Lvfilter)^2)/(1+(Freq/Gain100bw)^2) 2000 Bw_corr=SQR(Bw_corr) 2010 END IF 2020 IF Range>.12 AND Range<=12 THEN 2030 Bw_corr=(1+(Freq/Lvfilter)^2) 2040 Bw_corr=SQR(Bw_corr) 2050 END IF 2060 IF Range>12 THEN 2070 Bw_corr=(1+(Freq/Hvattn)^2) 2080 Bw_corr=SQR(Bw_corr) 2090 END IF 2100 RETURN Bw_corr 2110 FNEND 2120 SUB Err_est(Err,Dist,Freq,Range,Num,Aper,Nbursts) 2130 ! 2140 !Base IS THE BASIC NPLC 100 DCV 1YR ACCURACY, THIS NUMBER CAN BE 2150 !SUBSTANTIALLY LOWER FOR HIGH STABILITY OPTION AND 90DAY CAL CYCLES 2160 IF Range>120 THEN !SELF HEATING +BASE ERROR 2170 Base=15 2180 ELSE 2190 Base=10 !BASIC 1YR ERROR(ppm) 2200 END IF 2210 ! 2220 ! 2230 !Vmeter_bw IS ERROR DUE TO UNCERTAINTY IN KNOWING THE HIGH FREQUENCY 2240 !RESPONSE OF THE DCV FUNCTION FOR VARIOUS RANGES AND FREQUENCIES 2250 !UNCERTAINTY IS 30% AND THIS ERROR IS RANDOM 2260 X1=FNVmeter_bw(Freq,Range) 2270 X2=FNVmeter_bw(Freq*1.3,Range) 2280 Vmeter_bw=INT(1.E+6*ABS(X2-X1)) !ERROR DUE TO METER B.W. 2290 ! 2300 ! 2310 !Aper_er IS THE DCV GAIN ERROR FOR VARIOUS A/D APERTURES 2320 !THIS ERROR IS SPECIFIED IN A GRAPH ON PAGE 11 OF THE DATA SHEET 2330 !THIS ERROR IS RANDOM 2340 Aper_er=INT(1.0*.002/Aper) !GAIN UNCERTAINTY - SMALL A/D APERTURE 2350 IF Aper_er>30 AND Aper>=1.E-5 THEN 2360 Aper_er=30 2370 END IF 2380 IF Aper<1.E-5 THEN 2390 Aper_er=10+INT(.0002/Aper) 2400 END IF 2410 ! 2420 ! 2430 !Sincerr IS THE ERROR DUE TO THE APERTURE TIME NOT BEING PERFECTLY KNOWN 2440 !THIS VARIATION MEANS THAT THE Sinc CORRECTION TO THE SIGNAL FREQUENCY 2450 !IS NOT PERFECT. ERROR COMPONENTS ARE CLOCK FREQ UNCERTAINTY(0.01%) 2460 !AND SWITCHING TIMING (50ns). THIS ERROR IS RANDOM. 2470 X=PI*Aper*Freq 2480 Sinc=SIN(X)/X 2490 Y=PI*Freq*(Aper*1.0001+5.0E-8) 2500 Sinc2=SIN(Y)/Y 2510 Sincerr=INT(1.E+6*ABS(Sinc2-Sinc)) !APERTURE UNCERTAINTY ERROR 2520 ! 2530 ! 2540 !Dist IS ERROR DUE TO UP TO 1% DISTORTION OF THE INPUT WAVEFORM 2550 !IF THE INPUT WAVEFORM HAS 1% DISTORTION, THE ASSUMPTION IS MADE 2560 !THAT THIS ENERGY IS IN THE THIRD HARMONIC. THE APERTURE CORRECTION, 2570 !WHICH IS MADE ONLY FOR THE FUNDAMENTAL FREQUENCY WILL THEN BE 2580 !INCORRECT. THIS ERROR IS RETURNED SEPERATELY. 2590 X=PI*Aper*Freq 2600 Sinc=SIN(X)/X 2610 Sinc2=SIN(3*X)/3/X !SINC CORRECTION NEEDED FOR 3rd HARMONIC 2620 Harm_er=ABS(Sinc2-Sinc) 2630 Dist=SQR(1+(.01*(1+Harm_er))^2)-SQR(1+.01^2) 2640 Dist=INT(Dist*1.E+6) 2650 ! 2660 ! 2670 !Tim_er IS ERROR DUE TO MISTIMING. IT CAN BE SHOWN THAT IF A 2680 !BURST OF Num SAMPLES ARE USED TO COMPUTE THE RMS VALUE OF A SINEWAVE 2690 !AND THE SIZE OF THIS BURST IS WITHIN 50ns*Num OF AN INTEGRAL NUMBER 2700 !OF PERIODS OF THE SIGNAL BEING MEASURED, AN ERROR IS CREATED 2710 !BOUNDED BY 100ns/4/Tsamp. THIS ERROR IS DUE TO THE 100ns QUANTIZATION 2720 !LIMITATION OF THE HP3458A TIME BASE. IF THIS ERROR WERE ZERO, THEN 2730 !Num*Tsamp= INTEGER/Freq, BUT WITH THIS ERROR UP TO 50ns OF TIMEBASE 2740 !ERROR IS PRESENT PER SAMPLE, THEREFORE TOTAL TIME ERROR=50ns*Num 2750 !THIS ERROR CAN ONLY ACCUMULATE UP TO 1/2 *Tsamp, AT WHICH POINT THE 2760 !ERROR IS BOUNDED BY 1/4/Num 2770 !THIS ERROR IS FURTHER REDUCED BY USING THE LEVEL TRIGGER 2780 !TO SPACE Nbursts AT TIME INCREMENTS OF 1/Nbursts/Freq. THIS 2790 !REDUCTION IS SHOWN AS 20*Nbursts BUT IN FACT IS USUALLY MUCH BETTER 2800 !THIS ERROR IS ADDED ABSOLUTELY TO THE Err CALCULATION 2810 Tim_er=INT(1.E+6*1.E-7/4/(Aper+3.E-5)/20)!ERROR DUE TO HALF CYCLE ERROR 2820 Limit=INT(1.E+6/4/Num/20) 2830 IF Tim_er>Limit THEN Tim_er=Limit 2840 ! 2850 ! 2860 !Noise IS THE MEASUREMENT TO MEASUREMENT VARIATIONS DUE TO THE 2870 !INDIVIDUAL SAMPLES HAVING NOISE. THIS NOISE IS UNCORRELATED AND 2880 !IS THEREFORE REDUCED BY THE SQUARE ROOT OF THE NUMBER OF SAMPLES 2890 !THERE ARE Nbursts*Num SAMPLES IN A MEASUREMENT. THE SAMPLE NOISE IS 2900 !SPECIFIED IN THE GRAPH ON PAGE 11 OF THE DATA SHEET. THIS GRAPH 2910 !SHOWS 1 SIGMA VALUES, 2 SIGMA VALUES ARE COMPUTED BELOW. 2920 !THE ERROR ON PAGE 11 IS EXPRESSED AS A % OF RANGE AND IS MULTIPLIED 2930 !BY 10 SO THAT IT CAN BE USED AS % RDG AT 1/10 SCALE. 2940 !ERROR IS ADDED IN AN ABSOLUTE FASHION TO THE Err CALCULATION SINCE 2950 !IT WILL APPEAR EVENTUALLY IF A MEASUREMENT IS REPEATED OVER AND OVER 2960 Noiseraw=.9*SQR(.001/Aper) !1 SIGMA NOISE AS PPM OF RANGE 2970 Noise=Noiseraw/SQR(Nbursts*Num) !REDUCTION DUE TO MANY SAMPLES 2980 Noise=10*Noise !NOISE AT 1/10 FULL SCALE 2990 Noise=2*Noise !2 SIGMA 3000 IF Range<=.12 THEN !NOISE IS GREATER ON 0.1 V RANGE 3010 Noise=7*Noise !DATA SHEET SAYS USE 20, BUT FOR SMALL 3020 Noiseraw=7*Noiseraw !APERTURES, 7 IS A BETTER NUMBER 3030 END IF 3040 Noise=INT(Noise)+2 !ERROR DUE TO SAMPLE NOISE 3050 ! 3060 ! 3070 !Df_err IS THE ERROR DUE TO THE DISSIPATION FACTOR OF THE P.C. BOARD 3080 !CAPACITANCE LOADING DOWN THE INPUT RESISTANCE. THE INPUT RESISTANCE 3090 !IS 10K OHM FOR THE LOW VOLTAGE RANGES AND 100K OHM FOR THE HIGH VOLTAGE 3100 !RANGES (THE 10M OHM INPUT ATTENUATOR). THIS CAPACITANCE HAS A VALUE 3110 !OF ABOUT 15pF AND A D.F. OF ABOUT 1.0%. IT IS SWAMPED BY 120pF 3120 !OF LOW D.F. CAPACITANCE (POLYPROPALENE CAPACITORS) ON THE 3130 !LOW VOLTAGE RANGES WHICH MAKES FOR AN EFFECTIVE D.F. OF ABOUT .11%. 3140 !THIS CAPACITANCE IS SWAMPED BY 30pF LOW D.F. CAPACITANCE ON THE 3150 !HIGH VOLTAGE RANGES WHICH MAKES FOR AN EFFECTIVE D.F. OF .33%. 3160 !THIS ERROR IS ALWAYS IN THE NEGATIVE DIRECTION, SO IS ADDED ABSOLUTELY 3170 IF Range<=12 THEN 3180 Rsource=10000 3190 Cload=1.33E-10 3200 Df=1.1E-3 !0.11% 3210 ELSE 3220 Rsource=1.E+5 3230 Cload=5.0E-11 3240 Df=3.3E-3 !0.33% 3250 END IF 3260 Df_err=2*PI*Rsource*Cload*Df*Freq 3270 Df_err=INT(1.E+6*Df_err)!ERROR DUE TO TO PC BOARD DIELECTRIC ABSORBTION 3280 ! 3290 ! 3300 !Err IS TOTAL ERROR ESTIMATION. RANDOM ERRORS ARE ADDED IN RSS FASHION 3310 Err=SQR(Base^2+Vmeter_bw^2+Aper_er^2+Sincerr^2) 3320 Err=INT(Err+Df_err+Tim_er+Noise) !TOTAL ERROR (ppm) 3330 ! 3340 SUBEND 3350 SUB Samp_parm(Tsamp,Aper,Num,Freq,Meas_time,Aper_targ,Nharm_min,Nbursts) 3360 Aper=Aper_targ 3370 Tsamp=1.E-7*INT((Aper+3.0E-5)/1.E-7+.5) !ROUND TO 100ns 3380 Submeas_time=Meas_time/Nbursts !TARGET TIME PER BURST 3390 Burst_time=Submeas_time*Tsamp/(.0015+Tsamp) !IT TAKES 1.5ms FOR EACH 3400 ! SAMPLE TO COMPUTE Sdev 3410 Approxnum=INT(Burst_time/Tsamp+.5) 3420 Ncycle=INT(Burst_time*Freq+.5) !# OF 1/Freq TO SAMPLE 3430 IF Ncycle=0 THEN 3440 Ncycle=1 3450 Tsamp=1.E-7*INT(1/Freq/Approxnum/1.E-7+.5) !TIME BETWEEN SAMPLES 3460 Nharm=INT(1/Tsamp/2/Freq) !# HARMONICS BEFORE ALIAS OCCURS 3470 IF Nharm1 THEN 3620 K=INT(Num/20/Nharm+1) 3630 ELSE 3640 K=0 3650 END IF 3660 Tsamp=1.E-7*INT(Ncycle/Freq/(Num-K)/1.E-7+.5) !NOW ALIAS OCCURS 3670 ! MUCH HIGHER THAN Nharm*Freq 3680 ! K WAS PICKED TO TRY AND MAKE 3690 ! ALIAS ABOUT 10*Nharm*Freq 3700 IF Tsamp-Tsamptemp<1.E-7 THEN Tsamp=Tsamp+1.E-7 3710 END IF 3720 Aper=Tsamp-3.E-5 3730 Num=INT(Ncycle/Freq/Tsamp+.5) 3740 IF Aper>1 THEN Aper=1 !MAX APERTURE OF HP3458A 3750 IF Aper<1.E-6 THEN !MIN APERTURE OF HP3458A 3760 BEEP 200,1 3770 PRINT "************** ERROR *****************" 3780 PRINT "A/D APERTURE IS TOO SMALL" 3790 PRINT "LOWER Aper_targ, Nharm, OR INPUT Freq" 3800 PRINT "***************************************" 3810 STOP 3820 END IF 3830 SUBEND