安捷伦or是德信号源+频谱仪操作:从程控到自动测试(四)平坦度检测的程控实现
一、概述
目前,对于射频模块的调试与测试,国内大多数的厂商(特别是中小型企业)均是通过最原始的手工调测方式,需要调试人员手动设置和操作仪器(信号源和频谱仪),并通过肉眼观察仪器上的显示数值并读写分析模块性能,来确定所调试的通信模块是否符合指标要求。
在射频模块的批量生产测试过程中,调试和测试人员需要通过重复的手动操作仪器,进行射频模块的指标测试。上篇文章已经介绍了如何实现互调检测的程控及自动测试[1],本文将对待测模块平坦度检测的程控及自动测试的实现进行介绍。
二、平坦度检测
图1给出了射频待测模块及计算机与信号源和频谱仪的连接方式。从图中可以看出,在信号源和频谱仪都已经进行功率校准之后,当从信号源输出功率为Pin 1(dBm)、频率为f1的单音信号通过射频线进入待测模块,再由射频线和衰减器进入频谱仪时,我们可以在频谱仪中得到信号的峰值频率为f1、峰值功率Pout 1(dBm),Pout 1 = Pin 1 + G。当输入信号频率不同时,在频谱仪中观察到的峰值频率也将随着输入信号频率的改变而变化,且峰值功率也会有偏差,而输入连续频率单音信号得到的输出峰值功率之间的峰峰值(最大最小值)则称为平坦度。
那么,接下来介绍使用信号源和频谱仪进行平坦度检测的步骤:
1、 仪器校准[1]完成后,按图1所示连接待测模块与信号源和频谱仪,将信号源的中心频率和功率设置到待测频点和功率值(如:-50dBm);
2、 待测模块上电,打开射频开关,输出射频信号,判断增益是否满足指标;
3、 观察频谱仪中的峰值功率,并读出峰值功率,调节信号源输出功率,使得待测模块输出功率到达指定的功率值;
4、 将待测模块输出功率调节至指定的功率值后,设置信号源,使其输出不同频率的单音信号;
5、 设置频谱仪,将Trace设置为Max Hold,使得频谱仪中可以固定显示不同频点的最大值;
6、 读取频谱仪中不同频点的峰峰值,此差值即为待测模块的平坦度。
三、平坦度检测的程控实现
如何使用程控进行平坦度检测工作,从而提高测试人员操作效率?
分析以上互调检测步骤,可以将信号源中心频点和功率设置、频谱仪峰值读取、频谱仪频谱最大保持、频谱峰峰值确定及差值计算等这些手动操作仪器的步骤使用程控实现。(信号源和频谱仪程控的实现,请参考【VISA+SCPI实现安捷伦/是德信号源和频谱仪的程控】)
本文中程控使用VISA+SCPI指令集实现,操作界面使用C#实现,实现方式还有其他的,可依据自身的熟悉程度进行选择。表1给出了信号源校准程控指令及界面实例,频谱仪的程控指令可参考https://download.csdn.net/download/qq_27424533/80233490,界面实例可与信号源一致。信号源的其他程控指令可参考https://download.csdn.net/download/qq_27424533/80233370。
四、平坦度的自动化实现
当理解并实现以上平坦度检测的程控方式后,我们就具备了平坦度检测自动化实现的基础。平坦度检测的步骤在第二节中已经介绍清楚了,平坦度检测步骤中包括了指定功率输出的自动测试实现,而指定功率输出的自动测试实现中则包含了增益计算的自动实现,那么怎么实现平坦度检测的自动化呢?本文中的平坦度检测自动化实现思路如下:使用程控指令将信号源频点和功率值设置按步骤分别进行,然后进行增益计算和指定输出功率的自动实现,保持信号源频率不变,从开始频点到终止频点循环设置信号源的频点,之后设置频谱仪显示最大保持,等待频谱仪从开始频点到终止频点显示结束,确定峰峰值,最终程序将输出待测模块的增益和平坦度值。
以上平坦度测试方式存在一个问题,即仪器校准时只是将中心频点的功率补偿校准了,其他频点的补偿都是按照中心频点的补偿值进行的补偿,此时,则存在一个误差值,这就导致检测的平坦度具备一定的误差。需要得到精确的平坦度值可以采用对各频点进行补偿的方式,但是该方法将使得测试时间过长,不利于批量测试。另外一种方法则是采用网络分析仪进行平坦度的测试。
五、平坦度的快速扫描测试实现
使用信号源+频谱仪的方式得到精确的平坦度将耗费很长的时间,非常不利于批量测试。那么是否具备快速测试平坦度的方法呢,我们可以利用信号源自带的频点列表扫描模式,设置好开始频点和终止频点、选定扫描点数、指定输出功率,开始扫描,即可使得信号源扫描输出对应频点、指定功率的单音信号。频谱仪的设置则按第二节中的步骤进行,扫描完成后读出峰峰值,即可得到平坦度。该方法避免了程序循环设置每个频点的步骤,改由信号源列表扫描输出,可节省大量时间,快速实现平坦度扫描测试。
给出部分代码如下:
private void Button_PTDsweep_Click(object sender, RoutedEventArgs e)
{if (parentWindow.Button_SGLAN.IsChecked == false || parentWindow.Button_PPLAN.IsChecked == false){parentWindow.LogDebug(LogMsgType.Outgoing, "与设备的网络连接未建立,请先建立网络连接!");return;}else{try{double step, fre, gain, PTD, p;if (TextBox_Pow.Text == ""){parentWindow.LogDebug(LogMsgType.Error, "功率值不能为空!");return;}if (CheckBox_PTD_5.IsChecked == true){p = Convert.ToDouble(TextBox_Pow.Text) - 5;}else{p = Convert.ToDouble(TextBox_Pow.Text);}fre = (Convert.ToDouble(TextBox_FreSta.Text) + Convert.ToDouble(TextBox_FreSto.Text)) / 2;parentWindow.PPCMDsend(string.Concat(":DISP:WIND:TRAC:Y:RLEV ", Convert.ToString(p + 10), "dBm"), "调整频谱仪参考电平。");gain = GainCal(fre, ComboBox_FreDW.Text);if (PPPowJH(p, gain, out double PPp, out double sgp) == 0) return;parentWindow.LogDebug(LogMsgType.Normal, "平坦度自动化测试开始!");if (TextBox_SwePoin.Text == ""){step = 1000;}else{step = Convert.ToDouble(TextBox_SwePoin.Text);}PTD = SweepPTDJH(Convert.ToDouble(TextBox_FreSta.Text), Convert.ToDouble(TextBox_FreSto.Text), step);//TextBox_PTDERR.Text = Convert.ToString(PTD);TextBox_PTDERR.Text = PTD.ToString("N3");TextBox_gain.Text = gain.ToString("N2");parentWindow.LogDebug(LogMsgType.Normal, "平坦度检测结束!");Button_PTDsweep.Visibility = Visibility.Collapsed;Button_ReadPTD.Visibility = Visibility.Visible;Button_OffSweep.Visibility = Visibility.Visible;Button_PTDMD.Visibility = Visibility.Visible;}catch{parentWindow.LogDebug(LogMsgType.Error, "平坦度检测异常结束!");}}
}
public double SweepPTDJH(double Fsta, double Fsto, double step)
{int delay;double mk1, mk2;parentWindow.ioArbSG.WriteString(string.Concat(":FREQ:STAR ", Fsta.ToString(), ComboBox_FreDW.Text));parentWindow.ioArbSG.WriteString(string.Concat(":FREQ:STOP ", Fsto.ToString(), ComboBox_FreDW.Text));parentWindow.ioArbSG.WriteString(string.Concat(":SWE:POIN ", step.ToString()));parentWindow.ioArbPP.WriteString(string.Concat(":FREQ:STAR ", Fsta.ToString(), ComboBox_FreDW.Text));parentWindow.ioArbPP.WriteString(string.Concat(":FREQ:STOP ", Fsto.ToString(), ComboBox_FreDW.Text));parentWindow.Button_SGRFONorOFF.IsChecked = true; //关闭信号发生器射频if (CheckBox_PTDPlusTime.IsChecked == false){delay = 8 * (int)step;}else{delay = 12 * (int)step;}//开启扫描模式parentWindow.ioArbSG.WriteString(":FREQ:MODE LIST");Thread.Sleep(500);parentWindow.ioArbPP.WriteString(":TRAC1:TYPE MAXH");Thread.Sleep(delay);parentWindow.ioArbPP.WriteString(":CALC:MARK1:MAX");parentWindow.ioArbPP.WriteString(":CALC:MARK2:MIN");Thread.Sleep(300);mk1 = Convert.ToDouble(parentWindow.PPCMDread(string.Concat(":CALC:MARK1:Y?"), "频谱仪Marker1功率为:"));mk2 = Convert.ToDouble(parentWindow.PPCMDread(string.Concat(":CALC:MARK2:Y?"), "频谱仪Marker1功率为:"));Thread.Sleep(300);parentWindow.PPCMDsend(string.Concat(":DISP:WIND:TRAC:Y:RLEV ", Convert.ToString(mk1 + 2), "dBm"), "调整频谱仪参考电平。");parentWindow.PPCMDsend(string.Concat(":DISP:WIND:TRAC:Y:PDIV ", Convert.ToString((Math.Round(mk1 - mk2) + 4) / 10), "dB"), "调整频谱仪参考电平。");TextBox_PTDMax.Text = mk1.ToString();TextBox_PTDMin.Text = mk2.ToString();return mk1 - mk2;
}