Exemple #1
0
    def read_hall_sensor_array(self):
        enable_message = False
        self.nmrObj.igbtSenReadingMulti(self.hall_sensor_address,
                                        self.hall_sensor_reading_repetition,
                                        enable_message)
        zReading = parse_csv_returnZreading(self.data_folder,
                                            'Current_Reading.csv')

        return zReading
Exemple #2
0
                                        output_limits=(min_pulse_length,max_pulse_length), 
                                        setpoint_weighting=False,
                                        proportional_on_input=False,
                                        output_enabled=pulse_on[n]))
# ------------------------------------------------------------------------------

for t in range(0, loop_iteration_total):
    plength = np.zeros(num_channel)

    print("Start of iteration ",t,"/",loop_iteration_total)

    # read all hall sensor values in Gauss
    if t > 10:
        n_reading = 1 # increase readings for higher precision at setpoint
    nmrObj.igbtSenReadingMulti(sen_address, n_reading, enable_message)
    zReading = parse_csv_returnZreading(data_folder, 'Current_Reading.csv') 
    
    for n in range(0,magnets_num):        
        
        # get hall sensor value for magnet n             
        zReading_Sensor = zReading[n_reading* n: n_reading*(n+1)]    
       
        # kalman filter for hall sensor noise reduction
        zReading_Sensor_Average = Kalman_Filter(n_reading, zReading_Sensor)
        
        # compute new output
        u = controllers[n].update(zReading_Sensor_Average)                            
        
        # assemble actuation vector
        if u >= 0:
            plength[forward_direction_addr[n]] = abs(np.int(u))      
def pulseMagnet(param_dict, setpoints, pulse_on, abs_pulse, loop_iteration_total=10, save_data=True):

    magnets_num = int(param_dict['number_of_magnets'])
    Kp = param_dict['Kp_init']
    Ki = param_dict['Ki_init']
    beta = param_dict['Beta']

    min_pulse_length, max_pulse_length = -abs_pulse, abs_pulse

    bh_factor = np.zeros(magnets_num)
    v1 = 1
    v2 = 1.5
    v3 = 3

    bh_factor[0] = v1
    bh_factor[1] = v2
    bh_factor[2] = v1
    bh_factor[3] = v2
    bh_factor[4] = v3
    bh_factor[5] = v2
    bh_factor[6] = v1
    bh_factor[7] = v2
    bh_factor[8] = v1

    for n in range(0, magnets_num):
        Kp_weight = Kp * bh_factor[n]
        Ki_weight = Ki * bh_factor[n]

        controllers.append(FeedbackController(Kp_weight, Ki_weight, Kd, beta,
                                              setpoint=setpoints[n],
                                              output_limits=(
                                                  min_pulse_length, max_pulse_length),
                                              setpoint_weighting=False,
                                              proportional_on_input=False,
                                              output_enabled=pulse_on[n],
                                              measurement_smoothing_enabled=False,
                                              measurement_smoothing_start=10,
                                              measurement_smoothing_past=3))

# ------------------------------------------------------------------------------

    for t in range(0, loop_iteration_total):
        plength = np.zeros(num_channel)

        print("Start of iteration {}".format(t))
        # read hall sensor value in Tesla
        nmrObj.igbtSenReadingMulti(sen_address, n_reading, enable_message)
        zReading = parse_csv_returnZreading(
            data_folder, 'Current_Reading.csv')  # in Gauss

        for n in range(0, magnets_num):
            # read hall sensor value in Tesla
            # nmrObj.igbtSenReading(sen_address[n], n_reading)

            zReading_Sensor = zReading[n_reading * n: n_reading*(n+1)]

            # kalman filter
            ZReading_Average = Kalman_Filter(n_reading, zReading_Sensor)
            y = ZReading_Average

            # average past measurements to reduce sensor noise
            t_past = 3
            if t > t_past:
                temp = np.mean(controllers[n].input_data[t-t_past:t])
                past_average = np.mean([temp, y])
                y = round(past_average, 2)

            # print("\n")
            print("\tCurrent hall reading is : {}".format(y))
            print("\tSensor Address is : {}".format(sen_address[n]))
            # print("\n")

            # ---------------------------
            # compute new ouput. Save value in array U
            u = controllers[n].update(y)
            # determine by the pin assignment to the channels
            u = u * (-1)

            if u >= 0:
                plength[forward_direction_addr[n]] = abs(
                    np.int(u))                         # actuate magnets

            if u < 0:
                plength[reverse_direction_addr[n]] = abs(np.int(u))

        # delete current_reading.csv every time
        os.remove(data_folder + '/Current_Reading.csv')
        print("\t plength : {}".format(plength))
        nmrObj.igbtPulseMagnetControl(plength, pspac, pulse_reptition)

    # save results as MAT file

    if save_data == True:
        experiment_data = {}
        st = datetime.datetime.fromtimestamp(
            time.time()).strftime('%Y_%m_%d %H_%M_%S')
        for n in range(0, magnets_num):
            experiment_data.update({'magnet_'+str(n): {
                'control_tunings': controllers[n].tunings,
                'beta': controllers[n].beta,
                'setpoint_weighting': controllers[n].setpoint_weighting,
                'proportional_on_input': controllers[n].proportional_on_input,
                'Iteration': controllers[n].time_total,
                'control_pulse': controllers[n].output_data,
                'magnetization': controllers[n].input_data,
                'error': controllers[n].error_data,
                'setpoint': controllers[n].setpoint,
                'integral': controllers[n].integral_data
            }})

    sio.savemat(logging_file_name+st+'.mat', experiment_data)
