diff --git a/apsct_lib.py b/apsct_lib.py index f46f9957d5fc8298e1653b33cd4bcdbac75197b8..b6f8762daa69c7418e57c1dc13b757ea7c0e5c62 100644 --- a/apsct_lib.py +++ b/apsct_lib.py @@ -19,6 +19,7 @@ import APSCT_I2C import time import RPi.GPIO as gpio import random +import numpy as np sys.path.insert(0, '.') import os if os.name == "posix": @@ -246,7 +247,8 @@ class PllClass: divider_a = 1 divider_p = 1 divider_b = int((int(self.frequency[:-3]) * divider_r) / (10 * divider_p)) - print(f"Divider P : {divider_p}, Divider A : {divider_a}, Divider B : {divider_b}") + if DEBUG: + print(f"Divider P : {divider_p}, Divider A : {divider_a}, Divider B : {divider_b}") charge_pump_current = 3 # 0 is low (0.6 mA), 7 is high (4.8 mA) if self.frequency == '160MHz': print("Select 160MHz clock") @@ -424,6 +426,33 @@ class ApsctSensors: self.read_temp() return True + def read_all_avg_voltages(self, avg_nr = 6): + # + # Function to read and process one sensline + # + # Return True when done + # + # To remove errors, repeat measurement when returned voltage is < 3 V + # + self.read_all_voltages() + sum_values= {"INPUT": [], + "PLL_160M": [], + "PLL_200M": [], + "DIST_A": [], + "DIST_B": [], + "DIST_C": [], + "DIST_D": [], + "CTRL": []} + for cnt in range(avg_nr): + self.read_all_voltages() + for pwr in self.power_supplies: + sum_values[pwr].append( self.voltages[pwr]) + for pwr in self.power_supplies: + median_value = np.median(sum_values[pwr]) + if DEBUG: + print(f"Power {pwr} last value {self.voltages[pwr]:.2f} V median {median_value:.2f} V" ) + self.voltages[pwr] = median_value + def read_all_voltages(self): # # Function to read and process one sensline @@ -446,11 +475,11 @@ class ApsctSensors: # print("Check power sensor values") result = True - self.read_all_voltages() + self.read_all_avg_voltages() self.read_temp() for pwr in self.power_supplies: expected = APSCT_I2C.PWR_VOUT[pwr] - if not (0.9*expected < self.voltages[pwr] < 1.1*expected): + if not (0.8*expected < self.voltages[pwr] < 1.2*expected): result = False print(f"Error: {pwr: <9} expected: {expected} V read: {self.voltages[pwr]:4.2f} V") else: @@ -476,8 +505,9 @@ class ApsctSensors: if DEBUG: stri = "Word to select sens input is 0x{0:x}".format(channel_select_word) print(stri) - self.dev_i2c_sensor.write_bytes(channel_select_word, 0xB8) - sleep(0.3) # Wait for device to take snapshot +# self.dev_i2c_sensor.write_bytes(channel_select_word, 0xB8) + self.dev_i2c_sensor.write_bytes(channel_select_word, 0x80) + sleep(0.2) # Wait for device to take snapshot ret_ack, ret_value = self.dev_i2c_sensor.read_last_reg(3) if DEBUG: stri = "Return value input 0 : 0x{0} ".format(ret_value) @@ -485,7 +515,7 @@ class ApsctSensors: if int(ret_value, 16) >= 0xC00000: print("over range") else: - steps = (int(ret_value, 16) & 0x1FFFFF) >> 6 + steps = (int(ret_value, 16) & 0x1FFFFF) / 2**6 voltage = one_step * steps voltage = ((4.7+2.2)/2.2)*2*voltage # Resistor network + half swing if DEBUG: @@ -512,13 +542,13 @@ class ApsctSensors: while (self.temperature > 100) & (loops < 2): loops = loops + 1 ret_ack, ret_value = self.dev_i2c_sensor.read_last_reg(3) - if ret_ack: + if ret_ack : raw_value = (int(ret_value, 16) & 0x1FFFFF) >> 6 temperature_k = (raw_value/temp_slope) self.temperature = temperature_k-273 else: self.temperature = 9999 - sleep(0.2) + sleep(0.2) return self.temperature @@ -652,8 +682,8 @@ def main(): if False: apsct.power(False) sleep(1) -# apsct.power(True) -# sleep(1) + apsct.power(True) + sleep(1) if False: apsct.pll_200.write_byte_pll(0x06, 0xA5) apsct.pll_200.write_byte_pll(0x5A, 0x01) @@ -661,7 +691,7 @@ def main(): apsct.pll_200.read_lol() apsct.pll_200.read_lock() # apsct.pll_200.read_all_regs_pll() -# apsct.sensors.read_all_voltages() + apsct.sensors.check_values() if __name__ == "__main__": main()