⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cal.cpp

📁 用于安捷伦功率计校准测试系统
💻 CPP
字号:
// Cal.cpp: implementation of the CCal class.
//
//////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include "CAL.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "repeater.h"
#include "InstrumentInit.h"



//////////////////////////////////////////////////////////////////////
// CCal Class
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCal::CCal()
{	

}

CCal::~CCal()
{
	
}

void CCal::CalibratePowermeterSelf()
{
	CInstrumentInit InstrumentInit;
	InstrumentInit.PowerMeterInit();
	while(stGlobals.PowermeterInitErr==TRUE){
		if(::AfxMessageBox("功率计初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.PowerMeterInit();
		}
		else
			return;
	}
	m_CalMess.MessageBox("请把功率头接到功率计的校准源上,在完成后按OK",
		"校准准备",MB_OK);
	if (stGlobals.strPowermeter=="HP E4416A"){
		viPrintf (stGlobals.hpE4416A, "CAL1:ALL\n");
		m_CalMess.MessageBox("功率计自校准开始,请等候45秒",
		"校准开始",MB_OK);
		::Sleep(45000);
	}
	else if(stGlobals.strPowermeter=="Gigatronics 8651A"){
		viPrintf(stGlobals.gt8651a, "CAL1\n");
		m_CalMess.MessageBox("功率计自校准开始,请等候4分钟",
		"校准开始",MB_OK);
		::Sleep(240000);
	}	

	//校准完成查询完成
	/*Queryf(stGlobals.gt8651a,"CAL1:STAT?\n","%t",msg);
	stGlobals.bPowermeterCalState=atoi(msg);*/
	char msg[256];
	stGlobals.bPowermeterCalState=TRUE;//???人为置校准状态为1	
	//char msg[256];
	/*while(!stGlobals.bPowermeterCalState){
	viQueryf(stGlobals.gt8651a,"CAL1:STAT?\n","%t",msg);
	stGlobals.bPowermeterCalState=atoi(msg);
	::Sleep(500);
	}*/
	MessageBeep((WORD)-1);
	m_CalMess.MessageBox("功率计自校准完成,校准参数已存入功率计中",
		"校准完成",MB_OK);
	if (stGlobals.strPowermeter=="HP E4416A"){
		viClose(stGlobals.hpE4416A);	
	}
	else if(stGlobals.strPowermeter=="Gigatronics 8651A"){
		viClose(stGlobals.gt8651a);
	}		
	viClose(stGlobals.defaultRM);
}

//功率计路径损耗校准程序
/*功率计和直放站之间的电缆和接头损耗校准,
一般在一次校准后如没有改变可长时间不进行此项操作*/
void CCal::CalibratePowermeterRoute()
{
	CInstrumentInit InstrumentInit;
	InstrumentInit.PowerMeterInit();
	while(stGlobals.PowermeterInitErr==TRUE){
		if(::AfxMessageBox("功率计初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.PowerMeterInit();
		}
		else
			return;
	}
	InstrumentInit.SouceInit();
	while(stGlobals.SourceInitErr==TRUE){
		if(::AfxMessageBox("信号源初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.SouceInit();
		}
		else
			return;
	}
	//信号源功率置为0dBm
	hpESG_SetPower(stGlobals.hpESG,0,hpESG_UNIT_DBM);//设置输出功率
	hpESG_SetPowerOn(stGlobals.hpESG,VI_TRUE);//输出使能
	for (int n=0;n<=6;n++)
	{
		stGlobals.fFPowermeterRoute[n]=CalRoute(stGlobals.channel[n]);
		stGlobals.fRPowermeterRoute[n]=CalRoute(stGlobals.channel[n]-4.5e7);
	}
	hpESG_SetPowerOn(stGlobals.hpESG,VI_FALSE);//输出不使能
	hpESG_close(stGlobals.hpESG);
	if (stGlobals.strPowermeter=="HP E4416A"){
		viClose(stGlobals.hpE4416A);	
	}
	else if(stGlobals.strPowermeter=="Gigatronics 8651A"){
		viClose(stGlobals.gt8651a);
	}	
	viClose(stGlobals.defaultRM);
//	hpESG_SetPowerOn(stGlobals.hpESG,VI_FALSE);//输出不使能
}

//信号路径校准程序
/*信号源到直放站之间的电缆和接头损耗校准,
一般在一次校准后如没有改变可长时间不进行此项操作*/
void CCal::CalibrateSignalRoute()
{
	CInstrumentInit InstrumentInit;
	InstrumentInit.PowerMeterInit();
	while(stGlobals.PowermeterInitErr==TRUE){
		if(::AfxMessageBox("功率计初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.PowerMeterInit();
		}
		else
			return;
	}
	InstrumentInit.SouceInit();
	while(stGlobals.SourceInitErr==TRUE){
		if(::AfxMessageBox("信号源初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.SouceInit();
		}
		else
			return;
	}
	//信号源功率置为0dBm
	hpESG_SetPower(stGlobals.hpESG,0,hpESG_UNIT_DBM);//设置输出功率
	hpESG_SetPowerOn(stGlobals.hpESG,VI_TRUE);//输出使能
	for (int n=0;n<=6;n++)
	{
		stGlobals.fFSinalRoute[n]=CalRoute(stGlobals.channel[n]);
		stGlobals.fRSinalRoute[n]=CalRoute(stGlobals.channel[n]-4.5e7);
	}
	hpESG_SetPowerOn(stGlobals.hpESG,VI_FALSE);//输出不使能
	hpESG_close(stGlobals.hpESG);
	if (stGlobals.strPowermeter=="HP E4416A"){
		viClose(stGlobals.hpE4416A);	
	}
	else if(stGlobals.strPowermeter=="Gigatronics 8651A"){
		viClose(stGlobals.gt8651a);
	}	
	viClose(stGlobals.defaultRM);
//	hpESG_SetPowerOn(stGlobals.hpESG,VI_FALSE);//输出不使能
}


//频谱仪路径损耗校准程序
/*频谱仪和直放站之间的电缆和接头损耗校准,
一般在一次校准后如没有改变可长时间不进行此项操作*/
void CCal::CalibrateSpectrumanalyzerRoute()
{
	CInstrumentInit InstrumentInit;
	InstrumentInit.PowerMeterInit();
	while(stGlobals.PowermeterInitErr==TRUE){
		if(::AfxMessageBox("功率计初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.PowerMeterInit();
		}
		else
			return;
	}
	InstrumentInit.SouceInit();
	while(stGlobals.SourceInitErr==TRUE){
		if(::AfxMessageBox("信号源初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.SouceInit();
		}
		else
			return;
	}
	//信号源功率置为10dBm
	hpESG_SetPower(stGlobals.hpESG,10,hpESG_UNIT_DBM);//设置输出功率
	hpESG_SetPowerOn(stGlobals.hpESG,VI_TRUE);//输出使能
	for (int n=0;n<=6;n++)
	{
		stGlobals.fFSpectrumAnalyzerRoute[n]=10-CalRoute(stGlobals.channel[n]);
		stGlobals.fRSpectrumAnalyzerRoute[n]=10-CalRoute(stGlobals.channel[n]-4.5e7);
	}
	hpESG_SetPowerOn(stGlobals.hpESG,VI_FALSE);//输出不使能
	hpESG_close(stGlobals.hpESG);
	if (stGlobals.strPowermeter=="HP E4416A"){
		viClose(stGlobals.hpE4416A);	
	}
	else if(stGlobals.strPowermeter=="Gigatronics 8651A"){
		viClose(stGlobals.gt8651a);
	}	
	viClose(stGlobals.defaultRM);
//	hpESG_SetPowerOn(stGlobals.hpESG,VI_FALSE);//输出不使能
}

float CCal::CalRoute(double fre)
{	
	
	float fRouteValues;
	//信号源频率设置
	hpESG_SetFrequencyCW(stGlobals.hpESG,fre);
	//功率计的校准因子
	char msg[256];
	if (stGlobals.strPowermeter=="HP E4416A"){
		viPrintf(stGlobals.hpE4416A,"SENS1:FREQ %fHZ\n",fre);
		::Sleep(2000);
		viQueryf(stGlobals.hpE4416A,"MEAS1?\n","%t",msg);
		viQueryf(stGlobals.hpE4416A,"MEAS1?\n","%t",msg);
	}
	else if(stGlobals.strPowermeter=="Gigatronics 8651A"){
		viPrintf(stGlobals.gt8651a,"SENS1:CORR:FREQ %f\n",fre);
		::Sleep(2000);
		viQueryf(stGlobals.gt8651a,"MEAS1?\n","%t",msg);
		viQueryf(stGlobals.gt8651a,"MEAS1?\n","%t",msg);
	}	
	//功率计读数
	fRouteValues=atof(msg);
	return fRouteValues;
}


void CCal::CalibrateNetAnalyzer()
{
	CInstrumentInit InstrumentInit;
	InstrumentInit.NetAnalyzerInit();
	while(stGlobals.NetAnalyzerInitErr==TRUE){
		if(::AfxMessageBox("网络分析仪初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.NetAnalyzerInit();
		}
		else
			return;
	}
	double value1=0;//???????????假 value1为Max
	double max1=0;//???????????假 value1为Max
	double min1=0;//???????????假 value1为Max
	hp875x_powerSet(stGlobals.hp8753ES,0,hp875x_PWR_SOURCE_OFF,hp875x_CH1);	
	//选择通道1
	//hp875x_channelSelect(stGlobals.hp8753ES,hp875x_CH1);
	//选择校准件
	hp875x_calkit(stGlobals.hp8753ES,hp875x_CALKIT_N50);
	//设起止频率
	hp875x_frequency(stGlobals.hp8753ES,hp875x_FREQ_STRT_STOP,8.35e8,8.8e8);
	//设置输出电平 
	hp875x_powerSet(stGlobals.hp8753ES,0,hp875x_PWR_LEVEL,hp875x_CH1);
	hp875x_powerSet(stGlobals.hp8753ES,0,hp875x_PWR_SOURCE_ON,hp875x_CH1);
	//选择校准类型(单端口校准)		
	hp875x_calType(stGlobals.hp8753ES,hp875x_CAL_S11_1_PORT);
	int num1=0;
	while(value1>=-40)
	{
		if(num1!=0){
			m_CalMess.MessageBox("校准失败,请重新校准。","校准失败",MB_OK);
		}
		m_CalMess.MessageBox("校准开始,请在端口1接开路器","校准开始",MB_OK);
 		hp875x_calMeasStd(stGlobals.hp8753ES,hp875x_CALSTD_S11A, hp875x_CALSTD_STD_B);
		m_CalMess.MessageBox("请在端口1接短路器","正在校准",MB_OK);
		hp875x_calMeasStd(stGlobals.hp8753ES,hp875x_CALSTD_S11B, hp875x_CALSTD_STD_B);
		m_CalMess.MessageBox("请在端口1接负载","正在校准",MB_OK);
		hp875x_calMeasStd(stGlobals.hp8753ES,hp875x_CALSTD_S11C, hp875x_CALSTD_STD_A);
		hp875x_calComplete(stGlobals.hp8753ES,hp875x_CAL_S11_1_PORT);
	//????????????有待判断校准是否正确?
		hp875x_measType(stGlobals.hp8753ES,hp875x_S_PAR11,hp875x_CONV_OFF);
	//	hp875x_displaySelect(stGlobals.hp8753ES,hp875x_CH1,hp875x_DISP_DATA,hp875x_DISP_LINM);
		hp875x_markerSet(stGlobals.hp8753ES,hp875x_ON, hp875x_MKR_1 );   

		// Search for maximum amplitude using active marker (Marker 1)
		hp875x_markerSet(stGlobals.hp8753ES, hp875x_MKR_MAX);   
		// Read active marker values 
		hp875x_markerQuery(stGlobals.hp8753ES,&value1,NULL,NULL,hp875x_MKR_VALUE_STIM_Q, hp875x_CH1 );   
		num1++;
	}

	m_CalMess.MessageBox("单端口校准完成,请卸下负载。","正在校准",MB_OK);
	//选择校准类型(直通校准)		
	//选择通道2
	hp875x_channelSelect(stGlobals.hp8753ES,hp875x_CH2);
	hp875x_calType(stGlobals.hp8753ES,hp875x_CAL_RESPONSE);
	int num2=0;
	while(max1<0.02&&min1>-0.02)
	{
		if(num2!=0){
			m_CalMess.MessageBox("校准失败,请重新校准。","校准失败",MB_OK);
		}
		m_CalMess.MessageBox("请在两端口之间连接直通件。","正在校准",MB_OK);
		hp875x_calMeasStd(stGlobals.hp8753ES,hp875x_CALSTD_RESPONSE, hp875x_CALSTD_STD_E);
		hp875x_calComplete(stGlobals.hp8753ES,hp875x_CAL_RESPONSE);
//????????????有待判断校准是否正确?
		hp875x_measType(stGlobals.hp8753ES,hp875x_S_PAR21,hp875x_CONV_OFF);
		hp875x_displaySelect(stGlobals.hp8753ES,hp875x_CH2,hp875x_DISP_DATA,hp875x_DISP_LINM);
		hp875x_markerSet(stGlobals.hp8753ES,hp875x_ON, hp875x_MKR_1 );   

		// Search for maximum amplitude using active marker (Marker 1)
		hp875x_markerSet(stGlobals.hp8753ES, hp875x_MKR_MAX);   
		// Read active marker values 
		hp875x_markerQuery(stGlobals.hp8753ES, &max1,NULL,NULL, hp875x_MKR_VALUE_STIM_Q, hp875x_CH2 );   
		hp875x_markerSet(stGlobals.hp8753ES,hp875x_ON, hp875x_MKR_1);   

		// Search for maximum amplitude using active marker (Marker 1)
		hp875x_markerSet(stGlobals.hp8753ES, hp875x_MKR_MIN);   
		// Read active marker values 
		hp875x_markerQuery(stGlobals.hp8753ES, &min1,NULL,NULL, hp875x_MKR_VALUE_STIM_Q, hp875x_CH2 );   
		num2++;
	}
	m_CalMess.MessageBox("所有校准完成。","校准完成",MB_OK);
	hp875x_close(stGlobals.hp8753ES);
}

void CCal::CalibrateNoiseAnalyzer()
{
	CInstrumentInit InstrumentInit;
	InstrumentInit.NoiseAnalyzerInit();
	while(stGlobals.NoiseAnalyzerInitErr==TRUE){
		if(::AfxMessageBox("噪声系数分析仪初始化失败,是否重新初始化?",MB_OKCANCEL,0)==IDOK){
			InstrumentInit.NoiseAnalyzerInit();
		}
		else
			return;
	}
	m_CalMess.MessageBox("请把噪音源接到噪声分析仪的信号输入端口上,在完成后按OK",
		"噪声系数分析仪校准准备",MB_OK);
	viPrintf(stGlobals.hp8970B, "FA 825\n");
	viPrintf(stGlobals.hp8970B, "EN\n");
	viPrintf(stGlobals.hp8970B, "FB 880\n");
	viPrintf(stGlobals.hp8970B, "EN\n");
	viPrintf(stGlobals.hp8970B, "SS 1\n");
	viPrintf(stGlobals.hp8970B, "EN\n");
	viPrintf(stGlobals.hp8970B, "NR\n");

	viPrintf(stGlobals.hp8970B, "10 EN\n");
	viPrintf(stGlobals.hp8970B, "15.20 EN\n");
	viPrintf(stGlobals.hp8970B, "100 EN\n");
	viPrintf(stGlobals.hp8970B, "15.19 EN\n");
	viPrintf(stGlobals.hp8970B, "1000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.03 EN\n");
	viPrintf(stGlobals.hp8970B, "2000 EN\n");
	viPrintf(stGlobals.hp8970B, "14.88 EN\n");
	viPrintf(stGlobals.hp8970B, "3000 EN\n");
	viPrintf(stGlobals.hp8970B, "14.75 EN\n");
	viPrintf(stGlobals.hp8970B, "4000 EN\n");
	viPrintf(stGlobals.hp8970B, "14.70 EN\n");
	viPrintf(stGlobals.hp8970B, "5000 EN\n");
	viPrintf(stGlobals.hp8970B, "14.68 EN\n");
	viPrintf(stGlobals.hp8970B, "6000 EN\n");
	viPrintf(stGlobals.hp8970B, "14.70 EN\n");
	viPrintf(stGlobals.hp8970B, "7000 EN\n");
	viPrintf(stGlobals.hp8970B, "14.78 EN\n");
	viPrintf(stGlobals.hp8970B, "8000 EN\n");
	viPrintf(stGlobals.hp8970B, "14.91 EN\n");
	viPrintf(stGlobals.hp8970B, "9000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.04 EN\n");
	viPrintf(stGlobals.hp8970B, "10000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.18 EN\n");
	viPrintf(stGlobals.hp8970B, "11000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.19 EN\n");
	viPrintf(stGlobals.hp8970B, "12000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.30 EN\n");
	viPrintf(stGlobals.hp8970B, "13000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.36 EN\n");
	viPrintf(stGlobals.hp8970B, "14000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.35 EN\n");
	viPrintf(stGlobals.hp8970B, "15000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.36 EN\n");
	viPrintf(stGlobals.hp8970B, "16000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.39 EN\n");
	viPrintf(stGlobals.hp8970B, "17000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.36 EN\n");
	viPrintf(stGlobals.hp8970B, "18000 EN\n");
	viPrintf(stGlobals.hp8970B, "15.25 EN\n");

	viPrintf(stGlobals.hp8970B, "CA\n");
	::Sleep(25000);

//?????????校准状态查询

	m_CalMess.MessageBox("噪声系数分析仪校准完成,校准参数已存入噪声系数分析仪中",
		"校准完成",MB_OK);
	viClose(stGlobals.hp8970B);
	viClose(stGlobals.defaultRM);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -