📄 instrumentcal.h
字号:
progressBar1->Value = 0;
// run a sweep of 21 frequencies, calibrating Trans Amplitude detector
for (long FreqIdx=0; FreqIdx<21; FreqIdx++)
{
// Compute spot frequency
if (FreqIdx < 9)
Fdesired = Convert::ToInt32((FreqIdx + 2) * 100000); // every 100 KHz starting at 200 khz.
else
Fdesired = Convert::ToInt32((FreqIdx-8) * 10000000); // every ten MHz.
TxBuf->TxAccum = FG->DDS(Fdesired);
for (int level=0; level<30; level++) // Measure over 60 dB range
{
TxBuf->IDAClevelHi = TxLevLinear(-level); // 0 to -29 dbm
TxBuf->IDAClevelLo = TxLevLinear(-level-30); // -30 to -59 dbm
for(int k=0; k<7; k++) // Take 7 readings at each point
{
VNA->WriteRead(TxBuf, RxBuf);
BufferM[k] = RxBuf->TranMQHi;
BufferN[k] = RxBuf->TranMQLo;
}
TranMag[FreqIdx, level] = Median7i(BufferM); // Filter the readings
TranMag[FreqIdx, level+30] = Median7i(BufferN);
}
progressBar1->Value = FreqIdx * progressBar1->Maximum/20;
progressBar1->Update();
}
if(Cal->TxDet->AmpCal(TranMag)) // AmpCal forms y = mx + b for transmission detector
{
CalStepPass[2] = true;
TxLowAmpStat->Image = ICO1Label->Image;
}
else
{
CalStepPass[2] = false;
TxLowAmpStat->Image = ICO2Label->Image;
ShowCalStepFailMessage();
}
TxLowAmpStat->Visible = true;
}
private: System::Void FrequencyCalButton_Click(System::Object * sender, System::EventArgs * e)
{
// Internal Crystal Frequency Calibration
// Starts out with whatever initial value of FG->Error happens to be.
// This allows iterating to a better error estimate over several
// frequency cal cycles if desired.
VNA_RXBUFFER *RxBuf = new VNA_RXBUFFER;
VNA_TXBUFFER *TxBuf = new VNA_TXBUFFER;
int Fdesired;
Fdesired = 100000000; // output 100 MHz
TxBuf->TxAccum = FG->DDS(Fdesired);
TxBuf->IDAClevelHi = MAX_DDS_LEVEL; // Max transmit level
TxBuf->ReplyType = 0;
TxBuf->MeasureDelay = 0;
TxBuf->QDAClevel = QDAC_ZERODBM; // Reference level
VNA->WriteRead(TxBuf, RxBuf); // write the VNA with CW frequency output
}
private: System::Void FreqEnterButton_Click(System::Object * sender, System::EventArgs * e)
{
// Get frequency error from the text box and error check it.
// If valid, update the frequency error.
try
{
MeasFrequency = Convert::ToInt32(MeasFreqTextBox->Text);
}
catch (Exception* pe)
{
MessageBox::Show(pe->Message, "Error");
}
if((MeasFrequency > 103000000) || (MeasFrequency < 97000000)) // bad data likely
MessageBox::Show(S"Value appears to be invalid, re-enter",S"Error");
else
{
FrequencyCalStat->Visible = true;
FG->Ferror += MeasFrequency - 100000000;
}
}
private: System::Void DirectivityCalButton_Click(System::Object * sender, System::EventArgs * e)
{
// Measure the directivity of the coupler at 21 frequency points
// by using a well-terminated load directly on the TX connector.
VNA_RXBUFFER *RxBuf = new VNA_RXBUFFER;
VNA_TXBUFFER *TxBuf = new VNA_TXBUFFER;
int Fdesired;
TxBuf->ReplyType = 0;
TxBuf->MeasureDelay = 0; // Integration by target
TxBuf->QDAClevel = QDAC_ZERODBM; // Reference level
TxBuf->IDAClevelHi = MAX_DDS_LEVEL; // Max transmit level
progressBar1->Value = 0;
// run a sweep of 21 frequencies, measuring residual Refl Amplitude
for (long FreqIdx=0; FreqIdx<21; FreqIdx++)
{
// Compute spot frequency
if (FreqIdx < 9)
Fdesired = Convert::ToInt32((FreqIdx + 2) * 100000); // every 100 KHz starting at 200 khz.
else
Fdesired = Convert::ToInt32((FreqIdx-8) * 10000000); // every ten MHz.
TxBuf->TxAccum = FG->DDS(Fdesired);
// Take 7 readings, use median value
for(int k=0; k<7; k++)
{
VNA->WriteRead(TxBuf, RxBuf);
BufferM[k] = RxBuf->ReflMQ;
BufferI[k] = RxBuf->ReflPI;
BufferQ[k] = RxBuf->ReflPQ;
}
ReflMagPhDir[FreqIdx, 0] = Median7i(BufferM);
ReflMagPhDir[FreqIdx, 1] = Median7i(BufferI);
ReflMagPhDir[FreqIdx, 2] = Median7i(BufferQ);
progressBar1->Value = FreqIdx * progressBar1->Maximum/20;
}
Cal->RxDet->DirectivityCal(ReflMagPhDir); // Save the raw counts in the RxDetector object
Cal->RxDet->DirCalibrated = true;
CalStepPass[3] = true;
DirectivityCalStat->Image = ICO1Label->Image;
DirectivityCalStat->Visible = true;
}
private: System::Void RxAmpButtonOpen_Click(System::Object * sender, System::EventArgs * e)
{
// Reflection Amplitude Detector Calibration Open
// Captures Magnitude, I-phase, and Q-phase at zero dbm for coupler correction
VNA_RXBUFFER *RxBuf = new VNA_RXBUFFER;
VNA_TXBUFFER *TxBuf = new VNA_TXBUFFER;
int Fdesired;
TxBuf->ReplyType = 0;
TxBuf->MeasureDelay = 0; // No Measruement Delay
TxBuf->QDAClevel = QDAC_ZERODBM; // Reference level
progressBar1->Value = 0;
// run a sweep of 21 frequencies, calibrating Refl Amplitude detector
for (long FreqIdx=0; FreqIdx<21; FreqIdx++)
{
// Compute spot frequency
if (FreqIdx < 9)
Fdesired = Convert::ToInt32((FreqIdx + 2) * 100000); // every 100 KHz starting at 200 khz.
else
Fdesired = Convert::ToInt32((FreqIdx-8) * 10000000); // every ten MHz.
TxBuf->TxAccum = FG->DDS(Fdesired);
TxBuf->IDAClevelHi = TxLevLinear(0); // 0 dbm
// Take 7 magnitude & phase readings, use median value
for(int k=0; k<7; k++)
{
VNA->WriteRead(TxBuf, RxBuf);
BufferM[k] = RxBuf->ReflMQ;
BufferI[k] = RxBuf->ReflPI;
BufferQ[k] = RxBuf->ReflPQ;
}
ReflMagPhOpen[FreqIdx,0] = Median7i(BufferM);
ReflMagPhOpen[FreqIdx,1] = Median7i(BufferI);
ReflMagPhOpen[FreqIdx,2] = Median7i(BufferQ);
progressBar1->Value = FreqIdx * progressBar1->Maximum/20;
progressBar1->Update();
}
CalStepPass[4] = true;
RxAmpStatOpen->Image = ICO1Label->Image;
RxAmpStatOpen->Visible = true;
}
private: System::Void RxAmpButtonShort_Click(System::Object * sender, System::EventArgs * e)
{
// Reflection Amplitude Detector Calibration Shorted
// Performs two functions:
// 1. Captures amplitude over 60 dB range for linear regression
// 2. Captures Mag, I-phase and Q-phase at 0 dbm for coupler correction
VNA_RXBUFFER *RxBuf = new VNA_RXBUFFER;
VNA_TXBUFFER *TxBuf = new VNA_TXBUFFER;
int Fdesired;
int i;
long FreqIdx;
double mag, phase;
double& rmag = mag;
double& rphase = phase;
TxBuf->ReplyType = 0;
TxBuf->MeasureDelay = 0; // No Measurement Delay
TxBuf->QDAClevel = QDAC_ZERODBM; // Reference level
progressBar1->Value = 0;
// run a sweep of 21 frequencies, calibrating Refl Amplitude detector
for (FreqIdx=0; FreqIdx<21; FreqIdx++)
{
// Compute spot frequency
if (FreqIdx < 9)
Fdesired = Convert::ToInt32((FreqIdx + 2) * 100000); // every 100 KHz starting at 200 khz.
else
Fdesired = Convert::ToInt32((FreqIdx-8) * 10000000); // every ten MHz.
TxBuf->TxAccum = FG->DDS(Fdesired);
for (int level=0; level<=59; level++) // Measure over 60 dB range
{
TxBuf->IDAClevelHi = TxLevLinear(-level); // 0 to -59 dbm
// Take 7 readings, use median value
for(int k=0; k<7; k++)
{
VNA->WriteRead(TxBuf, RxBuf);
BufferM[k] = RxBuf->ReflMQ;
BufferI[k] = RxBuf->ReflPI;
BufferQ[k] = RxBuf->ReflPQ;
}
ReflMagRegression[FreqIdx, level] = Median7i(BufferM);
if (level == 0) // Also record Short Mag & Phase just at the zero dbm level.
{
ReflMagPhShort[FreqIdx,0] = Median7i(BufferM);
ReflMagPhShort[FreqIdx,1] = Median7i(BufferI);
ReflMagPhShort[FreqIdx,2] = Median7i(BufferQ);
}
}
progressBar1->Value = FreqIdx * progressBar1->Maximum/40;
progressBar1->Update();
}
bool Status = Cal->RxDet->AmpCal(ReflMagRegression); // Linear regression - sets y = mx + b
// Collect detailed 1024 point sweep for Shorted Reflection Data
for (i=0; i<1024; i++)
{
// Compute spot frequency
Fdesired = Convert::ToInt32(200000.0+( (double)i *(120000000.0-200000.0)/1024.0));
TxBuf->TxAccum = FG->DDS(Fdesired);
TxBuf->IDAClevelHi = MAX_DDS_LEVEL; // Max transmit level
TxBuf->ReplyType = 0;
TxBuf->MeasureDelay = 0;
TxBuf->QDAClevel = QDAC_ZERODBM; // Reference level
for (int k=0; k<7; k++)
{
VNA->WriteRead(TxBuf, RxBuf);
BufferI[k] = RxBuf->ReflPI;
BufferQ[k] = RxBuf->ReflPQ;
BufferM[k] = RxBuf->ReflMQ;
}
ReflDetailMagPhShort[i, 0] = Median7i(BufferM);
ReflDetailMagPhShort[i, 1] = Median7i(BufferI); // filter the raw readings
ReflDetailMagPhShort[i, 2] = Median7i(BufferQ);
progressBar1->Value = progressBar1->Maximum/2 + i * progressBar1->Maximum/2048;
if(i%50 == 0)
progressBar1->Update();
}
if(Status)
{
CalStepPass[5] = true;
RxAmpStatShort->Image = ICO1Label->Image;
}
else
{
CalStepPass[5] = false;
RxAmpStatShort->Image = ICO2Label->Image;
ShowCalStepFailMessage();
}
RxAmpStatShort->Visible = true;
// Leave coupler correction for 'OK' handler
}
private: System::Void Cancelbutton_Click(System::Object * sender, System::EventArgs * e)
{
// Don't save file. Form property tells the caller: DialogResult:Cancel
}
private: System::Void ShowCalStepFailMessage()
{
MessageBox::Show(S"This Step returned defective results."
S" Check: \n\r\t calibration setup \n\r\t cables \n\r\t adaptors \n\r\t attenuator"
S"\n\r\t all connections to be sure they are good."
S"\n\n\rThis step will need to be re-run before finishing calibration."
S"\n\rClose this window, then 'Cancel' if you do not wish to save Detector Cal data.",
S"Error: Failed Step", MessageBoxButtons::OK, MessageBoxIcon::Error);
}
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -