执行功率校准
概述
pow_cal.vba 展示利用E4418B功率计和E4412A功率传感器来执行功率校准的样本程序(VBA程序)。该VBA程序由下列程序模块组成:
对象名 |
模块类型 |
说明 |
mdlPowCal |
标准模块 |
执行功率校准 |
模块1 |
标准模块 |
使用VISA库的定义文件 |
程序概述
此程序通过USB/GPIB连接E5071C和E4418B(GPIB地址:13),如下所示。然后,根据需要程序执行调零并对与功率计(E4418B)相连的功率传感器(E4412A)进行校准。最后,程序执行对E5071C的功率校准,并将所得到的功率校准数据组保存到文件中。
E5071C与功率计之间的连接
程序说明
当您运行这个VBA程序时,要进行复位,设置受控功率计的GPIB地址和E5071C的测量条件,并显示消息“Do you want to zero and calibrate the power sensor?”(您是否想调零和校准功率传感器?)若您想进行调零和校准功率传感器,请点击Yes(是),否则点击No(否)。
若您想进行调零和校准功率传感器,便应按照所显示的消息,将与功率的A通道相连的功率传感器连接到功率计的POWER RF(射频功率)端口,并点击OK。当完成调零和功率传感器校准时,将显示消息“Zeroing and calibrating the power sensor is complete”(调零和校准功率传感器已完成)。
当显示提示您将功率传感器与E5071C的端口1相连的消息时,便进行连接,然后点击OK。立即执行功率校准数据测量,并将获得的功率校准数据组保存在名为CORR_DATA的文件中。
下面详细说明功率校准执行程序(对象名:mdlPowCal)。添加的行号只用于说明,并不在实际程序的源代码中出现。
100行到150行
分别将扫描类型(功率扫描)、点数(41)、功率范围(-20到+12 dBm)、扫描起始值(-20 dBm)、扫描终止值(-10 dBm)和固定频率分配给Swp_type、Nop、Pow_rang、Start_p、Stop_p和Cw_freq变量。
160行到170行
分别将对每个测量点的功率校准数据测量次数(4)和功率校准数据组的极限值(10 dBm)分配到Num_avg和Limit变量中。
200行
将E5071C返回到预置状态。
230行
将功率计的GPIB地址(13)设置到E5071C中。
260行到310行
对于通道1,将扫描类型分配给Swp_type变量,点数分配给Nop变量,功率范围分配给Pow_rang变量,扫描起始值分配给Start_p变量,扫描终止值分配给Stop_p变量以及固定频率分配给Cw_freq变量。
340行到370行
显示询问是否执行调零和功率传感器校准的消息。若点击Yes(是)按键,则这些行调用程序Control_PowerMeter(900行到1340行)。相反,若点击No(否)按键,则程序跳过调零和功率传感器校准。
410行到420行
清除错误排队。然后,这些行提示您将功率传感器连接到E5071C的端口1,并在完成连接之后,等待点击OK按键。
450行到470行
对于通道1的端口1,这些行将会把每个测量点的功率校准测量次数设定到Num_avg变量,然后起动功率校准数据测量,并等待完成测量。
500行
读出在测量功率校准数据期间E5071C中发生的差错,并将其设置在Err变量中。
510行到590行
若未发生差错,则这些行便读出功率校准数据组,并将其设置在Corr_data变量中。此外,程序利用极限_测试功能(Limit_Test function)来核查读出的功率校准数据组是否超出规定的极限值。若超出了极限值,便返回极限_测试(Limit_Test)功能的返回值False(虚假)。然后,显示询问是否重新进行功率校准的消息,点击Yes(是)按键以返回起动功率校准数据测量。点击No(否)按键使程序终结。
610行到660行
若发生差错,将显示出错消息和询问是否重新执行功率校准的消息。点击Yes(是)按键以返回功率校准数据测量。点击No(否)按键使程序终结。
690行到790行
将读出的功率校准数据组写入名为CORR_DATA的文件。然后,这些行显示已成功完成保存到文件中的消息。
程序:Control_PowerMeter(900行到1340行)
990行到1000行
对VISA系统进行初始化和起动,并将起动信息输出到Defrm变量。在此过程期间,若发生差错,程序便转到错误处理程序(1260行到1300行)。
1030行到1040行
建立与使用中的功率计(GPIB地址:13)的连接,并将连接信息输出到E4418变量,在此过程期间,若发生差错,程序便转到错误处理程序(1260行到1300行)。
1070行到1090行
通过VISA将功率计返回到预置状态,并对状态字节寄存器和标准事件状态寄存器进行清零。然后,这些行启动标准事件状态寄存器的0位。
1100行
提示您将功率传感器与功率计的POWER REF(功率参考)端口相连,并在完成连接之后等待OK按键被点击。
1110行到1120行
通过VISA执行调零和功率传感器的校准。这些行进行设置,使得当完成所有未决操作时,1被设定到标准事件状态寄存器的0位。
1130行到1190行
通过VISA对状态字节寄存器的值进行检索,并将其设置到Rgst变量中。这些行将读出值与32(其中只5位为1的值)的AND(“与”逻辑)设定到Rslt变量中,并显示当Rslt变为1时(当调零和功率传感器的校准完成时)调零和功率传感器的校准完成的消息。
1220行
中断通信并使VISA系统终结。
1260行到1300行
若VISA功能出现差错,则这些行显示出错的细节并终结程序。
功能:Limit_Test(1360行到1530行)
1420行到1470行
若读出功率校准数据组的绝对值超出规定极限值,这些行便关断功率校准功能并返回False(虚假)值。否则便返回True(真实)值。
功率校准的测量(对象名:mdlPowCal)
10| Sub Main()
20|
30| Dim Swp_type As String, File As String
40| Dim Start_p As Double, Stop_p As Double, Cw_freq As Double, Limi t As Double
50| Dim Nop As Long, Pow_rang As Long, Num_avg As Long, Data_size As Long, Buff As Long, Dmy As Long
60| Dim Corr_data As Variant, Err As Variant
70| Dim Verifier As Boolean
80| Dim FileNo As Integer, I As Integer
90|
100| Swp_type = "POW" 'Sweep type : POWER
110| Nop = 41 'Number of points : 41
120| Pow_rang = 0 'Power range : -20 to +12 dBm
130| Start_p = -20# 'Start power : -20 dBm
140| Stop_p = -10# 'Stop power : -10 dBm
150| Cw_freq = 1000000000# 'CW frequency : 1 GHz
160| Num_avg = 4 'Number of averaging : 4
170| Limit = 10# 'limit for corrected data : 10 dBm
180|
190| '''Presetting the ENA
200| SCPI.SYSTem.PRESet
210|
220| '''Setting GPIB address of the power meter to ENA
230| SCPI.SYSTem.COMMunicate.GPIB.PMETer.address = 13
240|
250| '''Setting measurement conditions
260| SCPI.SENSe(1).SWEep.TYPE = Swp_type
270| SCPI.SENSe(1).SWEep.POINts = Nop
280| SCPI.Source(1).POWer.ATTenuation.DATA = Pow_rang
290| SCPI.Source(1).POWer.STARt = Start_p
300| SCPI.Source(1).POWer.STOP = Stop_p
310| SCPI.SENSe(1).FREQuency.CW = Cw_freq
320|
330| '''Performing a calibration in the power meter
340| Buff = MsgBox("Do you perform zeroing and calibrating the power sensor?", vbYesNo, "Power meter calibration")
350| If Buff = vbYes Then
360| Control_PowerMeter
370| End If
380|
390| Meas_Start:
400| '''Connecting the power sensor to the port 1 in the ENA
410| SCPI.IEEE4882.CLS
420| MsgBox "Set the power sensor connected to the port 1 in the ENA.", vbOKOnly, "Power meter calibration"
430|
440| '''Performing power calibration measurement
450| SCPI.Source(1).POWer.PORT(1).CORRection.COLLect.AVERage.count = Num_avg
460| SCPI.Source(1).POWer.PORT(1).CORRection.COLLect.ACQuire = "ASEN "
470| Dmy = SCPI.IEEE4882.OPC
480|
490| '''Error handling at power meter calibration
500| Err = SCPI.SYSTem.Error
510| If Err(0) = 0 Then
520| Corr_data = SCPI.Source(1).POWer.PORT(1).CORRection.DATA
530| Verifier = Limit_Test(Nop, Limit, Corr_data)
540| If Verifier = False Then
550| Buff = MsgBox("Do you perform the power meter calibration me asurement again?", vbYesNo, "Power meter calibration")
560| If Buff = vbYes Then GoTo Meas_Start
570| If Buff = vbNo Then GoTo Prog_Stop
580| End If
590| MsgBox "Power meter calibration measurement is complete.", vbO KOnly, "Power meter calibration"
600|
610| Else
620| MsgBox "Error: " & Err(1)
630| Buff = MsgBox("Do you perform the power meter calibration meas urement again?", vbYesNo, "Power meter calibration")
640| If Buff = vbYes Then GoTo Meas_Start
650| If Buff = vbNo Then GoTo Prog_Stop
660| End If
670|
680| '''Installing the corrected data to a file
690| FileNo = FreeFile
700| File = "CORR_DATA"
710|
720| Open File For Output As FileNo
730|
740| For I = 0 To Nop - 1
750| Write #FileNo, Val(Corr_data(I))
760| Next I
770| Close #FileNo
780|
790| MsgBox "Installing the corrected data to the file is DONE.", vbO KOnly, "Power meter calibration"
800|
810| GoTo Prog_End
820|
830| Prog_Stop:
840| MsgBox "Program Interruption", vbOKOnly, "Power meter calibratio n"
850|
860| Prog_End:
870|
880| End Sub
890|
900| Private Sub Control_PowerMeter()
910|
920| Dim Status As Long 'VISA function status return
930| Dim Defrm As Long 'Session to default resource code
940| Dim E4418 As Long 'Session to power meter
950| Dim Rslt As Integer
960| Dim Rgst As String * 10
970|
980| '''Initializing the VISA system
990| Status = viOpenDefaultRM(Defrm)
1000| If (Status <> VI_SUCCESS) Then GoTo VisaErrorHandler
1010|
1020| '''Opening the session to the power meter
1030| Status = viOpen(Defrm, "GPIB0::13::INSTR", 0, 0, E4418)
1040| If (Status <> VI_SUCCESS) Then GoTo VisaErrorHandler
1050|
1060| '''Zeroing and calibratingthe power meter
1070| Status = viVPrintf(E4418, "SYST:PRES" & Chr$(10), 0)
1080| Status = viVPrintf(E4418, "*CLS" & Chr$(10), 0)
1090| Status = viVPrintf(E4418, "*ESE 1" & Chr$(10), 0)
1100| MsgBox "Set the power sensor connected to the POWER REF port in the power meter.", vbOKOnly, "Power meter calibration"
1110| Status = viVPrintf(E4418, "CAL1:ALL" & Chr$(10), 0)
1120| Status = viVPrintf(E4418, "*OPC" & Chr$(10), 0)
1130| Do While Rslt = 0
1140| Status = viVPrintf(E4418, "*STB?" & Chr$(10), 0)
1150| Status = viVScanf(E4418, "%t", Rgst)
1160| Rslt = CInt(CInt(Rgst) And 32)
1170| Loop
1180|
1190| MsgBox "Zeroing and Calibrating the power sensor is complete.", vbOKOnly, "Power meter calibration"
1200|
1210| '''Closing the resource manager session
1220| Call viClose(Defrm)
1230|
1240| GoTo Prog_End
1250|
1260| VisaErrorHandler:
1270| Dim VisaErr As String * 200
1280| Call viStatusDesc(Defrm, Status, VisaErr)
1290| MsgBox "Error : " & VisaErr, vbExclamation
1300| End
1310|
1320| Prog_End:
1330|
1340| End Sub
1350|
1360| Function Limit_Test(Nop As Long, Limit As Double, Corr_data As Var iant) As Boolean
1370|
1380| Dim I As Integer
1390|
1400| For I = 0 To Nop - 1
1410|
1420| If Abs(Corr_data(I)) > Limit Then
1430| SCPI.Source(1).POWer.PORT(1).CORRection.STATe = False
1440| MsgBox "The corrected data is out of limit!", vbExclamation, "Power meter calibration"
1450| Limit_Test = False
1460| Exit Function
1470| End If
1480|
1490| Next I
1500|
1510| Limit_Test = True
1520|
1530| End Function