aboutsummaryrefslogtreecommitdiff
path: root/charts
diff options
context:
space:
mode:
Diffstat (limited to 'charts')
-rw-r--r--charts/capacitor-dielectric-absorption-noise-typical-magnitude.typ98
-rw-r--r--charts/crosstalk-mathematical-model.typ63
-rw-r--r--charts/opamp-voltage-noise-typical-magnitudes.typ57
-rw-r--r--charts/power-supply-noise-coupling-typical-magnitude.typ68
4 files changed, 286 insertions, 0 deletions
diff --git a/charts/capacitor-dielectric-absorption-noise-typical-magnitude.typ b/charts/capacitor-dielectric-absorption-noise-typical-magnitude.typ
new file mode 100644
index 0000000..d15bfb4
--- /dev/null
+++ b/charts/capacitor-dielectric-absorption-noise-typical-magnitude.typ
@@ -0,0 +1,98 @@
+#import "../lib/unify.typ": qty, unit
+#import "@preview/cetz:0.5.2"
+#import "@preview/cetz-plot:0.1.4": plot
+
+#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>
diff --git a/charts/crosstalk-mathematical-model.typ b/charts/crosstalk-mathematical-model.typ
new file mode 100644
index 0000000..7701ed9
--- /dev/null
+++ b/charts/crosstalk-mathematical-model.typ
@@ -0,0 +1,63 @@
+#import "../lib/unify.typ": qty, unit
+#import "@preview/cetz:0.5.2"
+#import "@preview/cetz-plot:0.1.4": plot
+
+#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>
diff --git a/charts/opamp-voltage-noise-typical-magnitudes.typ b/charts/opamp-voltage-noise-typical-magnitudes.typ
new file mode 100644
index 0000000..2e926dd
--- /dev/null
+++ b/charts/opamp-voltage-noise-typical-magnitudes.typ
@@ -0,0 +1,57 @@
+#import "../lib/unify.typ": qty, unit
+#import "@preview/cetz:0.5.2"
+#import "@preview/cetz-plot:0.1.4": plot
+
+#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>
diff --git a/charts/power-supply-noise-coupling-typical-magnitude.typ b/charts/power-supply-noise-coupling-typical-magnitude.typ
new file mode 100644
index 0000000..6a3a8d8
--- /dev/null
+++ b/charts/power-supply-noise-coupling-typical-magnitude.typ
@@ -0,0 +1,68 @@
+#import "../lib/unify.typ": qty, unit
+#import "@preview/cetz:0.5.2"
+#import "@preview/cetz-plot:0.1.4": plot
+
+#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>