📄 cal.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 + -