Power Calibration

Other topics about Sample Programs

Overview

This program that demonstrates how to perform power calibration.

This program, as shown in the figure below, is run by making connections between the E5071C and the power meter (E4418B) through the USB/GPIB interface and between the E5071C and the external controller through the GPIB cable. Then the program executes the power calibration of the E5071C by using the power sensor (E4412A). The obtained power calibration data array is saved into a file.

Connecting E5071C, power meter, and external controller

See Power Calibration for this programming.

Sample Program in Excel VBA

Sub pow_cal_Click()

    '

    Dim defrm As Long

    Dim vi As Long

    Dim SwpType As String, StartPower As String, StopPower As String, CwFreq As String

    Dim Nop As Long, NumOfAve As String, Limit As Double, CorrData() As Double

    Dim Result As String * 10000, OpcRes As String * 2, Res As Variant

    Dim i As Long, Stat As VbMsgBoxResult

    Dim err As String * 50, ErrNo As Variant

    Const TimeOutTime = 50000 ' TimeOut time should be greater than the measurement time.

    ' Assign a GPIB address to the I/O pass.

    Call viOpenDefaultRM(defrm)

    Call viOpen(defrm, "GPIB0::17::INSTR", 0, 0, vi)

    Call viSetAttribute(vi, VI_ATTR_TMO_VALUE, TimeOutTime)

    '

    SwpType = "POW"         ' Sweep type               : POWER

    Nop = 21                ' Number of points         : 41

    StartPower = "-20"      ' Start Power              : -20 dBm

    StopPower = "-10"       ' Stop Power               : -10 dBm

    CwFreq = "1E9"          ' CW frequency             : 1 GHz

    NumOfAve = "4"          ' Number of averaging      : 4

    Limit = 10              ' Limit for corrected data : 10 dBm

    '

    Call viVPrintf(vi, ":SYST:PRES" + vbLf, 0) ' Presetting the analyzer

    Call viVPrintf(vi, ":SYST:COMM:GPIB:PMET:ADDR 13" + vbLf, 0) ' Setting GPIB address of the power meter to ENA

    '

    ' Setting measurement conditions

    Call viVPrintf(vi, ":SENS1:SWE:TYPE " & SwpType & vbLf, 0)

    Call viVPrintf(vi, ":SENS1:SWE:POIN " & CStr(Nop) & vbLf, 0)

    Call viVPrintf(vi, ":SOUR1:POW:STAR " & StartPower & vbLf, 0)

    Call viVPrintf(vi, ":SOUR1:POW:STOP " & StopPower & vbLf, 0)

    Call viVPrintf(vi, ":SENS1:FREQ " & CwFreq & vbLf, 0)

    

    Stat = MsgBox("Do you perform zeroing and calibrating the power sensor?", vbYesNo)

    

    If Stat = vbYes Then

        MsgBox "Zero and calibrate the power sensor by using the power meter, then press [OK] key.", vbOKOnly

    End If

    

MeasStart:

    '

    ' Connecting the power sensor A to the port-1 of ENA

    Call viVPrintf(vi, "*CLS" + vbLf, 0)

    Stat = MsgBox("Set the power sensor connected to the port 1 in the ENA, then press [OK] key.", vbOKOnly)

    '

    ' Performing power calibration measurement

    Call viVPrintf(vi, ":SOUR1:POW:PORT1:CORR:COLL:AVER " & NumOfAve & vbLf, 0)

    Call viVPrintf(vi, ":SOUR1:POW:PORT1:CORR:COLL ASEN" + vbLf, 0)

    Call viVPrintf(vi, "*OPC?" + vbLf, 0)

    Call viVScanf(vi, "%t", OpcRes)

    '

    ' Error hnadling at power meter measurement

    Call viVQueryf(vi, ":SYST:ERR?" & vbLf, "%t", err)

    ErrNo = Split(err, ",")

    '

    If Val(ErrNo(0)) = 0 Then

        ReDim CorrData(Nop)

    

        Call viVPrintf(vi, ":FORM:DATA ASC" + vbLf, 0)

        Call viVPrintf(vi, ":SOUR1:POW:PORT1:CORR:DATA?" + vbLf, 0)

        Call viVScanf(vi, "%t", Result)

        Res = Split(Result, ",")

    

        If fnLim(vi, Nop, Limit, Res) Then

            MsgBox "Power meter calibration measurement is complete.", vbOKOnly

            For i = 1 To Nop

                Cells(i + 5, 2) = i

                Cells(i + 5, 3) = Res(i - 1)

            Next i

        Else

            GoTo ReCalibration

        End If

    Else

        MsgBox "Error", vbOKOnly

        GoTo ReCalibration

    End If

ProgEnd:

    Call viClose(vi)

    Call viClose(defrm)

    Exit Sub

ReCalibration:

        Stat = MsgBox("Do you perform the power meter calibration measurement again?", vbYesNo)

        If Stat = vbYes Then

            GoTo MeasStart

        Else

            GoTo ProgEnd

        End If

End Sub

Function fnLim(vi As Long, Nop As Long, Limit As Double, Res As Variant) As Boolean

    For i = 1 To Nop

        If Abs(Res(i - 1)) > Limit Then

            Call viVPrintf(vi, "SOUR1:POW:PORT1:CORR OFF" + vbLf, 0)

            MsgBox "The corrected data is out of limit!", vbOKOnly

            fnLim = False

            Exit Function

        End If

    Next i

    fnLim = True

End Function

Sample Program in HT Basic (pow_cal.htb)

10 DIM Swp_type$[11],Inp_char$[9],Buff$[9],Err_mes$[50],File$[20]

20 DIM Corr_data(1:1601)

30 REAL Start_p,Stop_p,Cw_freq,Limit

