From 7cd008d23c3cfc4ba238579828bcba33066332b8 Mon Sep 17 00:00:00 2001
From: Gijs Schoonderbeek <schoonderbeek@astron.nl>
Date: Fri, 24 Feb 2023 14:05:03 +0100
Subject: [PATCH] Working version for checking L2TS boards

---
 apsct_lib.py | 52 +++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 41 insertions(+), 11 deletions(-)

diff --git a/apsct_lib.py b/apsct_lib.py
index f46f995..b6f8762 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()
-- 
GitLab