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
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)