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

📄 instrumentcal.h

📁 USB 上位机程序 VNA使用,网络分析仪原理使用仪器
💻 H
📖 第 1 页 / 共 4 页
字号:
			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 + -