Copyright (c) 2021 Fluke Calibration                        MET/CAL Procedure
=============================================================================
INSTRUMENT:            Sub Get Accuracy (Enhanced) /LFCTR
DATE:                  2021-08-27 10:38:05
AUTHOR:                Fluke Calibration
REVISION:              $Revision: 30707 $
ADJUSTMENT THRESHOLD:  70%
NUMBER OF TESTS:       1
NUMBER OF LINES:       169
=============================================================================
#
#  Procedure Author:
#        DAC, DFM, CAD
#
#  Compatibility:
#        MET/CAL 10.5 or later
#
#  Subprocedures:
#        None
#
#  Required Files:
#        user_config_instr.ini
#
#  This procedure is intended for use with MET/CAL calibration software;
#  the terms and conditions set forth in your MET/CAL license apply to this
#  procedure.
#
#  Due to Fluke's policy of continuously updating our products, this procedure
#  may contain minor differences in methods used and/or specifications to
#  those found in the manual or other documentation. While every effort has
#  been made to ensure that this procedure is accurate, Fluke cannot be held
#  responsible for the consequences of error or omissions found within this
#  procedure.
#
#  The copyright in this procedure is owned by Fluke Corporation.
#
#  Parameters       Values
#  ---------------  ---------------------------------------------------------
#  @LFCTR_DevName   LFCTR device name (i.e. Philips PM 6680).
#
#  @LFCTR_Func      FreqCh1          | FreqCh2          | FreqChHF |
#                   PeriodCh1        | PeriodCh2        |
#                   FreqRatioCh1/2   | FreqRatioCh2/1   |
#                   PosPulseWidthCh1 | PosPulseWidthCh2 |
#                   NegPulseWidthCh1 | NegPulseWidthCh2 |
#                   TimeIntCh1-2     | TimeIntCh2-1     |
#                   PhaseCh1-2       | PhaseCh2-1       |
#                   DutyCycleCh1     | DutyCycleCh2     |
#                   RiseTimeCh1      | RiseTimeCh2      |
#                   FallTimeCh1      | FallTimeCh2      |
#                   VminCh1          | VminCh2          |
#                   VmaxCh1          | VmaxCh2          |
#                   VppCh1           | VppCh2
#
#  @LFCTR_Meas      LFCTR measurement (from MEM).
#
#  @LFCTR_Ampl      Amplitude for 2nd parameter lookup (in dBm), default = 0.
#
#  @LFCTR_Freq      Frequency for 2nd parameter lookup (in Hz),  default = 0.
#
#  @LFCTR_MeasTime  <NR3>[][<prefix>]s (used only by Fluke 9640A).
#
#  @LFCTR_ROSC      Int | Ext
#
#  @LFCTR_Acc       Accuracy value returned by this procedure (in Hz).
#
#  Example Usage:
#
# Initialize LFCTR global named variables.
#     1.001  CALL         Sub Initialize /LFCTR
#     1.002  MATH         @LFCTR_Func = "FreqCh1"
#     1.003  MATH         @LFCTR_Ampl = "-10 dBm"
#     1.004  MATH         Ctr = @LFCTR_DevName & " " & @LFCTR_Ch1
#     1.005  TARGET       -p
#
#   NOTE: When this subprocedure is used with a Fluke 9640A with Option
#         9600FC, the following steps MUST be performed prior to calling this
#         subprocedure due to a specification change based on the installed
#         9640A firmware revision:
#     1.006  IEEE         [@9640]*IDN?[I$]
#                 OR
#     1.006  IEEE         [@LPNX]*IDN?[I$]
#     1.007  CALL         Sub 9640A Check Configuration / Set Parameters
#
#     1.008  CALL         Sub Reset /LFCTR
#     1.009  CALL         Sub Setup /LFCTR
#     1.010  DISP         Connect the UUT to [V Ctr].
#     1.011  IEEE         LEVEL -10dBm;:FREQ 1 kHz;:OUTPUT:STATE ON
#     1.012  TARGET       -m
#     1.013  CALL         Sub Read /LFCTR
#     1.014  MATH         @LFCTR_Meas = MEM; MEM = MEM / 1E+3
#     1.015  CALL         Sub Get Accuracy (Enhanced) /LFCTR
#     1.016  MATH         L[1] = @LFCTR_Acc / @LFCTR_Conf * 2 / 1E+3
#     1.017  ACC    1     kHz            L1U
#     1.018  MEMC         1.000kHz       3%
#
 STEP    FSC    RANGE NOMINAL        TOLERANCE     MOD1        MOD2  3  4 CON

  1.001  MATH         Dev = @LFCTR_DevName

