From ec4cfee9fe31477df9428c19fddfca13b139a590 Mon Sep 17 00:00:00 2001 From: Denis Chevalier Date: Sun, 9 Aug 2026 16:18:46 +0200 Subject: more shertz and continue error enumeration --- module-design.typ | 272 ++++++++++++++++++++++++++++++++++++++++++++++++------ preamble.typ | 2 + 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], ) @@ -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], ) @@ -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 + + +====== 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 + + +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 + + +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 + +- 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 + +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 + + +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 + +====== 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 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 + +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 + +- 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 + +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 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 == 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 +=== Interface modules + = Theory of operation = Applications -- cgit