40 INTEGER Nop,Pow_rang,Num_avg,Err_no,Verifier,Data_size,I

50 CLEAR SCREEN

60 !

70 ASSIGN @Agte507x TO 717

80 !

90 Swp_type$="POW" !Sweep type : POWER

100 Nop=41 !Number of points : 41

110 Pow_rang=0 !Power Range :-20 to +12 dBm

120 Start_p=-2.0E+1 !Start Power :-20 dBm

130 Stop_p=-1.0E+1 !Stop Power :-10 dBm

140 Cw_freq=1.0E+9 !CW frequency : 1 GHz

150 Num_avg=4 !Number of averaging : 4

160 Limit=10 !limit for corrected data : 10 dBm

170 !

180 ! Presetting the analyzer

190 !

200 OUTPUT @Agte507x;":SYST:PRES"

210 !

220 ! Setting GPIB address of the power meter to E5071C

230 !

240 OUTPUT @Agte507x;":SYST:COMM:GPIB:PMET:ADDR 13"

250 !

260 ! Setting measurement conditions

270 !

280 OUTPUT @Agte507x;":SENS1:SWE:TYPE "&Swp_type$

290 OUTPUT @Agte507x;":SENS1:SWE:POIN ";Nop

300 OUTPUT @Agte507x;":SOUR1:POW:ATT ";Pow_rang

310 OUTPUT @Agte507x;":SOUR1:POW:STAR ";Start_p

320 OUTPUT @Agte507x;":SOUR1:POW:STOP ";Stop_p

330 OUTPUT @Agte507x;":SENS1:FREQ ";Cw_freq

340 !

350 PRINT "Do you perform zeroing and calibrating the power sensor?"

360 PRINT

370 INPUT "[Y/N]",Inp_char$

380 IF UPC$(Inp_char$)="Y" THEN

390 PRINT "Zero and calibrate the power sensor by using the power meter, then press [Enter] key."

400 PRINT

410 INPUT "",Inp_char$

420 END IF

430 !

440 Meas_start: !

450 !

460 ! Connecting the power sensor to the port 1 in the ENA

470 !

480 OUTPUT @Agte507x;"*CLS"

490 PRINT "Set the power sensor connected to the port 1 in the ENA, then press [Enter] key."

500 PRINT

510 INPUT "",Inp_char$

520 !

530 ! Performing power calibration measurement

540 !

550 OUTPUT @Agte507x;":SOUR1:POW:PORT1:CORR:COLL:AVER ";Num_avg

560 OUTPUT @Agte507x;":SOUR1:POW:PORT1:CORR:COLL ASEN"

570 OUTPUT @Agte507x;"*OPC?"

580 ENTER @Agte507x;Buff$

590 !

600 ! Error hnadling at power meter measurement

610 !

620 OUTPUT @Agte507x;":SYST:ERR?"

630 ENTER @Agte507x;Err_no,Err_mes$

640 !

650 IF Err_no=0 THEN

660 REDIM Corr_data(1:Nop)

670 OUTPUT @Agte507x;":FORM:DATA ASC"

680 OUTPUT @Agte507x;":SOUR1:POW:PORT1:CORR:DATA?"

690 ENTER @Agte507x;Corr_data(*)

700 Verifier=FNLim(@Agte507x,Nop,Limit,Corr_data(*))

710 IF Verifier=-1 THEN

720 PRINT "Do you perform the power meter calibration measurement again?"

730 PRINT

740 INPUT "[Y/N]",Inp_char$

750 IF UPC$(Inp_char$)="Y" THEN GOTO Meas_start

760 IF UPC$(Inp_char$)<>"Y" THEN GOTO Prog_stop

770 END IF

780 PRINT "Power meter calibration measurement is complete."

790 PRINT

800 ELSE

810 PRINT "Error: "&Err_mes$

820 PRINT

830 PRINT "Do you perform the power meter calibration measurement again?"

840 PRINT

850 INPUT "[Y/N]",Inp_char$

860 IF UPC$(Inp_char$)="Y" THEN GOTO Meas_start

870 IF UPC$(Inp_char$)<>"Y" THEN GOTO Prog_stop

880 END IF

890 !

900 ! Installing the corrected data to a file

910 !

920 File$="CORR_DATA"

930 Data_size=Nop*8

940 ON ERROR GOTO Skip_purge

950 PURGE File$

960 Skip_purge: OFF ERROR

970 PRINT "The file installing power correction data: "&File$

980 PRINT

990 CREATE File$,Data_size

1000 ASSIGN @File TO File$;FORMAT ON

1010 FOR I=1 TO Nop

1020 OUTPUT @File USING "3D,3X,MD.4DE";I,Corr_data(I)

1030 NEXT I

1040 ASSIGN @File TO *

1050 !

1060 PRINT "Installing the corrected data to the file is DONE."

1070 !

1080 GOTO Prog_end

1090 !

1100 Prog_stop: !

1110 PRINT "Program Interruption"

1120 !

1130 Prog_end: !

1140 !

1150 END

1160 !

1170 ! Limit Test Function for the Corrected Data

1180 !

1190 DEF FNLim(@Agte507x,INTEGER Nop,REAL Limit,REAL Corr_data(*))

1200 INTEGER I

1210 !

1220 FOR I=1 TO Nop

1230 IF ABS(Corr_data(I))>Limit THEN

1240 OUTPUT @Agte507x;"SOUR1:POW:PORT1:CORR OFF"

1250 PRINT "The corrected data is out of limit!"

1260 PRINT

1270 RETURN -1

1280 GOTO Fn_exit

1290 END IF

1300 NEXT I

1310 !

1320 RETURN 0

1330 !

1340 Fn_exit: !

1350 !

1360 FNEND