# The following are supported by "Sub Get Accuracy /LFCTR".

# Fluke RF Reference Source.
  1.002  MATH         L[1] = ZCMP(Dev, "Fluke 9640A")
  1.003  MATH         L[1] = ZCMP(Dev, "Fluke 9640A-LPN")  || L[1]
  1.004  MATH         L[1] = ZCMP(Dev, "Fluke 9640A-LPNX") || L[1]
  1.005  MATH         L[1] = ZCMP(Dev, "Fluke 96040A")     || L[1]
  1.006  MATH         L[1] = ZCMP(Dev, "Fluke 96270A")     || L[1]

# Ratio, Phase, and Voltage functions.
  1.007  MATH         L[2] = FIND(@LFCTR_Func, "FreqRatio", 0)
  1.008  MATH         L[2] = FIND(@LFCTR_Func, "Phase",     0) || L[2]
  1.009  MATH         L[2] = FIND(@LFCTR_Func, "Vmax",      0) || L[2]
  1.010  MATH         L[2] = FIND(@LFCTR_Func, "Vmin",      0) || L[2]
  1.011  MATH         L[2] = FIND(@LFCTR_Func, "Vpp",       0) || L[2]

# Internal Frequency Reference.
  1.012  MATH         L[3] = EMPTY(@LFCTR_ROSC)
  1.013  MATH         L[3] = ZCMPI(@LFCTR_ROSC, "Int") || L[3]

  1.014  IF           L[1] || L[2] || L[3]
  1.015  CALL         Sub Get Accuracy /LFCTR
  1.016  END
  1.017  ENDIF

  1.018  MATH         FreqRef        = INI("startup", "FreqRefDevName")
  1.019  MATH         FreqRefAccMode = INI("startup", "FreqRefAccMode")
  1.020  MATH         @Abort = EMPTY(FreqRef)

  1.021  IF           @Abort
  1.022  DISP         "Sub Get Accuracy (Enhanced) /LFCTR"
  1.022  DISP
  1.022  DISP         This procedure requires a Frequency Reference, but none
  1.022  DISP         has been configured.  Terminate this procedure and
  1.022  DISP         configure an appropriate Frequency Reference.
  1.023  END
  1.024  ENDIF

  1.025  MATH         L[1] = FIND(@LFCTR_Func, "DutyCycle",  0)
  1.026  MATH         L[1] = FIND(@LFCTR_Func, "RiseTime",   0) || L[1]
  1.027  MATH         L[1] = FIND(@LFCTR_Func, "FallTime",   0) || L[1]
  1.028  MATH         L[1] = FIND(@LFCTR_Func, "PulseWidth", 0) || L[1]
  1.029  MATH         L[2] = FIND(@LFCTR_Func, "TimeInt", 0)
  1.030  MATH         L[3] = FIND(@LFCTR_Func, "Period", 0)

# Determine the frequency of the input signal.
  1.031  IF           L[1]
  1.032  MATH         Freq = BASE(@LFCTR_Freq)
  1.033  ELSEIF       L[2]
  1.034  MATH         Freq = 1 / ABS(@LFCTR_Meas)
  1.035  ELSEIF       L[3]
  1.036  MATH         Freq = 1 / @LFCTR_Meas
  1.037  ELSE
  1.038  MATH         Freq = @LFCTR_Meas
  1.039  ENDIF

  1.040  MATH         @LFCTR_Acc = ACCV(FreqRef, FreqRefAccMode, Freq)

# If Period or Time Interval measurement convert to time accuracy.
  1.041  IF           L[2] || L[3]
  1.042  MATH         @LFCTR_Acc = (@LFCTR_Acc / Freq) * @LFCTR_Meas
  1.043  ENDIF

  1.044  IF           ZCMP(@LFCTR_ROSC, "Ext")
# MET/CAL 10.5 and later
# 1.045  MATH         FREQREFUSED()
  1.045  ENDIF

  1.046  END
