aboutsummaryrefslogtreecommitdiff
path: root/module-design.typ
diff options
context:
space:
mode:
Diffstat (limited to 'module-design.typ')
-rw-r--r--module-design.typ743
1 files changed, 31 insertions, 712 deletions
diff --git a/module-design.typ b/module-design.typ
index e42f231..c776558 100644
--- a/module-design.typ
+++ b/module-design.typ
@@ -107,262 +107,47 @@ operators.
==== Fundamental constants <fundamental-constants>
-#figure(
- table(
- columns: 4,
- table.header([Symbol], [Definition], [Value], [Unit]),
- [$k_B$],
- [Boltzmann constant],
- [$num("1.381e-23")$],
- [$unit("joule per kelvin")$],
-
- [$T$], [Absolute temperature], [N/A], [$unit(K)$],
- [$e$], [Elementary charge], [$num("1.603e-19")$], [$unit(C)$],
- ),
- caption: [Fundamental constants],
-) <table-fundamental-constants>
+#include "tables/fundamental-constants.typ"
==== Electrical quantities <electrical-quantities>
-#figure(
- table(
- columns: 3,
- table.header([Symbol], [Definition], [Typical unit]),
- [$V$], [Voltage (general)], [$unit(V)$],
- [$I$], [Current (general)], [$unit(A)$],
- [$R$], [Resistance], [$unit("ohm")$],
- [$C$], [Capacitance], [$unit(F)$],
- [$L$], [Inductance], [$unit(H)$],
- [$P$], [Power], [$unit(W)$],
- [$f$], [Frequency], [$unit("Hz")$],
- [$omega$],
- [Angular frequency ($omega = 2 pi f$)],
- [$unit("radian per second")$],
-
- [$tau$],
- [Time constant ($tau = upright("RC") "or" upright("L/R")$)],
- [$unit(s)$],
-
- [$upright("BW")$], [Bandwidth], [$unit("Hz")$],
- ),
- caption: [Electrical quantities],
-) <table-electrical-quantities>
+#include "tables/electrical-quantities.typ"
==== Voltage and current subscript conventions
<voltage-and-current-subscript-conventions>
-#figure(
- table(
- columns: 3,
- table.header([Subscript], [Meaning], [Example]),
- [in], [Input], [$V_"in", I_"in"$],
- [out], [Output], [$V_"out", I_"out"$],
- [ref], [Reference], [$V_"ref"$],
- [pp], [Peak-to-peak], [$V_"pp"$],
- [rms], [Root-mean-square], [$V_"rms"$],
- [n, noise], [Noise], [$V_n, e_n, i_n$],
- [OS], [Offset], [$V_"OS"$],
- [leak], [Leakage], [$I_"leak"$],
- [supply], [Power supply], [$V_"supply"$],
- [$plus$, $minus$], [Positive / negative input or rail], [$V_plus, V_minus$],
-
- [CM], [Common-mode], [$V_"CM"$],
- [diff], [Differential], [$V_"diff"$],
- [CR], [Coefficient of resistance], [$V_"CR"$],
- [CC], [Coefficient of capacitance], [$V_"CC"$],
- ),
- caption: [Voltage and current subscript conventions],
-) <table-voltage-and-current-subscript-conventions>
+#include "tables/voltage-and-current-subscript-conventions.typ"
==== Circuit and component parameters <circuit-and-component-parameters>
-#figure(
- table(
- columns: 3,
- table.header([Symbol], [Definition], [Typical unit]),
- [$G$], [Gain (closed-loop)], [dimensionless or $unit("dB")$],
- [$A$], [Gain (open-loop)], [dimensionless or $unit("dB")$],
- [$A_"OL"$], [Open-loop gain (explicit)], [dimensionless],
- [$beta$], [Feedback factor], [dimensionless],
- [$A beta$], [Loop gain], [dimensionless],
- [$H$], [Transfer function], [dimensionless],
- [$R_f$], [Feedback resistor], [$unit("ohm")$],
- [$R_"in"$], [Input resistor], [$unit("ohm")$],
- [$Z_"in"$], [Input impedance], [$unit("ohm")$],
- [$Z_"out"$], [Output impedance], [$unit("ohm")$],
- [$upright("GBW")$], [Gain-bandwidth product], [$unit("Hz")$],
- [$upright("SR")$], [Slew rate], [$unit("volt per micro second")$],
- [$upright("CMRR")$], [Common-mode rejection ration], [$unit("dB")$],
- [$upright("PSRR")$], [Power supply rejection ratio], [$unit("dB")$],
- [$upright("TC")$], [Temperature coefficient], [$unit("ppm per celsius")$],
-
- [$V_"CR"$], [Voltage coefficient of resistance], [$unit("ppm per volt")$],
-
- [$V_"CC"$], [Voltage coefficient of capacitance], [$unit("ppm per volt")$],
-
- [$upright("DA")$], [Dielectric absorption], [$unit("percent")$],
- [$S$], [Seebeck coefficient], [$unit("micro volt per celsius")$],
- [$theta$], [Thermal resistance], [$unit("celsius per watt")$],
- ),
- caption: [Circuit and component parameters],
-) <table-circuit-and-component-parameters>
+#include "tables/circuit-and-component-parameters.typ"
==== Error and precision quantities <error-and-precision-quantities>
-#figure(
- table(
- 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_"total"$],
- [Total combined error],
- [$unit("ppm")$ or $unit("uV")$],
-
- [$epsilon_"systematic"$], [Systematic error component], [$unit("ppm")$],
- [$epsilon_"random"$], [Random error component], [$unit("uVrms")$],
-
- [$epsilon_"offset"$], [Offset error], [$unit("uV")$],
- [$epsilon_"gain"$], [Gain error], [$unit("ppm")$],
- [$epsilon_"ratio"$], [Ratio error for matched components], [$unit("ppm")$],
- [$epsilon_"thermal"$], [Thermally-induced error], [$unit("ppm")$],
- [$dv(epsilon, t)$], [Drift rate], [$unit("ppm per hour")$],
- [$S_y^p$], [Sensitivity of $y$ to parameter $p$], [dimensionless],
- [$upright("SNR")$], [Signal-to-noise ratio], [$unit("dB")$],
- [$upright("RTI")$], [Referred-to-input], [$unit("uV")$],
- [$upright("RTO")$], [Referred-to-output], [$unit("uV")$],
- [$upright("FS")$], [Full scale], [$unit("V")$],
- ),
- caption: [Error and precision quantities],
-) <table-error-and-precision-quantities>
+#include "tables/error-and-precision-quantities.typ"
==== Noise quantities <noise-quantities>
-#figure(
- table(
- columns: 3,
- table.header([Symbol], [Definition], [Typical unit]),
- [$e_n$], [Voltage noise spectral density], [$unit("nano volt per shertz")$],
-
- [$upright(i)_n$],
- [Current noise spectral density],
- [$unit("pico ampere per shertz")$ or $unit("femto ampere per shertz")$],
-
- [$e_(n,"white")$],
- [White noise component],
- [$unit("nano volt per shertz")$],
-
- [$e_(n,1/f)$],
- [$1/f$ noise component],
- [$unit("nano volt per shertz")$ at $qty(1, "Hz")$],
-
- [$f_c$], [Noise corner frequency ($1/f$ to white)], [$unit("Hz")$],
-
- [$V_n$], [Total noise voltage], [$unit("V") upright("RMS")$],
- [$upright("CNI")$], [Current noise index (potentiometers)], [$unit("dB")$],
- ),
- caption: [Noise quantities],
-) <table-noise-quantities>
+#include "tables/noise-quantities.typ"
==== Time domain and modulation quantities
<time-domain-and-modulation-quantities>
-#figure(
- table(
- columns: 3,
- table.header([Symbol], [Definition], [Typical unit]),
- [$D$], [Duty cycle], [$unit("percent")$ or dimensionless],
- [$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")$],
-
- [$t_"settle"$], [Settling time], [$unit("s")$],
- [$t_h$], [Timing jitter], [$unit("ps")$ or $unit("ns")$],
- ),
- caption: [Time domain and modulation quantities],
-) <table-time-domain-and-modulation-quantities>
+#include "tables/time-domain-and-modulation-quantities.typ"
==== Thermal quantities <thermal-quantites>
-#figure(
- table(
- columns: 3,
- table.header([Symbol], [Definition], [Typical unit]),
- [$T$], [Temperature (absolute)], [$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")$],
-
- [$theta_"conv"$],
- [Convective thermal resistance],
- [$unit("celsius per watt")$],
-
- [$theta_"cond"$],
- [Conductive thermal resistance],
- [$unit("celsius per watt")$],
-
- [$accent(Q, dot)$], [Heat flux], [$unit("W")$],
- [$accent(m, dot)$], [Mass flow rate], [$unit("kilo gram per second")$],
-
- [$c_p$], [Specific heat capacity], [$unit("J")/(unit("kg") dot unit("K"))$],
- ),
- caption: [Thermal quantities],
-) <table-thermal-quantities>
+#include "tables/thermal-quantities.typ"
==== Mathematical operators and functions <mathematical-operators-and-functions>
-#figure(
- table(
- columns: 2,
- table.header([Notation], [Meaning]),
- [$sum$], [Summation],
- [$product$], [Product],
- [$sqrt("")$], [Square root],
- [$dvp(y, x)$], [Partial derivative of $y$ with respect to $x$],
- [$dv(y, x)$], [Total derivative of $y$ with respect to $x$],
- [$integral$], [Integral],
- [$log_10$], [Common logarithm (base $10$)],
- [$ln$], [Natural logarithm (base $e$)],
- [$exp$], [Exponential function],
- [$abs(x)$], [Absolute value of $x$],
- [$x mod y$], [Modulo operation (remainder of $x$ divided by $y$)],
- [$in$], [Element of a set],
- [$upright("RSS")$], [Root-sum-square: $sqrt(x_1^2 + x_2^2 + ... + x_n^2)$],
- ),
- caption: [Mathematical operators and functions],
-) <table-mathematical-operators-and-functions>
+#include "tables/mathematical-operators-and-functions.typ"
==== Unit prefixes <unit-prefixes>
Standard SI prefixes are used throughout:
-#figure(
- table(
- columns: 3,
- table.header([Prefix], [Symbol], [Factor]),
- [tera], [$upright(T)$], [$10^12$],
- [giga], [$upright(G)$], [$10^9$],
- [mega], [$upright(M)$], [$10^6$],
- [kilo], [$upright(k)$], [$10^3$],
- [], [], [$10^0$],
- [milli], [$upright(m)$], [$10^(-3)$],
- [micro], [$upright(mu)$], [$10^(-6)$],
- [nano], [$upright(n)$], [$10^(-9)$],
- [pico], [$upright(p)$], [$10^(-12)$],
- [femto], [$f$], [$10^(-15)$],
- ),
- caption: [Unit prefixes],
-) <table-unit-prefixes>
+#include "tables/unit-prefixes.typ"
==== Special notation conventions <special-notation-conventions>
@@ -998,18 +783,7 @@ content.
The goal of this section is to demonstrate, with mathematical rigor, that the
SAME Metrologic tier specifications are achievable:
-#figure(
- table(
- columns: 2,
- table.header([Parameter], [Requirement]),
- [Precision], [$qty(10, "ppm")$ ($qty(0.001, "percent")$)],
- [Signal-to-noise ratio], [$qty(90, "dB")$],
- [Drift rate], [$lt.eq qty(0.014, "ppm per hour")$],
- [Bandwidth], [DC to $qty(20, "kHz")$],
- [Drift-free operation], [$qty(30, "day")$],
- ),
- caption: [Summary of metrologic precision tier requirements],
-) <table-error-budgeting-introduction>
+#include "tables/error-budgeting-introduction.typ"
We will proceed as follows:
+ Establish the relationship between these specifications,
@@ -1090,8 +864,7 @@ $tau = qty(25, "us")$: it represents one Nyquist interval
$T_"sample" = qty(25, "us")$).
#let epsilon_noise = (
- apply-prefix(632.455, "micro")
- / calc.sqrt(2 * 20000 * apply-prefix(25, "micro"))
+ apply-prefix(632.455, "micro") / calc.sqrt(2 * 20000 * apply-prefix(25, "micro"))
)
#assert-aeq(epsilon_noise, apply-prefix(632.455, "micro"))
$
@@ -1107,20 +880,7 @@ The $qty(10, "ppm")$ precision specification applies to _systematic_ errors
only. The $qty(90, "dB") upright("SNR")$ specification applies to _random_
errors. Both must be met, but they are separate budgets:
-#figure(
- table(
- columns: 3,
- table.header([Budget], [Allocation], [Expressed as]),
- [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],
- ),
- caption: [Error budgets allocation],
-) <table-snr-and-noise-floor-resolution>
+#include "tables/snr-and-noise-floor-resolution.typ"
The $qty(90, "dB") upright("SNR")$ allows $qty(632.455, "uVrms")$ random
noise, while the $qty(10, "ppm")$ precision requires $lt qty(200, "uV")$
@@ -1349,93 +1109,15 @@ servo loop.
====== Typical magnitude <opamp-voltage-noise-typical-magnitude>
-#figure(
- table(
- columns: 4,
- table.header([Op-amp class], [$e_(n,"white")$], [$f_c$], [Notes]),
- [General purpose (TL07x)],
- [$18 unit("nano volt per shertz")$],
- [$qty(200, "Hz")$],
- [JFET input],
-
- [Low noise (OPA211)],
- [$1.1 unit("nano volt per shertz")$],
- [$qty(10, "Hz")$],
- [Bipolar input],
-
- [Precision low noise (LT1028)],
- [$0.85 unit("nano volt per shertz")$],
- [$qty(3.5, "Hz")$],
- [Bipolar input],
-
- [Chopper stabilized (LTC2057)],
- [$7 unit("nano volt per shertz")$],
- [$lt qty(1, "Hz")$],
- [No $1/f$ corner],
- ),
- caption: [Op-amp voltage noise typical magnitudes],
-) <table-opamp-voltage-noise-typical-magnitude>
-
-#figure(
- cetz.canvas({
- import cetz.draw: *
-
- plot.plot(
- size: (12, 6),
- x-mode: "log",
- x-label: [Frequency $f$ ($unit("Hz")$)],
- y-label: [$e_n(f)$ ($unit("nano volt per shertz")$)],
- x-min: 0.1,
- x-max: 100000,
- y-min: 0.5,
- y-max: 50,
- x-grid: "minor",
- y-grid: "minor",
- {
- // General purpose (TL072): e_white = 18 nV/sqrt(Hz), fc = 200 Hz
- plot.add(
- style: (stroke: (dash: "solid")),
- label: [TL07x],
- domain: (0.1, 100000),
- samples: 8000,
- f => 18 * calc.sqrt(1 + 200 / f),
- )
- // Low noise (OPA211): e_white = 1.1 nV/sqrt(Hz), fc = 10 Hz
- plot.add(
- style: (stroke: (dash: "dashed")),
- label: [OPA211],
- domain: (0.1, 100000),
- samples: 8000,
- f => 1.1 * calc.sqrt(1 + 10 / f),
- )
- // Precision low noise (LT1028): e_white = 0.85 nV/sqrt(Hz), fc = 3.5 Hz
- plot.add(
- style: (stroke: (dash: "dotted")),
- label: [LT1028],
- domain: (0.1, 100000),
- samples: 8000,
- f => 0.85 * calc.sqrt(1 + 3.5 / f),
- )
- // Chopper stabilized (LTC2057): e_white = 7 nV/sqrt(Hz), fc = 1 Hz
- plot.add(
- style: (stroke: (dash: "dash-dotted")),
- label: [LTC2057],
- domain: (0.1, 100000),
- samples: 8000,
- f => 7 * calc.sqrt(1 + 1 / f),
- )
- },
- )
- }),
- caption: [Comparison of operational amplifier voltage noise spectral density curves across frequency],
-) <figure-opamp-voltage-noise-mathematical-model>
+#include "tables/opamp-voltage-noise-typical-magnitudes.typ"
+
+#include "charts/opamp-voltage-noise-typical-magnitudes.typ"
For a precision op-amp ($1 unit("nano volt per shertz"), f_c = qty(10, "Hz")$)
over $qty(0.001, "Hz")$ to $qty(20, "kHz")$:
#let v_n_rms = calc.sqrt(
- calc.pow(calc.pow(10, -9), 2) * 20000
- + (calc.pow(calc.pow(10, -9), 2) * 10 * calc.ln(20000 / 0.001)),
+ calc.pow(calc.pow(10, -9), 2) * 20000 + (calc.pow(calc.pow(10, -9), 2) * 10 * calc.ln(20000 / 0.001)),
)
#assert-aeq(v_n_rms, apply-prefix(0.43, "micro"))
$
@@ -1497,22 +1179,9 @@ $ V_(n,i,"rms") = i_n times Z_"source" times sqrt(upright("BW")) $
====== Typical magnitude <opamp-current-noise-typical-magnitude>
-#figure(
- table(
- columns: 3,
- table.header([Op-amp class], [$i_n$], [Notes]),
- [Bipolar (LT1028)],
- [$1 unit("pico ampere per shertz")$],
- [Low voltage noise, moderate current noise],
-
- [JFET (OPA627)], [$2.5 unit("femto ampere per shertz")$], [Negligible],
+#include "tables/opamp-current-noise-typical-magnitude.typ"
- [CMOS (LMC6001)], [$0.13 unit("femto ampere per shertz")$], [Negligible],
- ),
- caption: [Op-amp current noise typical magnitudes],
-) <table-opamp-current-noise-typical-magnitude>
-
-For a bipolar op-amp ($1 unit("pico ampere per shertz")$) with $qty(10, "kilo ohm")$
+For a bipolar op-amp ($qty(1, "pico ampere per shertz")$) with $qty(10, "kilo ohm")$
source impedance over $qty(20, "kHz")$:
#let v_n_i_rms = apply-prefix(1, "pico") * 10000 * calc.sqrt(20000)
@@ -1586,83 +1255,9 @@ $
====== Typical magnitude <power-supply-noise-coupling-typical-magnitude>
-#figure(
- table(
- columns: 3,
- 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")$],
- ),
- caption: [Power supply noise coupling typical magnitudes],
-) <table-power-supply-noise-coupling-typical-magnitude>
-
-#figure(
- cetz.canvas({
- import cetz.draw: *
-
- plot.plot(
- size: (12, 6),
- x-mode: "log",
- y-mode: "linear",
- x-label: [Frequency $f$ ($unit("Hz")$)],
- y-label: [$upright("PSRR")(f)$ ($unit("dB")$)],
- x-min: 1,
- x-max: 1000000,
- y-min: 0,
- y-max: 140,
- x-grid: "minor",
- y-grid: "minor",
- {
- // 500 kHz PWAM Carrier vertical reference line
- plot.add(
- ((500000, 0), (500000, 140)),
- style: (stroke: (paint: luma(120), thickness: 0.8pt, dash: "dashed")),
- label: none,
- )
- // General purpose (TL07x): PSRR_DC = 100 dB, fp1 = 1 kHz, fp2 = 100 kHz
- plot.add(
- style: (stroke: (dash: "solid")),
- label: [TL07x],
- domain: (1, 1000000),
- samples: 8000,
- f => (
- 100
- - 10 * calc.log(1 + calc.pow(f / 1000, 2), base: 10)
- - 10 * calc.log(1 + calc.pow(f / 100000, 2), base: 10)
- ),
- )
- // Low noise (OPA211): PSRR_DC = 130 dB, fp1 = 300 Hz, fp2 = 50 kHz
- plot.add(
- style: (stroke: (dash: "dotted")),
- label: [OPA211],
- domain: (1, 1000000),
- samples: 8000,
- f => (
- 130
- - 10 * calc.log(1 + calc.pow(f / 300, 2), base: 10)
- - 10 * calc.log(1 + calc.pow(f / 50000, 2), base: 10)
- ),
- )
- // Precision low noise (LT1028): PSRR_DC = 120 dB, fp1 = 300 Hz, fp2 = 100 kHz
- plot.add(
- style: (stroke: (dash: "dashed")),
- label: [LT1028],
- domain: (1, 1000000),
- samples: 8000,
- f => (
- 120
- - 10 * calc.log(1 + calc.pow(f / 300, 2), base: 10)
- - 10 * calc.log(1 + calc.pow(f / 100000, 2), base: 10)
- ),
- )
- },
- )
- }),
- caption: [Power supply rejection ratio ($upright("PSRR")$) degradation across frequency, highlighting the reduced rejection at the $qty(500, "kHz")$ PWAM carrier frequency],
-) <figure-power-supply-noise-coupling-mathematical-model>
+#include "tables/power-supply-noise-coupling-typical-magnitude.typ"
+
+#include "charts/power-supply-noise-coupling-typical-magnitude.typ"
For SAME analog supply cleanliness specification ($qty(500, "uVpp")$ ripple on
$plus.minus qty(15, "V")$ rails) with $qty(80, "dB") upright("PSRR")$ at
@@ -1914,124 +1509,9 @@ represents the dielectric material relaxation time constants.
===== Typical magnitude <capacitor-dielectric-absorption-noise-typical-magnitude>
-#figure(
- table(
- columns: 2,
- table.header([Dielectric class], [DA coefficient]),
- [Ceramic (X7R / Class 2)], [$qty(2.5, "percent")$],
- [Polyester (Mylar)], [$qty(0.2, "percent")$],
- [Polypropylene (PP)], [$qty(0.05, "percent")$],
- [Polystyrene (PS)], [$qty(0.02, "percent")$],
- [Teflon (PTFE)], [$qty(0.01, "percent")$],
- [Class 1 ceramic (C0G / NP0)], [$lt qty(0.01, "percent")$],
- ),
- caption: [Capacitor dielectric absorption coefficients],
-) <table-capacitor-dielectric-absorption-noise-typical-magnitude>
-
-#figure(
- cetz.canvas({
- import cetz.draw: *
-
- plot.plot(
- size: (12, 9),
- y-mode: "log",
- x-label: [Time $t$ ($unit("s")$)],
- y-label: [Residual Voltage $V_upright("DA")$ ($unit("mV")$)],
- x-min: 0.001,
- x-max: 9,
- y-min: 0.01,
- y-max: 500,
- x-grid: "minor",
- y-grid: "minor",
- {
- // 200 uV (0.2 mV) Metrologic systematic error budget limit
- plot.add(
- ((0.001, 0.2), (10, 0.2)),
- style: (
- stroke: (paint: luma(120), thickness: 0.8pt, dash: "dash-dotted"),
- ),
- label: [Budget limit ($qty(200, "uV")$)],
- )
- // Ceramic X7R (DA = 2.5%, 10 V step -> 250 mV initial soakage peak)
- plot.add(
- style: (stroke: (dash: "solid")),
- label: [Ceramic (X7R / Class 2)],
- domain: (0.001, 10),
- samples: 10000,
- t => (
- 250
- * (
- 0.5 * calc.exp(-t / 0.01)
- + 0.3 * calc.exp(-t / 0.1)
- + 0.2 * calc.exp(-t / 1.0)
- )
- ),
- )
- // Polypropylene PP (DA = 0.05%, 10 V step -> 5 mV initial soakage peak)
- plot.add(
- style: (stroke: (dash: "dotted")),
- label: [Polypropylene (PP)],
- domain: (0.001, 10),
- samples: 10000,
- t => (
- 5
- * (
- 0.5 * calc.exp(-t / 0.01)
- + 0.3 * calc.exp(-t / 0.1)
- + 0.2 * calc.exp(-t / 1.0)
- )
- ),
- )
- // Polystyrene PP (DA = 0.002, 10 V step -> 2 mV initial soakage peak)
- plot.add(
- style: (stroke: (dash: "dashed")),
- label: [Polystyrene (PS)],
- domain: (0.001, 10),
- samples: 10000,
- t => (
- 2
- * (
- 0.5 * calc.exp(-t / 0.01)
- + 0.3 * calc.exp(-t / 0.1)
- + 0.2 * calc.exp(-t / 1.0)
- )
- ),
- )
- // Teflon PTFE (DA = 0.001, 10 V step -> 1 mV initial soakage peak)
- plot.add(
- style: (stroke: (dash: "dash-dotted")),
- label: [Teflon (PTFE)],
- domain: (0.001, 10),
- samples: 10000,
- t => (
- 1
- * (
- 0.5 * calc.exp(-t / 0.01)
- + 0.3 * calc.exp(-t / 0.1)
- + 0.2 * calc.exp(-t / 1.0)
- )
- ),
- )
- // Class 1 C0G/NP0 Ceramic (DA = 0.005%, 10 V step -> 0.5 mV initial soakage peak)
- plot.add(
- style: (stroke: (dash: (6pt, 2pt, 2pt, 2pt))),
- label: [Class 1 (C0G/NP0)],
- domain: (0.001, 10),
- samples: 10000,
- t => (
- 0.5
- * (
- 0.5 * calc.exp(-t / 0.01)
- + 0.3 * calc.exp(-t / 0.1)
- + 0.2 * calc.exp(-t / 1.0)
- )
- ),
- )
- },
- )
- }),
- caption: [Capacitor dielectric absorption residual voltage relaxation ($V_upright("DA")$) over time following a $qty(10, "V")$ step voltage reset, comparing dielectric classes against the $qty(200, "uV")$ systematic error budget],
-) <figure-capacitor-dielectric-absorption-noise-typical-magnitude>
+#include "tables/capacitor-dielectric-absorption-noise-typical-magnitude.typ"
+
+#include "charts/capacitor-dielectric-absorption-noise-typical-magnitude.typ"
For a standard polypropylene capacitor ($qty(0.05, "percent") upright("DA")$)
step-charged at $qty(10, "V")$:
@@ -2211,7 +1691,7 @@ $Z_"source" = qty(1, "mega ohm")$ input node (white banana jack boundary):
#let v_error = i_leak * apply-prefix(1, "mega")
#assert-aeq(v_error, apply-prefix(10, "micro"))
$
- I_"leak" & = qty(10, "V") / qty(1, "tera ohm") = qty(10, "pA") \
+ I_"leak" & = qty(10, "V") / qty(1, "tera ohm") = qty(10, "pA") \
V_"error" & = qty(10, "pA") times qty(1, "mega ohm") = qty(10, "uV") (qty(0.5, "ppm"))
$
- On a contaminated PCB ($R_"leak" = qty(1, "giga ohm")$):
@@ -2220,7 +1700,7 @@ $
#let v_error = i_leak * apply-prefix(1, "mega")
#assert-aeq(v_error, apply-prefix(10, "milli"))
$
- I_"leak" & = qty(10, "V") / qty(1, "giga ohm") = qty(10, "nA") \
+ I_"leak" & = qty(10, "V") / qty(1, "giga ohm") = qty(10, "nA") \
V_"error" & = qty(10, "nA") times qty(1, "mega ohm") = qty(10, "mV") (qty(500, "ppm"))
$
@@ -2302,48 +1782,7 @@ materials.
====== Typical magnitude
<inductor-losses-and-parasitic-effects-typical-magnitude>
-#figure(
- table(
- columns: 5,
- table.header(
- [Inductor type],
- [$upright("DCR")$],
- [Core loss ($qty(10, "kHz")$)],
- [Self-resonance],
- [Notes],
- ),
- [Air core],
- [High ($qtyrange(1, 100, "ohm")$)],
- [None],
- [High ($gt qty(100, "MHz")$)],
- [No saturation, no core noise],
-
- [Ferrite bead],
- [$qtyrange(0.1, 1, "ohm")$],
- [Very high],
- [$qtyrange(10, 100, "MHz")$],
- [Designed for loss (filtering)],
-
- [Ferrite inductor],
- [$qtyrange(0.1, 10, "ohm")$],
- [Moderate],
- [$qtyrange(1, 50, "MHz")$],
- [General purpose],
-
- [Powdered iron],
- [$qtyrange(0.5, 5, "ohm")$],
- [Low],
- [$qtyrange(1, 10, "MHz")$],
- [DC bias tolerant],
-
- [Laminated steel],
- [$qtyrange(0.1, 1, "ohm")$],
- [Low at audio rate],
- [$qtyrange(0.01, 1, "MHz")$],
- [Audio transformers],
- ),
- caption: [Inductor losses and parasitic effects typical magnitudes],
-) <table-inductor-losses-and-parasitic-effects-typical-magnitude>
+#include "tables/inductor-losses-and-parasitic-effects-typical-magnitude.typ"
For a $qty(10, "mH")$ ferrite signal-path inductor with
$qty(5, "ohm") upright("DCR")$ carrying a $qty(1, "mA")$ signal current:
@@ -2432,48 +1871,7 @@ Where $n(t)$ is a normalized random noise process bounded by wiper travel veloci
====== Typical magnitude <potentiometer-wiper-noise-and-wear-typical-magnitude>
-#figure(
- table(
- columns: 5,
- table.header(
- [Potentiometer type],
- [Contact resistance],
- [$upright("CNI")$],
- [Wear life],
- [Notes],
- ),
- [Carbon composition],
- [$qtyrange(2, 50, "ohm")$],
- [$qtyrange(0, 10, "dB")$],
- [$10$k - $100$k cycles],
- [Noisy, wear-prone],
-
- [Cermet],
- [$qtyrange(1, 10, "ohm")$],
- [$qtyrange(-10, 0, "dB")$],
- [$100$k - $1$M cycles],
- [Good compromise],
-
- [Conductive plastic],
- [$qtyrange(0.5, 5, "ohm")$],
- [$qtyrange(-20, -10, "dB")$],
- [$1$M - $10$M cycles],
- [Low noise, good wear],
-
- [Wirewound],
- [$qtyrange(0.1, 2, "ohm")$],
- [Very low],
- [$1$M+ cycles],
- [Quantized, best for DC],
-
- [Multi-turn (10T)],
- [$qtyrange(0.5, 5, "ohm")$],
- [$qtyrange(-15, -5, "dB")$],
- [$100$k - $1$M cycles],
- [High resolution],
- ),
- caption: [Potentiometer wiper noise and wear typical magnitudes],
-) <table-potentiometer-wiper-noise-and-wear-typical-magnitude>
+#include "tables/potentiometer-wiper-noise-and-wear-typical-magnitude.typ"
For a $qty(10, "kilo ohm")$ conductive plastic potentiometer at mid-scale
($qty(5, "kilo ohm")$) carrying $qty(1, "mA")$ DC current:
@@ -2575,65 +1973,7 @@ between channels or adjacent circuits traces. Mechanisms include:
$ V_"coupled" approx j omega C_"mutual" Z_"victim" V_"aggressor" $
- #figure(
- cetz.canvas({
- import cetz.draw: *
-
- plot.plot(
- size: (12, 6),
- x-mode: "log",
- x-label: [Frequency $f$ ($unit("Hz")$)],
- y-label: [Coupled Voltage $V_"coupled"$ ($unit("mV")$)],
- x-min: 10,
- x-max: 100000,
- y-min: 0.001,
- y-max: 65,
- x-grid: "minor",
- y-grid: "minor",
- {
- // 20 kHz System Bandwidth limit vertical reference line
- plot.add(
- ((20000, 0.001), (20000, 100)),
- style: (
- stroke: (paint: luma(120), thickness: 0.8pt, dash: "dashed"),
- ),
- label: none,
- )
-
- // Unshielded PCB trace: C_mutual = 1 pF, Z_victim = 10 kOhm
- plot.add(
- style: (stroke: (dash: "solid")),
- label: [Unshielded trace \
- ($qty(1, "pF"), qty(10, "kilo ohm")$)],
- domain: (10, 100000),
- samples: 8000,
- f => 2 * calc.pi * f * 1e-12 * 10000 * 10 * 1000, // in mV
- )
-
- // Low-impedance node: C_mutual = 1 pF, Z_victim = 1 kOhm
- plot.add(
- style: (stroke: (dash: "dashed")),
- label: [Low-impedance node \
- ($qty(1, "pF"), qty(1, "kilo ohm")$)],
- domain: (10, 100000),
- samples: 8000,
- f => 2 * calc.pi * f * 1e-12 * 1000 * 10 * 1000, // in mV
- )
-
- // Guard trace shielding: C_mutual = 0.05 pF, Z_victim = 10 kOhm
- plot.add(
- style: (stroke: (dash: "dotted")),
- label: [Guard trace shielded \
- ($qty(0.05, "pF"), qty(10, "kilo ohm")$)],
- domain: (10, 100000),
- samples: 8000,
- f => 2 * calc.pi * f * 0.05e-12 * 10000 * 10 * 1000, // in mV
- )
- },
- )
- }),
- caption: [Capacitive crosstalk coupled voltage ($V_"coupled"$) vs. frequency across different PCB layout conditions, demonstrating the $qty(20, "decibel per decade")$ slope up to the $qty(20, "kHz")$ system bandwidth boundary],
- ) <figure-crosstalk-mathematical-model>
+ #include "charts/crosstalk-mathematical-model.typ"
/ Inductive crosstalk: Mutual inductance $M$ between parallel traces is modeled
as:
@@ -2659,28 +1999,7 @@ between channels or adjacent circuits traces. Mechanisms include:
====== Typical magnitude <crosstalk-typical-magnitude>
-#figure(
- table(
- columns: 3,
- table.header(
- [Coupling mechanism], [Typical magnitude], [Frequency dependence]
- ),
- [Capacitive (PCB)],
- [$qtyrange(0.1, 1, "percent")$ at $qty(20, "kHz")$],
- [Increases with frequency],
-
- [Inductive (PCB)],
- [$qtyrange(0.01, 0.1, "percent")$ at $qty(20, "kHz")$],
- [Increases with frequency],
-
- [Ground bounce], [$qtyrange(1, 10, "mV")$], [Depends on transient speed],
- [Supply coupling], [$qtyrange(0.1, 1, "mV")$], [Via PSRR],
- [Module-to-module],
- [$lt qty(-60, "dB")$],
- [Protected by steel cassettes shielding],
- ),
- caption: [Crosstalk typical magnitudes],
-) <table-crosstalk-typical-magnitude>
+#include "tables/crosstalk-typical-magnitude.typ"
For a unshielded $qty(1, "pF")$ mutual capacitive between channels driving a
$Z_"victim" = qty(10, "kilo ohm")$ victim impedance at $f = qty(20, "kHz")$ with