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