def pulseMagnet(param_dict,
                setpoints,
                pulse_on,
                abs_pulse=50,
                loop_iteration_total=10,
                save_data=True):

    magnets_num = int(param_dict['number_of_magnets'])
    Kp = param_dict['Kp_init']
    Ki = param_dict['Ki_init']
    beta = param_dict['Beta']

    min_pulse_length, max_pulse_length = -abs_pulse, abs_pulse

    magnets = []
    controllers = []

    for n in range(0, magnets_num):
        controllers.append(
            FeedbackController(Kp,
                               Ki,
                               Kd,
                               beta,
                               setpoint=setpoints,
                               output_limits=(min_pulse_length,
                                              max_pulse_length),
                               setpoint_weighting=False,
                               proportional_on_input=False,
                               output_enabled=pulse_on[n]))
    # ------------------------------------------------------------------------------

    for t in range(0, loop_iteration_total):
        plength = np.zeros(num_channel)

        print("Start of iteration ", t, "/", loop_iteration_total)

        # read all hall sensor values in Gauss
        if t > 10:
            n_reading = 1  # increase readings for higher precision at setpoint
        nmrObj.igbtSenReadingMulti(sen_address, n_reading, enable_message)
        zReading = parse_csv_returnZreading(data_folder, 'Current_Reading.csv')

        for n in range(0, magnets_num):

            # get hall sensor value for magnet n
            zReading_Sensor = zReading[n_reading * n:n_reading * (n + 1)]

            # kalman filter for hall sensor noise reduction
            zReading_Sensor_Average = Kalman_Filter(n_reading, zReading_Sensor)

            # compute new output
            u = controllers[n].update(zReading_Sensor_Average)

            # assemble actuation vector
            if u >= 0:
                plength[forward_direction_addr[n]] = abs(np.int(u))

            if u < 0:
                plength[reverse_direction_addr[n]] = abs(np.int(u))

            print("\tHall Sensor [", sen_address[n], "]",
                  "=", zReading_Sensor_Average, "Gauss", "==> Pulse:",
                  round(u, 2), "us")

        nmrObj.igbtPulseMagnetControl(plength, pspac,
                                      pulse_reptition)  # actuate magnets
        print("\t plength : {}".format(plength))

    # save results as MAT file
    if save_data == True:
        experiment_data = {}
        st = datetime.datetime.fromtimestamp(
            time.time()).strftime('%Y_%m_%d %H_%M_%S')
        for n in range(0, magnets_num):
            experiment_data.update({
                'magnet_' + str(n): {
                    'control_tunings': controllers[n].tunings,
                    'beta': controllers[n].beta,
                    'setpoint_weighting': controllers[n].setpoint_weighting,
                    'proportional_on_input':
                    controllers[n].proportional_on_input,
                    'Iteration': controllers[n].time_total,
                    'control_pulse': controllers[n].output_data,
                    'magnetization': controllers[n].input_data,
                    'error': controllers[n].error_data,
                    'setpoint': controllers[n].setpoint,
                    'integral': controllers[n].integral_data
                }
            })

        sio.savemat(logging_file_name + st + '.mat', experiment_data)