?? 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 + -