Skip to content
Snippets Groups Projects

Apsct ad9511

1 file
+ 41
11
Compare changes
  • Side-by-side
  • Inline
+ 41
11
@@ -19,6 +19,7 @@ import APSCT_I2C
@@ -19,6 +19,7 @@ import APSCT_I2C
import time
import time
import RPi.GPIO as gpio
import RPi.GPIO as gpio
import random
import random
 
import numpy as np
sys.path.insert(0, '.')
sys.path.insert(0, '.')
import os
import os
if os.name == "posix":
if os.name == "posix":
@@ -246,7 +247,8 @@ class PllClass:
@@ -246,7 +247,8 @@ class PllClass:
divider_a = 1
divider_a = 1
divider_p = 1
divider_p = 1
divider_b = int((int(self.frequency[:-3]) * divider_r) / (10 * divider_p))
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)
charge_pump_current = 3 # 0 is low (0.6 mA), 7 is high (4.8 mA)
if self.frequency == '160MHz':
if self.frequency == '160MHz':
print("Select 160MHz clock")
print("Select 160MHz clock")
@@ -424,6 +426,33 @@ class ApsctSensors:
@@ -424,6 +426,33 @@ class ApsctSensors:
self.read_temp()
self.read_temp()
return True
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):
def read_all_voltages(self):
#
#
# Function to read and process one sensline
# Function to read and process one sensline
@@ -446,11 +475,11 @@ class ApsctSensors:
@@ -446,11 +475,11 @@ class ApsctSensors:
#
#
print("Check power sensor values")
print("Check power sensor values")
result = True
result = True
self.read_all_voltages()
self.read_all_avg_voltages()
self.read_temp()
self.read_temp()
for pwr in self.power_supplies:
for pwr in self.power_supplies:
expected = APSCT_I2C.PWR_VOUT[pwr]
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
result = False
print(f"Error: {pwr: <9} expected: {expected} V read: {self.voltages[pwr]:4.2f} V")
print(f"Error: {pwr: <9} expected: {expected} V read: {self.voltages[pwr]:4.2f} V")
else:
else:
@@ -476,8 +505,9 @@ class ApsctSensors:
@@ -476,8 +505,9 @@ class ApsctSensors:
if DEBUG:
if DEBUG:
stri = "Word to select sens input is 0x{0:x}".format(channel_select_word)
stri = "Word to select sens input is 0x{0:x}".format(channel_select_word)
print(stri)
print(stri)
self.dev_i2c_sensor.write_bytes(channel_select_word, 0xB8)
# 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, 0x80)
 
sleep(0.2) # Wait for device to take snapshot
ret_ack, ret_value = self.dev_i2c_sensor.read_last_reg(3)
ret_ack, ret_value = self.dev_i2c_sensor.read_last_reg(3)
if DEBUG:
if DEBUG:
stri = "Return value input 0 : 0x{0} ".format(ret_value)
stri = "Return value input 0 : 0x{0} ".format(ret_value)
@@ -485,7 +515,7 @@ class ApsctSensors:
@@ -485,7 +515,7 @@ class ApsctSensors:
if int(ret_value, 16) >= 0xC00000:
if int(ret_value, 16) >= 0xC00000:
print("over range")
print("over range")
else:
else:
steps = (int(ret_value, 16) & 0x1FFFFF) >> 6
steps = (int(ret_value, 16) & 0x1FFFFF) / 2**6
voltage = one_step * steps
voltage = one_step * steps
voltage = ((4.7+2.2)/2.2)*2*voltage # Resistor network + half swing
voltage = ((4.7+2.2)/2.2)*2*voltage # Resistor network + half swing
if DEBUG:
if DEBUG:
@@ -512,13 +542,13 @@ class ApsctSensors:
@@ -512,13 +542,13 @@ class ApsctSensors:
while (self.temperature > 100) & (loops < 2):
while (self.temperature > 100) & (loops < 2):
loops = loops + 1
loops = loops + 1
ret_ack, ret_value = self.dev_i2c_sensor.read_last_reg(3)
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
raw_value = (int(ret_value, 16) & 0x1FFFFF) >> 6
temperature_k = (raw_value/temp_slope)
temperature_k = (raw_value/temp_slope)
self.temperature = temperature_k-273
self.temperature = temperature_k-273
else:
else:
self.temperature = 9999
self.temperature = 9999
sleep(0.2)
sleep(0.2)
return self.temperature
return self.temperature
@@ -652,8 +682,8 @@ def main():
@@ -652,8 +682,8 @@ def main():
if False:
if False:
apsct.power(False)
apsct.power(False)
sleep(1)
sleep(1)
# apsct.power(True)
apsct.power(True)
# sleep(1)
sleep(1)
if False:
if False:
apsct.pll_200.write_byte_pll(0x06, 0xA5)
apsct.pll_200.write_byte_pll(0x06, 0xA5)
apsct.pll_200.write_byte_pll(0x5A, 0x01)
apsct.pll_200.write_byte_pll(0x5A, 0x01)
@@ -661,7 +691,7 @@ def main():
@@ -661,7 +691,7 @@ def main():
apsct.pll_200.read_lol()
apsct.pll_200.read_lol()
apsct.pll_200.read_lock()
apsct.pll_200.read_lock()
# apsct.pll_200.read_all_regs_pll()
# apsct.pll_200.read_all_regs_pll()
# apsct.sensors.read_all_voltages()
apsct.sensors.check_values()
if __name__ == "__main__":
if __name__ == "__main__":
main()
main()
Loading