CN / EN
CN / EN

写技术文章

PyVISA:使用 Python 控制您的仪器(三):控制频谱仪测量晶体频偏

无敌浩克

2023-09-07 16:29:34

第二章节学习如何使用PyVISA控制信号发生器之后,我们继续以控制频谱仪为例程讲解仪器控制与PyLink和openpyxl结合使用,更为方便的处理数据。

openpyxl模块详细信息请参考:

https://openpyxl.readthedocs.io/en/stable/

https://pypi.org/project/openpyxl/

为了测试32Mhz晶体频偏与Goodix BLE MCU系列内部可调XO_CAP寄存器的关系,需要用到三个模块,PyVISAPyLinkopenpyxl,其中PyVISA控制频谱仪读取晶体振荡频率参数,PyLink控制Goodix BLE MCU内部XO_CAP参数,openpyxl负责记录频偏和XO_CAP信息。

GR533x系列为例,调整XO_CAP寄存器位于0x4000A910地址,[18:10]bit域; xo_cap_ctrl<8:0>; Cload programmability from 50fF to 26pF on each side,default value=9'b100000000;

1, 首先创建Excel文件

test_results = openpyxl.Workbook()
file_time = time.strftime('%Y-%m-%d-%H_%M_%S', time.localtime(time.time()))
savefilename = 'XO_CAP_Test_' + file_time + '.xlsx'
folder_path = "D:\\ test_results_temp"
file_path = os.path.join(folder_path, savefilename)
del test_results['Sheet']
sheet_results = test_results.create_sheet('XO_CAP')
sheet_results.cell(1, 1, 'XO_CAP value(int)')
sheet_results.cell(1, 2, 'XO_CAP value(hex)')
sheet_results.cell(1, 3, 'frequency(hz)')
sheet_results.cell(1, 4, 'frequency offset(hz)')
sheet_results.cell(1, 5, 'frequency offset(ppm)')

2, 初始化JLINK控制实例

jlink_address = '670023585'  #set the address of jlink
jlink_demo=Jlink_control.jlink_control_class(jlink_address=jlink_address)
jlink_demo.jlink_connect(jlink_type='SWD',jlink_pin_reset=0)

3, 初始化频谱仪控制实例

spectrum_address = 'TCPIP0::169.254.55.4::inst0::INSTR'  # PXA N9030A 26.5G
n9030b=Spectrum.spectrum_control(spectrum_address)
n9030b.spectrum_init(instrument_rst=0)

4, 配置相关变量,测试XO_CAP与32Mhz晶体关系

将频谱仪RF口接入到GR533x系列SK板子SMA头,调整频谱仪设置直到可以观测到微弱的32Mhz信号。

xo_cap = 0x0
power_expected=-70  #dbm
span=0.02    #Mhz
for i in range(0,0x1ff+1):
    jlink_demo.memWriteBit(0xA000C510,bitField = [19,23],bit_value = xo_cap)
 
    sheet_results.cell(i+2, 1, int(xo_cap))
    sheet_results.cell(i + 2, 2, hex(xo_cap))
    if xo_cap >= 0x1FF:
        break
    xo_cap += 1
    freq_32m = n9030b.xo_offset(center_freq=freq,ref_level=power_expected,span=span)
    sheet_results.cell(i+2, 3, freq_32m)
    sheet_results.cell(i+2, 4, freq_32m-32e6)
    sheet_results.cell(i + 2, 5, (freq_32m - 32e6)/32)
 
test_results.save(file_path)

muRata晶体‘XRCGB32M000F1SBAR0’搭配GR533x SK板子测试结果如下:

N9030B频谱仪类定义如下:

class spectrum_control:
    def __init__(self,instrument_address):
        self.instrument_address = instrument_address
        self.spectrum = 0
        
    def spectrum_init(self,instrument_rst=0):
        rm = pyvisa.ResourceManager()
        self.spectrum = rm.open_resource(self.instrument_address)
        # self.spectrum.read_termination = '\n'
        # self.spectrum.write_termination = ''
        print(self.spectrum.query('*IDN?'))
        if instrument_rst == 1:
            self.spectrum.write(':SYST:PRES')
            print('spectrum reset success')
            
    def xo_offset(self,center_freq=32,span=0.02,rbw='auto',vbw='auto',ref_level=-40,avg_number=10):
        print('center_freq(Mhz)=', center_freq)
        print('span(Mhz)=', span)
        self.spectrum.write(f':FREQ:RF:CENT {center_freq} MHz')
        self.spectrum.write(f':FREQ:SPAN {span} MHz')
        self.spectrum.write(f':DISP:WIND:TRAC:Y:RLEV {ref_level} dBm')
        self.spectrum.write(':BWID:AUTO ON')
        self.spectrum.write(':BWID:VID:AUTO ON')
        self.spectrum.write(':POW:ATT:AUTO ON')
        self.spectrum.write(':INIT:SAN')
        self.spectrum.write(':INIT:CONT ON')
        self.spectrum.write(':AVERage:COUNt 10')
        self.spectrum.write(':CALC:MARK1:MAX')
        self.spectrum.write(':CALC:MARK:CPS ON')
        time.sleep(0.2)
        x_peak = self.spectrum.query(':CALC:MARK1:X?')
        print('MARK PEAK(X)=', x_peak)
        return round(float(x_peak), 1)


1收藏

3赞成

1条评论
您的评论
我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注