Compare commits
6 commits
75e3c60cc5
...
31e5155586
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
31e5155586 | ||
|
|
8b4b125637 | ||
|
|
2eb78585ab | ||
|
|
fdf7110741 | ||
|
|
ca5a803293 | ||
|
|
756e1c9fbd |
8 changed files with 248 additions and 108 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -18,3 +18,4 @@ ahepamfile
|
|||
nm64file
|
||||
mustang_scripts
|
||||
nm64/nm64
|
||||
ahepam/seth
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@
|
|||
4 SETH | monitor | Bias2 | Bias1 | VBias | NTC,E | NTC | NTC,R | Vss | Vcc |
|
||||
5 | VrefL | VrefL | VrefL | VrefL | VrefL | VrefL | VrefL | VrefL | VrefL |
|
||||
6 | Vref | Vref | Vref | Vref | Vref | Vref | Vref | Vref | Vref |
|
||||
7 SETH #1 | mon[A-H] | - | - | - | - | | | NTC | Ibias+|
|
||||
7 SETH #2 | mon[A-H] | - | - | - | - | | | NTC | Ibias+|
|
||||
7 SETH #1 | mon[A-H] | - | - | - | - | Iprim | Vprim | NTC,p | Ibias+|
|
||||
7 SETH #2 | mon[A-H] | - | - | - | - | Ibias-| Vbias+| NTC,i | Ibias+|
|
||||
|
||||
connector | channel (PIN) | shaper | CONN1 | ADC | data | dorn
|
||||
-----------------------------------------------------------------
|
||||
|
|
@ -40,23 +40,22 @@ connector | channel (PIN) | shaper | CONN1 | ADC | data | dorn
|
|||
CONN12 | 7 (7) | 22 | 46 | H2 | [0][7] | 7
|
||||
CONN12 | 8 (6) | 23 | 6 | H1 | [1][7] | 15
|
||||
|
||||
SETH
|
||||
|
||||
slice | HK | connector |
|
||||
---------------------------------
|
||||
0 | A7 | CONN2.14 | -
|
||||
0 | B7 | CONN2.15 | -
|
||||
0 | C7 | CONN2.16 | -
|
||||
0 | D7 | CONN2.17 | -
|
||||
0 | E7 | CONN3.2 |
|
||||
0 | F7 | CONN3.1 |
|
||||
0 | G7 | CONN3.14 | NTC
|
||||
0 | H7 | CONN3.15 | IBias+
|
||||
1 | A7 | CONN2.14 | -
|
||||
1 | B7 | CONN2.15 | -
|
||||
1 | C7 | CONN2.16 | -
|
||||
1 | D7 | CONN2.17 | -
|
||||
1 | E7 | CONN3.2 |
|
||||
1 | F7 | CONN3.1 |
|
||||
1 | G7 | CONN3.14 | NTC
|
||||
1 | H7 | CONN3.15 | IBias+
|
||||
slice | HK | connector | SETH |
|
||||
----------------------------------
|
||||
0 | A7 | CONN2.14 | - |
|
||||
0 | B7 | CONN2.15 | - |
|
||||
0 | C7 | CONN2.16 | - |
|
||||
0 | D7 | CONN2.17 | - |
|
||||
0 | E7 | CONN3.2 | Iprim |
|
||||
0 | F7 | CONN3.1 | Vprim |
|
||||
0 | G7 | CONN3.14 | NTC Pwr |
|
||||
0 | H7 | CONN3.15 | IBias+ |
|
||||
----------------------------------
|
||||
1 | A7 | CONN2.14 | - |
|
||||
1 | B7 | CONN2.15 | - |
|
||||
1 | C7 | CONN2.16 | - |
|
||||
1 | D7 | CONN2.17 | - |
|
||||
1 | E7 | CONN3.2 | Ibias- |
|
||||
1 | F7 | CONN3.1 | Vbias+ |
|
||||
1 | G7 | CONN3.14 | NTC ext |
|
||||
1 | H7 | CONN3.15 | IBias+ |
|
||||
|
|
|
|||
12
armlib.py
12
armlib.py
|
|
@ -377,6 +377,10 @@ class irena_ifc(object):
|
|||
r = self.cmd("var/print "+ch).split()[1]
|
||||
return self.Vref*(int(r)&0xffff)/0x10000;
|
||||
|
||||
def hk2degC(self, ch, r=1.0, β=3940):
|
||||
a = int(self.cmd("var/print "+ch).split()[1]) & 0xffff
|
||||
return NTC(a, r=r, β=β)
|
||||
|
||||
def housekeeping(self):
|
||||
self._log("dac %6.1f mV\n" % self.hk2mvolt("dac"))
|
||||
self._log("Ibias %6.1f mV\n" % self.hk2mvolt("adc_Ibias"))
|
||||
|
|
@ -691,6 +695,14 @@ def float2int(f, e=4, m=12, s=False):
|
|||
mm = -mm
|
||||
return mm
|
||||
|
||||
def NTC(a, r=1, β=4000, b=0x10000):
|
||||
"""Temp [°C] from ADC reading `a`
|
||||
`b`: ADC range (max+1)
|
||||
`r`: R₁/R₂₅
|
||||
`β`: slope [K]
|
||||
"""
|
||||
from math import log
|
||||
return β / (log(r*a/(b-a)) + β/298.0) - 273;
|
||||
|
||||
def irena_exit(status=0):
|
||||
try:
|
||||
|
|
|
|||
208
dorn.py
208
dorn.py
|
|
@ -5,6 +5,52 @@ def _connect(ifc):
|
|||
_ifc = ifc
|
||||
ecmd = ifc.ecmd
|
||||
|
||||
def degCβ(a, R1=10e3, R25=10e3, B25=3940, res=0x1000):
|
||||
if not a:
|
||||
a = 1
|
||||
R = R1 * a / (res - (a & (res-1)))
|
||||
T = B25/(math.log(R/R25) + B25/298) - 273
|
||||
return T
|
||||
|
||||
def degC(a, idx=0):
|
||||
return degCβ(a, **CONFIG.NTC[idx])
|
||||
|
||||
def HK_fmt(s, i, n, d):
|
||||
return f"{i}. {n}: {repr(d)}\n"
|
||||
|
||||
def HK3_fmt(s, i, n, d):
|
||||
return f"""{i}. {n}
|
||||
T = {d[5]:6.2f} °C" Ibias = {d[0]:6.3f} V,
|
||||
Vff = {d[1]:6.3f} V, Vnn = {d[2]:6.3f} V, Vpp = {d[3]:6.3f} V, Vdig = {d[4]:6.3f} V,
|
||||
Vcc = {d[6]:6.3f} V, Vss = {d[7]:6.3f} V.
|
||||
"""
|
||||
def HK4_AHBGO_fmt(s, i, n, d):
|
||||
return f"""{i}. {n}
|
||||
Tbgo = {d[0]:6.2f} °C, {d[1]:6.2f} °C, {d[3]:6.2f} °C,
|
||||
Vbias = {d[2]:6.3f} V, Ibias = {d[4]:6.1f} nA, {d[5]:6.1f} nA,
|
||||
Vcc = {d[7]:6.3f} V, Vss = {d[6]:6.3f} V.
|
||||
"""
|
||||
def HK4_SETH_fmt(s, i, n, d):
|
||||
return f"""{i}. {n}
|
||||
Tpa = {d[4]:6.2f} °C, Tbgo = {d[3]:6.2f} °C, {d[5]:6.2f} °C,
|
||||
Vbias = {d[2]:6.3f} V, Ibias = {d[1]:6.1f} nA, {d[0]:6.1f} nA,
|
||||
Vcc = {d[7]:6.3f} V, Vss = {d[6]:6.3f} V.
|
||||
"""
|
||||
def HK7_SETH_fmt(s, i, n, d):
|
||||
if s==0:
|
||||
return f"""{i}. {n}
|
||||
na = {repr(d[:4])}
|
||||
Tpwr = {d[6]:.1f} °C,
|
||||
Vprim = {d[5]:.1f} V, Iprim = {d[4]:.1f} mA,
|
||||
Ibias⁺ = {d[7]:.1f} nA.
|
||||
"""
|
||||
return f"""{i}. {n}
|
||||
na = {repr(d[:4])}
|
||||
Text = {d[6]:.1f} °C,
|
||||
Ibias = {d[4]:.1f} nA.
|
||||
Ibias⁺ = {d[7]:.1f} nA, Vbias⁺ = {d[5]:.1f} V.
|
||||
"""
|
||||
|
||||
class DORN_CONFIG:
|
||||
# stis_ana_core 2×24 ch
|
||||
dorn_addr = 0x2000
|
||||
|
|
@ -21,6 +67,86 @@ class DORN_CONFIG:
|
|||
(6, 2000, -1082),
|
||||
(7, 1125, -1888),
|
||||
)
|
||||
|
||||
HK3 = [[
|
||||
("Ibias", 10470/470 * 51/1051 * 100),
|
||||
("Vff", 2.0),
|
||||
("Vnn", 2.5, ("Vpp", -1.5)),
|
||||
("Vpp", 2.0),
|
||||
("Vdig", 2.0),
|
||||
("Tadc", (degC, {})),
|
||||
("Vcc", 2.0),
|
||||
("Vss", 2.5, ("Vcc", -1.5)),
|
||||
]]
|
||||
|
||||
HK4_AHBGO = [[
|
||||
("Tbgo₁", (degC, {})),
|
||||
("Tbgo₂", (degC, {})),
|
||||
("Vbias", -1/0.047),
|
||||
("Tbgo₃", (degC, {})),
|
||||
("Ibias₁", 10470/470 * 51/1051 * 100),
|
||||
("Ibias₂", 10470/470 * 51/1051 * 100),
|
||||
("Vss", 2.5, ("Vcc", -1.5)),
|
||||
("Vcc", 2.0),
|
||||
]]
|
||||
|
||||
HK4_SETH = [
|
||||
[
|
||||
("Ibias₂", 10470/470 * 51/1051 * 100, -97),
|
||||
("Ibias₁", 10470/470 * 51/1051 * 100, -135),
|
||||
("Vbias", -1/0.047),
|
||||
("Tbgo₁", (degC, {})),
|
||||
("Tpa", (degC, {})),
|
||||
("Tbgo₂", (degC, {})),
|
||||
("Vss", 2.5, ("Vcc", -1.5)),
|
||||
("Vcc", 2.0),
|
||||
],
|
||||
[
|
||||
("Ibias₂", 10470/470 * 51/1051 * 100, -98),
|
||||
("Ibias₁", 10470/470 * 51/1051 * 100, -112),
|
||||
("Vbias", -1/0.047, 2.0),
|
||||
("Tbgo₁", (degC, {})),
|
||||
("Tpa", (degC, {})),
|
||||
("Tbgo₂", (degC, {})),
|
||||
("Vss", 2.5, ("Vcc", -1.5)),
|
||||
("Vcc", 2.0),
|
||||
],
|
||||
]
|
||||
|
||||
HK7_SETH = [
|
||||
[
|
||||
("na₁",),
|
||||
("na₂",),
|
||||
("na₃",),
|
||||
("na₄",),
|
||||
("Iprim", 2000.0),
|
||||
("Vprim", 16.3),
|
||||
("Tpwr", (degC, {})),
|
||||
("Ibias⁺", 100.0),
|
||||
],
|
||||
[
|
||||
("na₁",),
|
||||
("na₂",),
|
||||
("na₃",),
|
||||
("na₄",),
|
||||
("Ibias", 100.0),
|
||||
("Vbias⁺", 100.0),
|
||||
("Text", (degC, {})),
|
||||
("Ibias⁺", 100.0),
|
||||
],
|
||||
]
|
||||
|
||||
HK = [
|
||||
("INP₀", None, HK_fmt),
|
||||
("INP₁", None, HK_fmt),
|
||||
("INP₂", None, HK_fmt),
|
||||
("HK ADC", HK3, HK3_fmt),
|
||||
("HK PA", HK4_AHBGO, HK4_AHBGO_fmt),
|
||||
("VrefL", None, HK_fmt),
|
||||
("VrefH", None, HK_fmt),
|
||||
("HK_PWR", None, HK_fmt),
|
||||
]
|
||||
|
||||
def n_adc(self):
|
||||
return self.n_channels//3
|
||||
|
||||
|
|
@ -41,8 +167,80 @@ class DORN_CONFIG:
|
|||
|
||||
NTC = [dict(R1=10e3, R25=10e3, B25=3940, res=0x1000)]
|
||||
|
||||
def seth(self):
|
||||
# ! change the class attribute
|
||||
self.HK[4] = ("HK PA", self.HK4_SETH, HK4_SETH_fmt)
|
||||
self.HK[7] = ("HK_PWR", self.HK7_SETH, HK7_SETH_fmt)
|
||||
|
||||
CONFIG = DORN_CONFIG()
|
||||
|
||||
def hk(sl, what="print", data=None):
|
||||
if not data:
|
||||
ecmd("alt/stream/off")
|
||||
_ifc.menable()
|
||||
fifo_enable(en=True, sl=sl, hk=True)
|
||||
fifo_reset(sl=sl, hk=True)
|
||||
strobe(sl=sl, hk=True)
|
||||
time.sleep(0.1)
|
||||
fifo_read(sl=sl, hk=True)
|
||||
data=_ifc.read_fifo()
|
||||
if data[0] != 0x5710 + sl:
|
||||
raise ValueError("Read HK packet error", data)
|
||||
if what=="data":
|
||||
return data
|
||||
ND = CONFIG.n_adc()
|
||||
NV = ND
|
||||
data = [d & 0xfff for d in data]
|
||||
data = [data[ND*i+1:ND*i+1+NV] for i in range(8)]
|
||||
if what=="raw":
|
||||
return data
|
||||
Vref = CONFIG.Vref(sl)/4096
|
||||
ddata = []
|
||||
for a in range(8):
|
||||
V = {}
|
||||
ddata.append(V)
|
||||
HK = CONFIG.HK[a][1]
|
||||
# cookbook:
|
||||
# None
|
||||
# (name, factor, offset)
|
||||
# (name, factor, (offset_name, factor))
|
||||
# (name, (func, {args}))
|
||||
if not HK:
|
||||
V.update({c:data[a][c] for c in range(8)})
|
||||
continue
|
||||
HK = HK[sl % len(HK)]
|
||||
for c in range(8):
|
||||
H = HK[c]
|
||||
if len(H) > 1:
|
||||
if isinstance(H[1], tuple):
|
||||
data[a][c] = H[1][0](data[a][c], **H[1][1])
|
||||
else:
|
||||
data[a][c] *= Vref*H[1]
|
||||
V[H[0]] = data[a][c]
|
||||
for c in range(8):
|
||||
H = HK[c]
|
||||
if len(H) > 2:
|
||||
if isinstance(H[2], tuple):
|
||||
data[a][c] += V[H[2][0]] * H[2][1]
|
||||
else:
|
||||
data[a][c] += H[2]
|
||||
V[H[0]] = data[a][c]
|
||||
|
||||
if what=="cooked":
|
||||
return data
|
||||
if what=="dict":
|
||||
return ddata
|
||||
|
||||
r = []
|
||||
for a in range(8):
|
||||
H=CONFIG.HK[a]
|
||||
# (name, [cookbooks], fmt_function)
|
||||
r.append(H[2](sl, a, H[0], data[a]))
|
||||
|
||||
if what=="print":
|
||||
sys.stderr.write("".join(r))
|
||||
return r
|
||||
|
||||
def dorn_config(a, v=None, mes=None, slice=0):
|
||||
verb = CONFIG.verbose
|
||||
a |= CONFIG.dorn_addr | (slice<<11)
|
||||
|
|
@ -237,16 +435,6 @@ def fifo_read(**aa):
|
|||
else:
|
||||
dorn_config(0x085, f)
|
||||
|
||||
def degCβ(a, R1=10e3, R25=10e3, B25=3940, res=0x1000):
|
||||
if not a:
|
||||
a = 1
|
||||
R = R1 * a / (res - (a & (res-1)))
|
||||
T = B25/(math.log(R/R25) + B25/298) - 273
|
||||
return T
|
||||
|
||||
def degC(a, idx=0):
|
||||
return degCβ(a, **CONFIG.NTC[idx])
|
||||
|
||||
def default_config(thr=0x7ff):
|
||||
for sl in CONFIG.slices:
|
||||
for ch in range(CONFIG.n_channels):
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ dorn/fifo/strobe/inj 0x30
|
|||
@s/if ! udp_rx_cmd: var udp_size=0
|
||||
@s/if udp_rx_cmd > U: var V=time
|
||||
@var U=udp_rx_cmd
|
||||
@s/if V+600 < time: var udp_size=0
|
||||
@s/if V+W < time: var udp_size=0
|
||||
@s/if enc == 0xb: eth/rx/en
|
||||
@s/if enc != 0xf: var udp_size=0
|
||||
@s/if udp_size: s/exit
|
||||
|
|
|
|||
|
|
@ -8,5 +8,6 @@ altera/file "NMAHEPAM.RBF"
|
|||
@s/if errno>=500: s/exit
|
||||
@e/eval "s/exe 'SN%d.RC'", serial
|
||||
@s/exe "DORN.RC"
|
||||
@sleep 10
|
||||
@s/if usb: s/exit
|
||||
@s/if F>4: s/exe "MEASURE.RC"
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ var/set spi_min_qtime = 665
|
|||
@v/set sd_write_count = 0
|
||||
@v/set udp_count = 0
|
||||
@v/set udp_size = 0
|
||||
@V W=600
|
||||
@v/set R=-1
|
||||
@script/cron/none
|
||||
@var/cache ssp_dma spy_return second time hk_count hk_mes
|
||||
|
|
|
|||
88
nmahepam.py
88
nmahepam.py
|
|
@ -11,9 +11,13 @@ def HK():
|
|||
Vprim = hk2mvolt("adc_Vprim")*(0.011)
|
||||
Vbias = hk2mvolt("adc_Vbias")*(-0.05)
|
||||
Ibias = hk2mvolt("adc_Ibias")*0.0955
|
||||
r = (Vcc, Vss, Icc, Iss, Vprim, Vbias, Ibias)
|
||||
print("Vcc:%4.2fV, Vss:%4.2fV, Icc:%6.1fmA, Iss:%6.1fmA, Vprim:%4.1fV, Vbias:%.1fV Ibias:%.1fnA" % r)
|
||||
return r
|
||||
Ibiasp = hk2mvolt("adc_dac")*0.0955
|
||||
Tntc7 = hk2degC("adc_Ifet", β=3940)
|
||||
Tntc8 = hk2degC("adc_Vfet", β=3940)
|
||||
print(f"Vcc:{Vcc:4.2f}V, Vss:{Vss:4.2f}V, Icc:{Icc:6.1f}mA, Iss:{Iss:6.1f}mA, Vprim:{Vprim:4.1f}V\n"
|
||||
f"Vbias:{Vbias:.1f}V Ibias:{Ibias:.1f}nA Ibias₂:{Ibiasp:.1f}nA\n"
|
||||
f"T₇:{Tntc7:.1f}°C T₈:{Tntc8:.1f}°C")
|
||||
return Vcc, Vss, Icc, Iss, Vprim, Vbias, Ibias, Ibiasp, Tntc7, Tntc8
|
||||
|
||||
def findnmahepam():
|
||||
findxrena(prod=(0xee0c,))
|
||||
|
|
@ -22,77 +26,6 @@ def findnmahepam():
|
|||
messages()
|
||||
HK()
|
||||
|
||||
#TO DO: Adjust
|
||||
def hk(sl, what="print", data=None):
|
||||
if not data:
|
||||
ecmd("alt/stream/off")
|
||||
menable()
|
||||
dorn.fifo_enable(en=True, sl=sl, hk=True)
|
||||
dorn.fifo_reset(sl=sl, hk=True)
|
||||
dorn.strobe(sl=sl, hk=True)
|
||||
time.sleep(0.1)
|
||||
dorn.fifo_read(sl=sl, hk=True)
|
||||
data=read_fifo()
|
||||
if data[0] != 0x5710 + sl:
|
||||
raise ValueError("Read HK packet error", data)
|
||||
if what=="data":
|
||||
return data
|
||||
ND = dorn.CONFIG.n_adc()
|
||||
NV = ND
|
||||
data = [d & 0xfff for d in data]
|
||||
data = [data[ND*i+1:ND*i+1+NV] for i in range(8)]
|
||||
if what=="raw":
|
||||
return data
|
||||
Vref = dorn.CONFIG.Vref(sl)/4096
|
||||
#NMAHEPAM:data[7][0] *= 2*Vref/4096 # Vcore
|
||||
data[4][0] = degC(data[4][0], 0) # T_BGO,EXT
|
||||
data[4][1] = degC(data[4][1], 0) # T_BGO,NTC
|
||||
data[4][2] *= -Vref/0.047 # V_bias
|
||||
data[4][3] = degC(data[4][3], 0) # T_BGO,REF
|
||||
data[4][4] *= Vref * 10470/470 * 51/1051 * 100 # Ibias
|
||||
data[4][5] *= Vref * 10470/470 * 51/1051 * 100 # Ibias
|
||||
data[4][7] *= Vref * 2 # VCC
|
||||
data[4][6] *= Vref * 2.5 # VSS
|
||||
data[4][6] -= 1.5*data[4][7] # VSS
|
||||
|
||||
data[3][0] *= Vref * 10470/470 * 51/1051 * 100 # Ibias
|
||||
data[3][1] *= Vref * 2 # Vff
|
||||
data[3][3] *= Vref * 2 # Vpp (V+6V)?
|
||||
data[3][2] *= Vref * 2.5 # Vnn
|
||||
data[3][2] -= 1.5*data[3][3] # Vnn
|
||||
data[3][4] *= Vref * 2 # Vdig (Vadc)
|
||||
data[3][5] = degC(data[3][5], 0) # NTC ?
|
||||
data[3][6] *= Vref * 2 # VCC
|
||||
data[3][7] *= Vref * 2.5 # VSS
|
||||
data[3][7] -= 1.5*data[3][6] # VSS
|
||||
|
||||
if what=="cooked":
|
||||
return data
|
||||
|
||||
r = f"""# nmahepam HK:
|
||||
0. {data[0]}
|
||||
1. {data[1]}
|
||||
2. {data[2]}
|
||||
|
||||
3. ADC board
|
||||
T = {data[3][5]:6.2f} °C
|
||||
Ibias = {data[3][0]:6.3f} V
|
||||
Vff = {data[3][1]:6.3f} V , Vnn = {data[3][2]:6.3f} V, Vpp = {data[3][3]:6.3f} V, Vdig = {data[3][4]:6.3f} V
|
||||
Vcc = {data[3][6]:6.3f} V, Vss = {data[3][7]:6.3f} V
|
||||
|
||||
4. PA board
|
||||
Tbgo = {data[4][0]:6.2f} °C, {data[4][1]:6.2f} °C, {data[4][3]:6.2f} °C
|
||||
Vbias = {data[4][2]:6.3f} V, Ibias = {data[4][4]:6.1f} nA, {data[4][5]:6.1f} nA
|
||||
Vcc = {data[4][7]:6.3f} V, Vss = {data[4][6]:6.3f} V
|
||||
5. {data[5]}
|
||||
6. {data[6]}
|
||||
7. {data[7]}
|
||||
"""
|
||||
|
||||
if what=="print":
|
||||
sys.stderr.write(r)
|
||||
return r
|
||||
|
||||
def TBITS(t):
|
||||
return sum([1<<n for n in t])
|
||||
|
||||
|
|
@ -115,7 +48,12 @@ def aenable(sl=None, hk=True, ev=True, **aa):
|
|||
enable()
|
||||
|
||||
if __name__=="__main__":
|
||||
ifc,_oo = armlib.init_irena(scope = globals(), name = "AHEPAM", prod = (0xee0c,))
|
||||
ifc,_oo = armlib.init_irena(scope = globals(), name = "AHEPAM", prod = (0xee0c,),
|
||||
long_options=["seth"])
|
||||
for o,v in _oo[0]:
|
||||
if o=="--seth":
|
||||
dorn.CONFIG.seth()
|
||||
armlib.set_prompt("SETH")
|
||||
ifc._stream_fifos = 'hk1/f1/f2/f3'
|
||||
if ifc.is_a("USB"):
|
||||
findnmahepam()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue