Esempio n. 1
0
    def get_hall_sensor_value_z(self, zReading, sensor_idx):
        zReading_Sensor = zReading[self.hall_sensor_reading_repetition *
                                   sensor_idx:self.
                                   hall_sensor_reading_repetition *
                                   (sensor_idx + 1)]
        # Kalman filter for hall sensor noise reduction
        zReading_Sensor_Average = Kalman_Filter(
            self.hall_sensor_reading_repetition, zReading_Sensor)

        return zReading_Sensor_Average
Esempio n. 2
0
    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))
Esempio n. 3
0
# number of readings
n_reading = 5

try:
    os.remove(data_folder + '/Current_Reading.csv') # delete current_reading.csv every time
except:
    print("file does not exist")
       
# read hall sensor value in Tesla
nmrObj.igbtSenReading(sen_address, n_reading)
zReading = parse_csv_returnZreading(data_folder, 'Current_Reading.csv')  # in Gauss
#os.remove(data_folder + '/Current_Reading.csv') # delete current_reading.csv every time
time.sleep(1.1) 

# kalman filter
ZReading_Average = Kalman_Filter(n_reading, zReading)
y = ZReading_Average
print("\n")   
print("\tCurrent hall reading is : {}".format(y))
print("\tSensor Address is : {}".format(sen_address))
print("\n")      

nmrObj.igbtPulse(plength, pspac, iter)

try:
    os.remove(data_folder + '/Current_Reading.csv') # delete current_reading.csv every time
except:
    print("file does not exist")

# read hall sensor value in Tesla
# nmrObj.igbtSenReading(sen_address, n_reading)
n_iter = 1  # number of iteration for hall reading

for t in range(0, 3):  # control algorithm main loop
    r = setpoint  # read target magnetization value, e.g. from GUI

    # --------------------------------------
    # read hall sensor value in Tesla
    nmrObj.igbtSenReading(sen_address, n_iter)
    zReading = parse_csv_returnZreading(data_folder,
                                        'Current_Reading.csv')  # in Gauss
    time.sleep(0.1)

    # average
    #ZReading_Average = sum(zReading)/len(zReading)/10      # transfer to mT
    # kalman filter
    ZReading_Average = Kalman_Filter(n_iter, zReading)
    y = ZReading_Average
    print("\n")
    print("\tCurrent hall reading is : {}".format(y))
    print("\n")

    # --------------------------------------
    #print(y)
    e = r - y
    #print(e)                                    # calculate setpoint tracking error
    P = Kp * (b * r - y)  # compute proportional part
    u = P + I  # compute output

    if u > maxDutyCycle:  # anti-windup strategy
        u = maxDutyCycle
        #plength_forward[0] = 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)