def __init__( self, num_channels=36, max_pulse_length_hardware_limit=200, # maximum pulse length pulse_repetition=1, # number of pulses in one sequence hall_sensor_address=[28, 29, 31, 33, 32, 30, 34, 35, 36], # Pin address assignment actuation_forward_direction_address=[ 2, 6, 3, 7, 10, 14, 11, 15, 18 ], actuation_reverse_direction_address=[0, 4, 1, 5, 8, 12, 9, 13, 16], hall_sensor_reading_repetition=1, data_folder="/root/HallSensorData"): self.num_channels = num_channels self.max_pulse_length_hardware_limit = max_pulse_length_hardware_limit self.pulse_repetition = pulse_repetition self.actuation_vector = np.zeros(self.num_channels) self.hall_sensor_address = hall_sensor_address self.actuation_forward_direction_address = actuation_forward_direction_address self.actuation_reverse_direction_address = actuation_reverse_direction_address self.hall_sensor_reading_repetition = hall_sensor_reading_repetition # data folder self.data_folder = data_folder en_remote_dbg = 0 self.nmrObj = tunable_nmr_system_2018(self.data_folder, en_remote_dbg)
def init ( client_data_folder ): # enable remote debugging with SoC computing en_remote_dbg = 0 # remote computing configuration. See the NMR class to see details of use en_remote_computing = 1 # 1 when using remote PC to process the data, and 0 when using the remote SoC to process the data # nmr object declaration nmrObj = tunable_nmr_system_2018( client_data_folder, en_remote_dbg, en_remote_computing ) # system setup nmrObj.initNmrSystem() # necessary to set the GPIO initial setting nmrObj.deassertAll() nmrObj.assertControlSignal( nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk ) # enable power and signal path nmrObj.assertControlSignal( nmrObj.RX1_2L_msk | nmrObj.RX_SEL2_msk | nmrObj.RX_FL_msk ) # nmrObj.assertControlSignal( nmrObj.RX1_2L_msk | nmrObj.RX1_2H_msk | nmrObj.RX_SEL2_msk | nmrObj.RX_FL_msk | nmrObj.RX_FH_msk ) # nmrObj.setPreampTuning( conf.vbias, conf.vvarac ) # try -2.7, -1.8 if fail return nmrObj
def init(client_data_folder): # enable remote debug option if working within the SoC en_remote_dbg = 0 # remote computing configuration. See the NMR class to see details of use en_remote_computing = 1 # 1 when using remote PC to process the data, and 0 when using the remote SoC to process the data # instantiate nmr object nmrObj = tunable_nmr_system_2018(client_data_folder, en_remote_dbg, en_remote_computing) # system setup nmrObj.initNmrSystem() # necessary to set the GPIO initial setting nmrObj.deassertAll() nmrObj.assertControlSignal(nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk) nmrObj.assertControlSignal(nmrObj.RX1_1L_msk | nmrObj.RX1_1H_msk | nmrObj.RX2_L_msk | nmrObj.RX2_H_msk | nmrObj.RX_SEL1_msk | nmrObj.RX_FL_msk | nmrObj.RX_FH_msk | nmrObj.PAMP_IN_SEL2_msk) nmrObj.deassertControlSignal(nmrObj.RX1_1H_msk | nmrObj.RX_FH_msk | nmrObj.RX_FH_msk) # nmrObj.deassertControlSignal( nmrObj.RX_FL_msk ) nmrObj.setMatchingNetwork(0, 0) return nmrObj
def init( client_data_folder ): # enable remote debugging with SoC computing en_remote_dbg = 0 # remote computing configuration. See the NMR class to see details of use en_remote_computing = 1 # 1 when using remote PC to process the data, and 0 when using the remote SoC to process the data # nmr object declaration nmrObj = tunable_nmr_system_2018( client_data_folder, en_remote_dbg, en_remote_computing ) # system setup nmrObj.initNmrSystem() # necessary to set the GPIO initial setting nmrObj.assertControlSignal( nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk ) nmrObj.deassertControlSignal( nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk ) nmrObj.setMatchingNetwork( 0, 0 ) return nmrObj
L = 2.438e-6 coilLength = 36e-3 numTurns = 37 coilFactor = 0.675 # measured_eff_p90/calc'ed_p90. Equal to 1 for calc'ed_p90 # magnet param B0 = 0.099 # T gamma = 42.57 # MHz/T print( "freq estimate: %3.3f MHz" % ( gamma * B0 ) ) P90, Pwatt = calcP90( Vpp, rs, L, cpmg_freq * 1e6, numTurns, coilLength, coilFactor ) print( "P90 len estimate: %3.3f us, power estimate: %3.3f Watts" % ( P90 * 1e6, Pwatt ) ) ''' # instantiate nmr object nmrObj = tunable_nmr_system_2018(client_data_folder, en_remote_dbg, en_remote_computing) # system setup nmrObj.initNmrSystem( ) # necessary to set the GPIO initial setting. Also fix the nmrObj.assertControlSignal(nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk) # nmrObj.deassertControlSignal( # nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk) nmrObj.setPreampTuning(conf.vbias, conf.vvarac) nmrObj.setMatchingNetwork(conf.cpar, conf.cser)
data_folder = "/root/NMR_DATA" en_fig = 1 en_remote_dbg = 0 # remote debug setup if en_remote_dbg: from pydevd_file_utils import setup_client_server_paths server_path = '/root/nmr_pcb20_hdl10_2018/MAIN_nmr_code/' client_path = 'D:\\GDrive\\WORKSPACES\\Eclipse_Python_2018\\RemoteSystemsTempFiles\\129.22.143.88\\root\\nmr_pcb20_hdl10_2018\\MAIN_nmr_code\\' PATH_TRANSLATION = [(client_path, server_path)] setup_client_server_paths(PATH_TRANSLATION) # pydevd.settrace("dajo-compaqsff") pydevd.settrace("129.22.143.39") # system setup nmrObj = tunable_nmr_system_2018(data_folder) nmrObj.initNmrSystem() # nmrObj.turnOnPower() # nmrObj.assertControlSignal(nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | # nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk) #nmrObj.setPreampTuning(-3.35, -1.4) #nmrObj.setMatchingNetwork(19, 66) # nmrObj.setSignalPath() # nmrObj.assertControlSignal(nmrObj.AMP_HP_LT1210_EN_msk | # nmrObj.PAMP_IN_SEL_RX_msk | nmrObj.RX_IN_SEL_1_msk) # cpmg settings cpmg_freq = 2 # 4.253 original 4.188 pulse2_us = 20 # pulse pi length pulse2_dtcl = 0.5 # useless with current code
c_init = 0.0 # coil parasitic capacitance else: if ccSeed: # if ccSeed is used, set these parameters below cpar_init = 250 # the parallel capacitance cser_init = 141 # the series capacitance. This value is not necessary what's reported on the final table # search settings # searchMode = findAbsMin # if searchMode == findMinMin: # find the minimum allowable S11 and then stop S11_min = -10 # the minimum allowable S11 value to be reported as adequate to stop search in findMinMin # printf( 'search mode is findMinMin. Search stops when S11 of {:0.2f}dB is found.'.format( S11_min ) ) # elif searchMode == findAbsMin: # find the absolute minimum given the frequency range # printf( 'search mode is findAbsMin.' ) # instantiate nmr object nmrObj = tunable_nmr_system_2018(data_parent_folder, en_remote_dbg) # create name for new folder now = datetime.now() datename = now.strftime("%Y_%m_%d_%H_%M_%S") swfolder = data_parent_folder + '/' + datename + '_genS11Table' os.mkdir(swfolder) # find the initial cpar and cser values CsTbl, CpTbl = read_PARAM_mtch_ntwrk_caps(nmrObj.work_dir + tblMtchNtwrk) if lrSeed: # if coil parameters are available # seeds for cpar and cser are computed via L,R, and frequency print('The coil parameters are known: {:0.2f}uH {:0.0f}mOhm {:0.1f}pF'. format(l_init * 1e6, r_init * 1e3, c_init * 1e12)) f_init = (S11FreqSto - S11FreqSta) / 2 # set the center frequency _, cpar_init, cs_init = comp_Copt(l_init, r_init, c_init, f_init, CsTbl,
def nmr_t2_auto ( cpmg_freq, pulse1_us, pulse2_us, echo_spacing_us, scan_spacing_us, samples_per_echo, echoes_per_scan, init_adc_delay_compensation, number_of_iteration, ph_cycl_en, dconv_lpf_ord, dconv_lpf_cutoff_Hz, client_data_folder ): # configurations en_fig = 1 # enable figure direct_read = 0 # perform direct read from SDRAM. use with caution above! process_data = 1 # process data within the SoC en_remote_dbg = False en_remote_computing = True pulse1_dtcl = 0.5 # useless with current code pulse2_dtcl = 0.5 # useless with current code pulse180_t1_int = 0 delay180_t1_int = 0 tx_sd_msk = 1 # 1 to shutdown tx opamp during reception, or 0 to keep it powered up during reception en_dconv = 0 # enable downconversion in the fpga dconv_fact = 4 # downconversion factor. minimum of 4. echo_skip = 1 # echo skip factor. set to 1 for the ADC to capture all echoes # instantiate nmr object nmrObj = tunable_nmr_system_2018( client_data_folder, en_remote_dbg, en_remote_computing ) # system setup nmrObj.initNmrSystem() # necessary to set the GPIO initial setting. Also fix the nmrObj.assertControlSignal( nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk ) # nmrObj.deassertControlSignal( # nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk) Vbias, Vvarac = find_Vbias_Vvarac_from_table ( nmrObj.client_path , cpmg_freq, nmrObj.S21_table ) nmrObj.setPreampTuning( Vbias, Vvarac ) Cpar, Cser = find_Cpar_Cser_from_table ( nmrObj.client_path , cpmg_freq, nmrObj.S11_table ) nmrObj.setMatchingNetwork( Cpar, Cser ) nmrObj.setMatchingNetwork( Cpar, Cser ) # setting for WMP nmrObj.assertControlSignal( nmrObj.RX1_1L_msk | nmrObj.RX1_1H_msk | nmrObj.RX2_L_msk | nmrObj.RX2_H_msk | nmrObj.RX_SEL1_msk | nmrObj.RX_FL_msk | nmrObj.RX_FH_msk | nmrObj.PAMP_IN_SEL2_msk ) nmrObj.deassertControlSignal( nmrObj.RX1_1H_msk | nmrObj.RX_FH_msk ) # setting for UF # nmrObj.deassertControlSignal( nmrObj.RX_FL_msk ) # setting for WMP if ( direct_read ): datain = nmrObj.cpmgSequenceDirectRead( cpmg_freq, pulse1_us, pulse2_us, pulse1_dtcl, pulse2_dtcl, echo_spacing_us, scan_spacing_us, samples_per_echo, echoes_per_scan, init_adc_delay_compensation, number_of_iteration, ph_cycl_en, pulse180_t1_int, delay180_t1_int, tx_sd_msk ) else: nmrObj.cpmgSequence( cpmg_freq, pulse1_us, pulse2_us, pulse1_dtcl, pulse2_dtcl, echo_spacing_us, scan_spacing_us, samples_per_echo, echoes_per_scan, init_adc_delay_compensation, number_of_iteration, ph_cycl_en, pulse180_t1_int, delay180_t1_int, tx_sd_msk, en_dconv, dconv_fact, echo_skip ) datain = [] # set datain to 0 because the data will be read from file instead nmrObj.deassertControlSignal( nmrObj.RX1_1H_msk | nmrObj.RX1_1L_msk | nmrObj.RX2_L_msk | nmrObj.RX2_H_msk | nmrObj.RX_SEL1_msk | nmrObj.RX_FL_msk | nmrObj.RX_FH_msk | nmrObj.PAMP_IN_SEL2_msk ) nmrObj.setMatchingNetwork( 0, 0 ) nmrObj.setPreampTuning( 0, 0 ) nmrObj.deassertControlSignal( nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk ) if ( process_data ): # compute the generated data if en_remote_computing: # copy remote files to local directory cp_rmt_file( nmrObj.scp, nmrObj.server_data_folder, nmrObj.client_data_folder, "current_folder.txt" ) meas_folder = parse_simple_info( nmrObj.data_folder, 'current_folder.txt' ) if en_remote_computing: # copy remote folder to local directory cp_rmt_folder( nmrObj.scp, nmrObj.server_data_folder, nmrObj.client_data_folder, meas_folder[0] ) exec_rmt_ssh_cmd_in_datadir( nmrObj.ssh, "rm -rf " + meas_folder[0], nmrObj.server_data_folder ) # delete the file in the server ( a, a_integ, a0, snr, T2, noise, res, theta, data_filt, echo_avg, Df, t_echospace ) = compute_iterate( nmrObj, nmrObj.data_folder, meas_folder[0], 0, 0, 0, direct_read, datain, en_fig , dconv_lpf_ord, dconv_lpf_cutoff_Hz ) nmrObj.deassertAll() nmrObj.exit()
def nmr_t2_multifreq_auto ( cpmg_freq_list, pulse1_us, pulse2_us, echo_spacing_us, scan_spacing_us, multiscan_spacing_us, samples_per_echo, echoes_per_scan, init_adc_delay_compensation, number_of_iteration, ph_cycl_en, dconv_lpf_ord, dconv_lpf_cutoff_Hz, client_data_folder ): # configurations en_fig = 0 # enable figure direct_read = 0 # perform direct read from SDRAM. use with caution above! process_data = 1 # process data within the SoC en_remote_dbg = False en_remote_computing = True pulse1_dtcl = 0.5 # useless with current code pulse2_dtcl = 0.5 # useless with current code pulse180_t1_int = 0 delay180_t1_int = 0 tx_sd_msk = 1 # 1 to shutdown tx opamp during reception, or 0 to keep it powered up during reception en_dconv = 0 # enable downconversion in the fpga dconv_fact = 4 # downconversion factor. minimum of 4. echo_skip = 1 # echo skip factor. set to 1 for the ADC to capture all echoes # additional configurations timeObj = time_meas( True ) # error checker if ( not ( len( cpmg_freq_list ) % 2 ) ): print( "ERROR: please use odd n number for total different frequencies used inside cpmg_freq_list to ensure phase cycling works correctly." ) quit() # instantiate nmr object nmrObj = tunable_nmr_system_2018( client_data_folder, en_remote_dbg, en_remote_computing ) # system setup nmrObj.initNmrSystem() # necessary to set the GPIO initial setting. Also fix the nmrObj.assertControlSignal( nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk ) # nmrObj.deassertControlSignal( # nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk) Vbias, Vvarac = find_Vbias_Vvarac_from_table ( nmrObj.client_path , cpmg_freq_list[0], nmrObj.S21_table ) nmrObj.setPreampTuning( Vbias, Vvarac ) Cpar, Cser = find_Cpar_Cser_from_table ( nmrObj.client_path , cpmg_freq_list[0], nmrObj.S11_table ) nmrObj.setMatchingNetwork( Cpar, Cser ) nmrObj.setMatchingNetwork( Cpar, Cser ) vbias_list = np.zeros( len( cpmg_freq_list ), dtype = float ) vvarac_list = np.zeros( len( cpmg_freq_list ), dtype = float ) c_series_list = np.zeros( len( cpmg_freq_list ), dtype = int ) c_shunt_list = np.zeros( len( cpmg_freq_list ), dtype = int ) for i in range ( 0, len( cpmg_freq_list ) ): Vbias, Vvarac = find_Vbias_Vvarac_from_table ( nmrObj.client_path , cpmg_freq_list[i], nmrObj.S21_table ) Cpar, Cser = find_Cpar_Cser_from_table ( nmrObj.client_path , cpmg_freq_list[i], nmrObj.S11_table ) vbias_list[i] = Vbias vvarac_list[i] = Vvarac c_series_list[i] = Cser c_shunt_list[i] = Cpar # setting for WMP nmrObj.assertControlSignal( nmrObj.RX1_1L_msk | nmrObj.RX1_1H_msk | nmrObj.RX2_L_msk | nmrObj.RX2_H_msk | nmrObj.RX_SEL1_msk | nmrObj.RX_FL_msk | nmrObj.RX_FH_msk | nmrObj.PAMP_IN_SEL2_msk ) nmrObj.deassertControlSignal( nmrObj.RX1_1H_msk | nmrObj.RX_FH_msk ) # setting for UF # nmrObj.deassertControlSignal( nmrObj.RX_FL_msk ) # setting for WMP timeObj.setTimeSta() # nmrObj.cpmgSequence( cpmg_freq, pulse1_us, pulse2_us, pulse1_dtcl, pulse2_dtcl, echo_spacing_us, scan_spacing_us, samples_per_echo, echoes_per_scan, init_adc_delay_compensation, number_of_iteration, ph_cycl_en, pulse180_t1_int, delay180_t1_int, tx_sd_msk, en_dconv, dconv_fact, echo_skip ) # nmrObj.cpmgSequence( cpmg_freq, pulse1_us, pulse2_us, pulse1_dtcl, pulse2_dtcl, echo_spacing_us, scan_spacing_us, samples_per_echo, echoes_per_scan, init_adc_delay_compensation, number_of_iteration, ph_cycl_en, pulse180_t1_int, delay180_t1_int, tx_sd_msk, en_dconv, dconv_fact, echo_skip ) nmrObj.cpmgSequenceMultifreq( pulse1_us, pulse2_us, pulse1_dtcl, pulse2_dtcl, echo_spacing_us, scan_spacing_us, multiscan_spacing_us, samples_per_echo, echoes_per_scan, init_adc_delay_compensation, number_of_iteration, ph_cycl_en, pulse180_t1_int, delay180_t1_int, tx_sd_msk, en_dconv, dconv_fact, echo_skip, cpmg_freq_list, c_series_list, c_shunt_list, vbias_list, vvarac_list ) datain = [] # set datain to 0 because the data will be read from file instead timeObj.setTimeSto() timeObj.reportTimeRel( "cpmgSequenceMultifreq" ) nmrObj.deassertControlSignal( nmrObj.RX1_1H_msk | nmrObj.RX1_1L_msk | nmrObj.RX2_L_msk | nmrObj.RX2_H_msk | nmrObj.RX_SEL1_msk | nmrObj.RX_FL_msk | nmrObj.RX_FH_msk | nmrObj.PAMP_IN_SEL2_msk ) nmrObj.setMatchingNetwork( 0, 0 ) nmrObj.setPreampTuning( 0, 0 ) nmrObj.deassertControlSignal( nmrObj.PSU_15V_TX_P_EN_msk | nmrObj.PSU_15V_TX_N_EN_msk | nmrObj.PSU_5V_TX_N_EN_msk | nmrObj.PSU_5V_ADC_EN_msk | nmrObj.PSU_5V_ANA_P_EN_msk | nmrObj.PSU_5V_ANA_N_EN_msk ) if ( process_data ): # compute the generated data if en_remote_computing: # copy remote files to local directory cp_rmt_file( nmrObj.scp, nmrObj.server_data_folder, nmrObj.client_data_folder, "current_folder.txt" ) meas_folder = parse_simple_info( nmrObj.data_folder, 'current_folder.txt' ) for i in range ( 0, len( cpmg_freq_list ) ): meas_folder[0] = meas_folder[0][:len( meas_folder[0] ) - 3] + "%03d" % i # change the meas_folder name to different folder names generated by the C programming. 25 is the character count before the last 3 digit number. if en_remote_computing: # copy remote folder to local directory cp_rmt_folder( nmrObj.scp, nmrObj.server_data_folder, nmrObj.client_data_folder, meas_folder[0] ) exec_rmt_ssh_cmd_in_datadir( nmrObj.ssh, "rm -rf " + meas_folder[0], nmrObj.server_data_folder ) # delete the file in the server ( a, a_integ, a0, snr, T2, noise, res, theta, data_filt, echo_avg, Df, t_echospace ) = compute_iterate( nmrObj, nmrObj.data_folder, meas_folder[0], 0, 0, 0, direct_read, datain, en_fig , dconv_lpf_ord, dconv_lpf_cutoff_Hz )