diff options
Diffstat (limited to 'charts')
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> |
