예제 #1
0
    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)
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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)
예제 #6
0
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
예제 #7
0
    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,
예제 #8
0
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()
예제 #9
0
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 )