diff --git a/ohmpi/hardware_system.py b/ohmpi/hardware_system.py index 35cfad9a04f2c7cd5d10663118a802d80b8a456c..60a4c64d13442bca0ff540a3021de30c97e48eb4 100644 --- a/ohmpi/hardware_system.py +++ b/ohmpi/hardware_system.py @@ -356,8 +356,8 @@ class OhmPiHardware: return new_vab - def _compute_tx_volt(self, pulse_duration=0.1, strategy='vmax', tx_volt=5., vab_max=voltage_max, - iab_max=current_max, vmn_max=None, vmn_min=voltage_min, polarities=(1, -1), delay=0.05, + def _compute_tx_volt(self, pulse_duration=0.1, strategy='vmax', tx_volt=5., vab_max=None, + iab_max=None, vmn_max=None, vmn_min=voltage_min, polarities=(1, -1), delay=0.05, p_max=None, diff_vab_lim=2.5, n_steps=4): # TODO: Optimise how to pass iab_max, vab_max, vmn_min """Estimates best Tx voltage based on different strategies. @@ -402,6 +402,10 @@ class OhmPiHardware: if self.tx.pwr.voltage_adjustable: if vmn_max is None: vmn_max = self.rx._voltage_max / 1000. + if iab_max is None: + iab_max = current_max + if vab_max is None: + vab_max = voltage_max # print(f'Vmn max: {vmn_max}') if p_max is None: p_max = vab_max * iab_max @@ -430,30 +434,31 @@ class OhmPiHardware: sampling_rate = self.rx.sampling_rate current, voltage = 0., 0. diff_vab = np.inf - while (k < n_steps) and (diff_vab > diff_vab_lim) and (vab_list[k]<vab_max): - vabs = [] - self._vab_pulses(vab_list[k], sampling_rate=self.rx.sampling_rate, durations=[0.2, 0.2], polarities=[1, -1]) - for pulse in range(2): - v = np.where((self.readings[:, 0] > delay) & (self.readings[:, 2] != 0) & (self.readings[:, 1]==pulse))[0] # NOTE : discard data aquired in the first x ms - iab = self.readings[v, 3]/1000. - vmn = np.abs(self.readings[v, 4]/1000. * self.readings[v, 2]) - new_vab = self._find_vab(vab_list[k], iab, vmn, p_max, vab_max, iab_max, vmn_max) - diff_vab = np.abs(new_vab - vab_list[k]) - vabs.append(new_vab) - # print(f'new_vab: {new_vab}, diff_vab: {diff_vab}\n') - if diff_vab < diff_vab_lim: - print('stopped on vab increase too small') - k = k + 1 - vab_list[k] = np.min(vabs) - time.sleep(0.5) - if self.tx.pwr.voltage_adjustable: - self.tx.voltage = vab_list[k] - if k > n_steps: - print('stopped on maximum number of steps reached') - vab_opt = vab_list[k] - # print(f'Selected Vab: {vab_opt:.2f}') - # if switch_pwr_off: - # self.tx.pwr.pwr_state = 'off' + if strategy=='vmax': + while (k < n_steps) and (diff_vab > diff_vab_lim) and (vab_list[k] < vab_max): + vabs = [] + self._vab_pulses(vab_list[k], sampling_rate=self.rx.sampling_rate, durations=[0.2, 0.2], polarities=[1, -1]) + for pulse in range(2): + v = np.where((self.readings[:, 0] > delay) & (self.readings[:, 2] != 0) & (self.readings[:, 1]==pulse))[0] # NOTE : discard data aquired in the first x ms + iab = self.readings[v, 3]/1000. + vmn = np.abs(self.readings[v, 4]/1000. * self.readings[v, 2]) + new_vab = self._find_vab(vab_list[k], iab, vmn, p_max, vab_max, iab_max, vmn_max) + diff_vab = np.abs(new_vab - vab_list[k]) + vabs.append(new_vab) + # print(f'new_vab: {new_vab}, diff_vab: {diff_vab}\n') + if diff_vab < diff_vab_lim: + print('stopped on vab increase too small') + k = k + 1 + vab_list[k] = np.min(vabs) + time.sleep(0.5) + if self.tx.pwr.voltage_adjustable: + self.tx.voltage = vab_list[k] + if k > n_steps: + print('stopped on maximum number of steps reached') + vab_opt = vab_list[k] + # print(f'Selected Vab: {vab_opt:.2f}') + # if switch_pwr_off: + # self.tx.pwr.pwr_state = 'off' else: vab_opt = tx_volt