diff options
| author | Denis Chevalier <perso@denischevalier.fr> | 2026-08-10 22:32:38 +0200 |
|---|---|---|
| committer | Denis Chevalier <perso@denischevalier.fr> | 2026-08-10 22:32:38 +0200 |
| commit | b28f97f3526859633fde603764b827389279d10f (patch) | |
| tree | ef483985fc0be4237f98b2ad7dd0682b160b4cef /module-design.typ | |
| parent | 32d3f3d945002c1413490449aa08522c78f4dcad (diff) | |
| download | same-b28f97f3526859633fde603764b827389279d10f.tar.gz same-b28f97f3526859633fde603764b827389279d10f.tar.bz2 same-b28f97f3526859633fde603764b827389279d10f.zip | |
extract figures in separate files
Diffstat (limited to 'module-design.typ')
| -rw-r--r-- | module-design.typ | 743 |
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 |
