aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Chevalier <perso@denischevalier.fr>2026-08-09 16:18:46 +0200
committerDenis Chevalier <perso@denischevalier.fr>2026-08-09 16:18:46 +0200
commitec4cfee9fe31477df9428c19fddfca13b139a590 (patch)
tree1a1d88b4b441f9154cba5692b60733dd8e3639e2
parent12826b8dc9bf0ba2ba8b0bb2cf642c91dd03e241 (diff)
downloadsame-ec4cfee9fe31477df9428c19fddfca13b139a590.tar.gz
same-ec4cfee9fe31477df9428c19fddfca13b139a590.tar.bz2
same-ec4cfee9fe31477df9428c19fddfca13b139a590.zip
more shertz and continue error enumeration
-rw-r--r--module-design.typ272
-rw-r--r--preamble.typ2
2 files changed, 248 insertions, 26 deletions
diff --git a/module-design.typ b/module-design.typ
index f30c9fc..bcef89d 100644
--- a/module-design.typ
+++ b/module-design.typ
@@ -107,7 +107,10 @@ operators.
table(
columns: 4,
table.header([Symbol], [Definition], [Value], [Unit]),
- [$k_B$], [Boltzmann constant], [$num("1.381e-23")$], [$unit("joule per kelvin", per: "/")$],
+ [$k_B$],
+ [Boltzmann constant],
+ [$num("1.381e-23")$],
+ [$unit("joule per kelvin", per: "/")$],
[$T$], [Absolute temperature], [N/A], [$unit(K)$],
[$e$], [Elementary charge], [$num("1.603e-19")$], [$unit(C)$],
@@ -128,9 +131,13 @@ operators.
[$L$], [Inductance], [$unit(H)$],
[$P$], [Power], [$unit(W)$],
[$f$], [Frequency], [$unit("Hz")$],
- [$omega$], [Angular frequency ($omega = 2 pi f$)], [$unit("radian per second", per: "/")$],
+ [$omega$],
+ [Angular frequency ($omega = 2 pi f$)],
+ [$unit("radian per second", per: "/")$],
- [$tau$], [Time constant ($tau = upright("RC") "or" upright("L/R")$)], [$unit(s)$],
+ [$tau$],
+ [Time constant ($tau = upright("RC") "or" upright("L/R")$)],
+ [$unit(s)$],
[$upright("BW")$], [Bandwidth], [$unit("Hz")$],
),
@@ -183,11 +190,17 @@ operators.
[$upright("SR")$], [Slew rate], [$unit("volt per micro second", per: "/")$],
[$upright("CMRR")$], [Common-mode rejection ration], [$unit("dB")$],
[$upright("PSRR")$], [Power supply rejection ratio], [$unit("dB")$],
- [$upright("TC")$], [Temperature coefficient], [$unit("ppm per celsius", per: "/")$],
+ [$upright("TC")$],
+ [Temperature coefficient],
+ [$unit("ppm per celsius", per: "/")$],
- [$V_"CR"$], [Voltage coefficient of resistance], [$unit("ppm per volt", per: "/")$],
+ [$V_"CR"$],
+ [Voltage coefficient of resistance],
+ [$unit("ppm per volt", per: "/")$],
- [$V_"CC"$], [Voltage coefficient of capacitance], [$unit("ppm per volt", per: "/")$],
+ [$V_"CC"$],
+ [Voltage coefficient of capacitance],
+ [$unit("ppm per volt", per: "/")$],
[$upright("DA")$], [Dielectric absorption], [$unit("percent")$],
[$S$], [Seebeck coefficient], [$unit("micro volt per celsius", per: "/")$],
@@ -203,9 +216,13 @@ operators.
columns: 3,
table.header([Symbol], [Definition], [Typical unit]),
[$epsilon$], [Error (general)], [$unit("ppm")$ or $unit("uV")$],
- [$epsilon_"max"$], [Maximum allowable error], [$unit("ppm")$ or $unit("uV")$],
+ [$epsilon_"max"$],
+ [Maximum allowable error],
+ [$unit("ppm")$ or $unit("uV")$],
- [$epsilon_"total"$], [Total combined error], [$unit("ppm")$ or $unit("uV")$],
+ [$epsilon_"total"$],
+ [Total combined error],
+ [$unit("ppm")$ or $unit("uV")$],
[$epsilon_"systematic"$], [Systematic error component], [$unit("ppm")$],
[$epsilon_"random"$], [Random error component], [$unit("uVrms")$],
@@ -230,15 +247,21 @@ operators.
table(
columns: 3,
table.header([Symbol], [Definition], [Typical unit]),
- [$e_n$], [Voltage noise spectral density], [$unit("nano volt per shertz", per: "/")$],
+ [$e_n$],
+ [Voltage noise spectral density],
+ [$unit("nano volt per shertz", per: "/")$],
[$upright(i)_n$],
[Current noise spectral density],
[$unit("pico ampere per shertz", per: "/")$ or $unit("femto ampere per shertz", per: "/")$],
- [$e_(n,"white")$], [White noise component], [$unit("nano volt per shertz", per: "/")$],
+ [$e_(n,"white")$],
+ [White noise component],
+ [$unit("nano volt per shertz", per: "/")$],
- [$e_(n,1/f)$], [$1/f$ noise component], [$unit("nano volt per shertz", per: "/")$ at $qty(1, "Hz")$],
+ [$e_(n,1/f)$],
+ [$1/f$ noise component],
+ [$unit("nano volt per shertz", per: "/")$ at $qty(1, "Hz")$],
[$f_c$], [Noise corner frequency ($1/f$ to white)], [$unit("Hz")$],
@@ -259,7 +282,9 @@ operators.
[$f_"carrier"$], [Carrier frequency], [$unit("Hz")$],
[$f_0$], [Resonant or center frequency], [$unit("Hz")$],
[$phi$], [Phase], [$unit("radian")$ or $unit("degree")$],
- [$Delta phi$], [Phase error or shift], [$unit("radian")$ or $unit("degree")$],
+ [$Delta phi$],
+ [Phase error or shift],
+ [$unit("radian")$ or $unit("degree")$],
[$t_"settle"$], [Settling time], [$unit("s")$],
[$t_h$], [Timing jitter], [$unit("ps")$ or $unit("ns")$],
@@ -274,16 +299,26 @@ operators.
columns: 3,
table.header([Symbol], [Definition], [Typical unit]),
[$T$], [Temperature (absolute)], [$unit("K")$],
- [$delta upright(T)$], [Temperature difference], [$unit("celsius")$ or $unit("K")$],
+ [$delta upright(T)$],
+ [Temperature difference],
+ [$unit("celsius")$ or $unit("K")$],
- [$(Delta T)/(upright(d) y)$], [Vertical temperature gradient], [$unit("celsius per centi meter", per: "/")$],
+ [$(Delta T)/(upright(d) y)$],
+ [Vertical temperature gradient],
+ [$unit("celsius per centi meter", per: "/")$],
- [$theta_"conv"$], [Convective thermal resistance], [$unit("celsius per watt", per: "/")$],
+ [$theta_"conv"$],
+ [Convective thermal resistance],
+ [$unit("celsius per watt", per: "/")$],
- [$theta_"cond"$], [Conductive thermal resistance], [$unit("celsius per watt", per: "/")$],
+ [$theta_"cond"$],
+ [Conductive thermal resistance],
+ [$unit("celsius per watt", per: "/")$],
[$accent(Q, dot)$], [Heat flux], [$unit("W")$],
- [$accent(m, dot)$], [Mass flow rate], [$unit("kilo gram per second", per: "/")$],
+ [$accent(m, dot)$],
+ [Mass flow rate],
+ [$unit("kilo gram per second", per: "/")$],
[$c_p$], [Specific heat capacity], [$unit("J")/(unit("kg") dot unit("K"))$],
),
@@ -1070,9 +1105,13 @@ errors. Both must be met, but they are separate budgets:
table(
columns: 3,
table.header([Budget], [Allocation], [Expressed as]),
- [Systematic error budget], [$qty(200, "uV")$ ($qty(10, "ppm")$)], [Offset, drift, gain error, nonlinearity],
+ [Systematic error budget],
+ [$qty(200, "uV")$ ($qty(10, "ppm")$)],
+ [Offset, drift, gain error, nonlinearity],
- [Random error budget], [$qty(632.455, "uVrms")$ ($qty(90, "dB")$)], [Thermal noise, $1/f$ noise, interference],
+ [Random error budget],
+ [$qty(632.455, "uVrms")$ ($qty(90, "dB")$)],
+ [Thermal noise, $1/f$ noise, interference],
),
caption: [Error budgets allocation],
) <table-snr-and-noise-floor-resolution>
@@ -1290,9 +1329,15 @@ servo loop.
table(
columns: 4,
table.header([Op-amp class], [$e_(n,"white")$], [$f_c$], [Notes]),
- [General purpose (TL07x)], [$18 unit("nano volt per shertz", per: "/")$], [$qty(200, "Hz")$], [JFET input],
-
- [Low noise (OPA211)], [$1.1 unit("nano volt per shertz", per: "/")$], [$qty(10, "Hz")$], [Bipolar input],
+ [General purpose (TL07x)],
+ [$18 unit("nano volt per shertz", per: "/")$],
+ [$qty(200, "Hz")$],
+ [JFET input],
+
+ [Low noise (OPA211)],
+ [$1.1 unit("nano volt per shertz", per: "/")$],
+ [$qty(10, "Hz")$],
+ [Bipolar input],
[Precision low noise (LT1028)],
[$0.85 unit("nano volt per shertz", per: "/")$],
@@ -1362,11 +1407,17 @@ $ V_(n,i,"rms") = i_n times Z_"source" times sqrt(upright("BW")) $
table(
columns: 3,
table.header([Op-amp class], [$i_n$], [Notes]),
- [Bipolar (LT1028)], [$1 unit("pico ampere per shertz", per: "/")$], [Low voltage noise, moderate current noise],
+ [Bipolar (LT1028)],
+ [$1 unit("pico ampere per shertz", per: "/")$],
+ [Low voltage noise, moderate current noise],
- [JFET (OPA627)], [$2.5 unit("femto ampere per shertz", per: "/")$], [Negligible],
+ [JFET (OPA627)],
+ [$2.5 unit("femto ampere per shertz", per: "/")$],
+ [Negligible],
- [CMOS (LMC6001)], [$0.13 unit("femto ampere per shertz", per: "/")$], [Negligible],
+ [CMOS (LMC6001)],
+ [$0.13 unit("femto ampere per shertz", per: "/")$],
+ [Negligible],
),
caption: [Op-amp current noise typical magnitudes],
) <table-opamp-current-noise-typical-magnitude>
@@ -1434,7 +1485,9 @@ $
#figure(
table(
columns: 3,
- table.header([Op-amp], [$upright("PSRR")$ (DC)], [$upright("PSRR")$ ($qty(10, "kHz")$)]),
+ table.header(
+ [Op-amp], [$upright("PSRR")$ (DC)], [$upright("PSRR")$ ($qty(10, "kHz")$)]
+ ),
[TL072], [$qty(100, "dB")$], [$qty(80, "dB")$],
[OPA211], [$qty(130, "dB")$], [$qty(90, "dB")$],
[LT1028], [$qty(120, "dB")$], [$qty(90, "dB")$],
@@ -1475,6 +1528,173 @@ $
- Select precision op-amps with flat $upright("PSRR")$ characteristics aross the
signal bandwidth.
+===== Radiated and conducted RF interference
+<radiated-and-conducted-rf-interference>
+
+====== Physical mechanism
+<radiated-and-conducted-rf-interference-physical-mechanism>
+
+External electromagnetic fields induce high-frequency RF currents in unshielded
+conductors (such as 4mm banana patch cables), which act as receiving antennas.
+When high-frequency RF energy reaches an op-amp's input terminals, non-linear
+semiconductor junctions (ESD diodes and input transistor B-E junctions)
+rectify the carrier wave. This process, known as RFI demodulation, generates an
+unwanted DC offset voltage that directly corrupts precision calculations.
+
+====== Mathematical model
+<radiated-and-conducted-rf-interference-mathematical-model>
+
+The peak Rf voltage induced in an unshielded conductor of length $l$ exposed to
+an electric field of strength $E$ is:
+
+$ V_("induced") approx E dot l dot eta $
+
+Where $eta$ is the antenna coupling efficiency ($0.01$ to $0.5$, dependin on
+frequency and geometry).
+
+The resulting demodulated DC offset error $V_(upright("DC"),"error")$ created by
+junction rectification efficiency $alpha$ ($0.01$ to $0.1$) is:
+
+$ V_(upright("DC"),"error") = alpha dot V_("induced") $
+
+====== Typical magnitude
+<radiated-and-conducted-rf-interference-typical-magnitude>
+
+For a $l = qty(1, "m")$ unshielded banana patch cable in an
+$E = qty(3, "volt per meter", per: "/")$ ambient RF field (per EN-6100-4-3
+specification limit) with coupling efficiency $eta = 0.1$:
+
+$ V_("induced") = 3 times 1 times 0.1 = qty(300, "mVpp") $
+
+Without input filtering, RFI demodulation with $alpha = 0.03$ produces a DC
+offset error of:
+
+$
+ V_(upright("DC"),"error") = 0.03 times qty(300, "mV") = qty(9, "mV") (qty(450, "ppm"))
+$
+
+This exceeds out total systematic error budget by a factor of $45$.
+
+However, enforcing the mandated $qty(40, "dB")$ RF attenuation above
+$qty(1, "MHz")$ at the input jack (a factor of $100$ voltage reduction)
+reduces induced RF to $qty(3, "mVpp")$, yeilding a demodulated DC offset of:
+
+$
+ V_(upright("DC"),"error","filtered") = 0.03 times qty(3, "mV") = qty(90, "uV") (qty(4.5, "ppm"))
+$
+
+This brings RFI-induced systematic error safely within the $qty(200, "uV")$
+budget.
+
+====== Where it enters <radiated-and-conducted-rf-interference-where-it-enters>
+
+- Unshielded front-panel 4mm banana patch cables,
+- Unshielded PCB traces acting as slot antennas,
+- Power distribution wiring and DB-25 backplane harness,
+- High-impedance op-amp input nodes lacking local bypass capacitors.
+
+
+====== Scaling law <radiated-and-conducted-rf-interference-scaling-law>
+
+Induced RF voltage scales linearly with electric field strength $E$ and cable
+length $l$. Attenuation from passive RC low-pass filters scales at
+$qty(-20, "decibel per decade", per: "/")$ per filter pole above the cutoff
+frequency.
+
+====== Compensation strategy
+<radiated-and-conducted-rf-interference-compensation-strategy>
+
+RFI demodulation cannot be corrected by active DC servos because the DC offset
+is mathematically indistinguishable from a valid signal. Mitigation requires
+strict passive attenuation before semiconductor entry:
+- Mandating passive first and second-order RC low-pass filtering
+ ($f_c approx qty(1, "MHz")$) directly at white input jacks to guarantee
+ $gt.eq qty(40, "dB")$ attenuation per @inputs-requirements,
+- Enclosing modules in $qty(1.2, "mm")$ DC01 steel cassettes with unpainted
+ perimeter contact seams to deliver $gt.eq qty(20, "dB")$ EMI shielding per
+ @cassette-grounding-requirements,
+- Routing perimeter Chassis Earth rings on Layer 4 of module PCBs per
+ @pcb-earth-ring,
+- Recommending short, silicone-wrapped patch cables to minimize effective
+ antenna length $l$ per @banana-format.
+
+===== Ground loop currents <ground-loop-currents>
+
+====== Physical mechanism <ground-loop-currents-physical-mechanism>
+
+Ground loop errors arise when return currents flow through finite ground plane
+resistances, or when external equipment ground potentials differ from SAME
+Analog Ground (AGND). In single-ended voltage distribution, any ground potential
+difference $Delta V_G$ between source and receiver appears directly in series
+with the signal path.
+
+====== Mathematical model <ground-loop-currents-mathematical-model>
+
+Ground loop errors operate under two distinct mechanisms:
+
+/ Intra-chassis return drops: Internal module return currents $I_("return")$
+ flowing through shared backplane AGND plane resistance $R_("AGND")$ produce a
+ systematic offset: $ V_("error","internal") = I_("return") dot R_("AGND") $
+/ Inter-chassis common-mode offset: External ground potential differences
+ $Delta V_G$ coupled via external cables are attenuated by the Common-Mode
+ Rejection Ratio (CMRR) of the Interface Module's input stage:
+ $
+ V_("error","external") = (Delta V_G) / upright("CMRR")_("linear") = Delta V_G dot 10^(- upright("CMRR")_(unit("dB")) / 20)
+ $
+
+====== Typical magnitude <ground-loop-currents-typical-magnitude>
+
+For intra-chassis module operation, $R_("AGND") lt.eq qty(0.5, "milli ohm")$
+(guaranteed by continuous Layer 2 copper planes and multi-pin DB-25 grounding
+per @pcb-ground-planes and @backplane-connector). A
+$I_("return") = qty(100, "mA")$ analog return current produces:
+
+$
+ V_("error","internal") = qty(100, "mA") times qty(0.5, "milli ohm") = qty(50, "uV") (qty(2.5, "ppm"))
+$
+
+For external equipment connections, laboratory safety ground potential
+differences $Delta V_G$ typically range from
+$qtyrange(1, 100, "mV", delimiter: "\"to\"")$. Without differential rejection, a
+$qty(10, "mV")$ ground offset introduces a catastrophic $qty(10, "mV")$
+($qty(500, "ppm")$) error.
+
+However, utilizing an Interface Module with mandated
+$upright("CMRR") gt.eq qty(120, "dB")$ per @module-category-interface-modules
+attenuates a $qty(10, "mV")$ external ground offset to:
+
+$
+ V_("error","external") = qty(10, "mV") / 10^(120/20) = qty(10, "mV") / 10^6 = qty(10, "nV") (qty(0.5, "ppb"))
+$
+
+====== Where it enters <ground-loop-currents-where-it-enters>
+
+- Shared backplane AGND distribution traces between high-current compute
+ modules,
+- Front-panel connections bridging SAME modules to external test equipment
+ (oscilloscopes, multimeters, external generators, etc.) via Interface
+ Modules.
+
+====== Scaling law <ground-loop-currents-scaling-law>
+
+Intra-chassis ground error scales linearly with module return current
+$I_("return")$ and AGND copper resistance $R_(upright("AGND"))$. Inter-chassis
+ground error scales inversely with Interface Module
+$upright("CMRR")_(unit("dB"))$ at $qty(20, "decibel per decade", per: "/")$.
+
+====== Compensation strategy <ground-loop-currents-compensation-strategy>
+
+Ground loop offset cannot be filtered by passive RC networks because $Delta V_G$
+includes DC components. Mitigation relies on structural topology:
+- Enforcing strict separation of AGND and DGND across backplane pins with zero
+ on-module bridging per @grounding-rules,
+- Mandating continuous $qty(1, "oz")$ copper AGND planes on Layer 2 of all
+ module PCBs to minimize $R_(upright("AGND"))$ per
+ @pcb-ground-planes-agnd-plane,
+- Mandating high-CMRR ($gt.eq qty(120, "dB")$) differential instrumentation
+ inputs or galvanic isolation on all external-facing interface modules per
+ @module-category-interface-modules.
+
== Error compensation strategies <error-compensation-strategies>
== Advanced compensation topologies <advanced-compensation-topologies>
diff --git a/preamble.typ b/preamble.typ
index 597317e..a0a4629 100644
--- a/preamble.typ
+++ b/preamble.typ
@@ -118,6 +118,8 @@ drawings) are licensed under CERN-OHL-S-2.0+.
== Chassis <reference-implementation-chassis>
+=== Interface modules <reference-implementation-interface-modules>
+
= Theory of operation <theory-of-operation>
= Applications <applications>