From 34351baa98ffbdaa85b77c444f740e0abad511ef Mon Sep 17 00:00:00 2001 From: Denis Chevalier Date: Sat, 8 Aug 2026 15:07:16 +0200 Subject: Improve global project (typos, enforce 80 columns whenever possible, diagrams) and finish 3.1 --- electrical-specifications.typ | 87 +- introduction.typ | 27 +- main.typ | 79 -- mechanical-specifications.typ | 622 +++++++++++++- pictures/cassette-external-dimensions.svg | 628 +++++++++++++++ pictures/db-25-backplane-connector.svg | 1053 ++++++++++++++++++++++++ pictures/db-25-connector-cutout.svg | 611 ++++++++++++++ pictures/front-panel-geometry.svg | 648 +++++++++++++++ pictures/grid.svg | 1177 +++++++++++++++++++++++++++ pictures/l-channel.svg | 980 ++++++++++++++++++++++ pictures/u-channel.svg | 401 +++++++++ pictures/ventilation.svg | 1255 +++++++++++++++++++++++++++++ preamble.typ | 111 +++ 13 files changed, 7539 insertions(+), 140 deletions(-) delete mode 100644 main.typ create mode 100644 pictures/cassette-external-dimensions.svg create mode 100644 pictures/db-25-backplane-connector.svg create mode 100644 pictures/db-25-connector-cutout.svg create mode 100644 pictures/front-panel-geometry.svg create mode 100644 pictures/grid.svg create mode 100644 pictures/l-channel.svg create mode 100644 pictures/u-channel.svg create mode 100644 pictures/ventilation.svg create mode 100644 preamble.typ diff --git a/electrical-specifications.typ b/electrical-specifications.typ index 6d73b5e..8384518 100644 --- a/electrical-specifications.typ +++ b/electrical-specifications.typ @@ -62,7 +62,7 @@ must include an out-of-domain handling strategy, and document it: #figure( table( columns: (auto, auto, auto), - table.header([*Strategy*], [*Description*], [*Example use cases*]), + table.header([Strategy], [Description], [Example use cases]), [Clamp], [Output held at boundary], [Logarithm], [Hold], [Freeze last valid output], [Integrator], [Fold], [Reflect at boundary], [Chaotic attractor], @@ -98,7 +98,7 @@ jacks, the parallel input impedance must be considered: #figure( table( columns: (auto, auto, auto), - table.header([*Inputs stacked*], [*Parallel $Z_"in"$*], [*Loading error*]), + table.header([Inputs stacked], [Parallel $Z_"in"$], [Loading error]), [1], [$qty(1, "mega ohm")$], [$qty(10, "ppm")$], [4], [$qty(250, "kilo ohm")$], [$qty(40, "ppm")$], [10], [$qty(100, "kilo ohm")$], [$qty(100, "ppm")$], @@ -109,7 +109,9 @@ jacks, the parallel input impedance must be considered: Module designers should document expected fan-out in module specifications. For typical patches ($lt.eq 10$ connections per output), loading error remains a -small fraction of the Industrial tier budget. +small fraction of the Industrial tier budget. For Metrologic patches with a +fan-out $gt 10$, the use of a dedicated buffer module should solve the loading +error issue. ===== Error gates @@ -126,7 +128,7 @@ internal errors must never be aggregated. #figure( table( columns: (auto, auto), - table.header([*Source*], [*Category*]), + table.header([Source], [Category]), [Clipping], [Internal], [PWAM Soft Saturation], [Internal], [Domain Violation], [Out-of-Domain], @@ -186,8 +188,8 @@ achievable with a standard HVAC. ===== Humidity Measurements are made within a relative humidity range of -$qtyrange(30, 70, "percent", delimiter: "\"to\"") "RH"$, with an hourly variation of -maximum $plus.minus qty(5, "percent") "RH"$. +$qtyrange(30, 70, "percent", delimiter: "\"to\"") "RH"$, with an hourly +variation of maximum $plus.minus qty(5, "percent") "RH"$. High humidity can cause parasitic leakage paths (nanoamps matter at high-Z nodes), dielectric changes affecting precision capacitors, and long-term @@ -294,7 +296,7 @@ are met. #figure( table( columns: (auto, auto, auto), - table.header([*Parameter*], [*Range*], [*Variation*]), + table.header([Parameter], [Range], [Variation]), [Temperature], [$plus qty(15, "dC") "to" plus qty(30, "dC")$], [$plus.minus qty(2, "celsius per hour")$], [Relative humidity], @@ -306,11 +308,17 @@ are met. [RF immunity], [$qty(3, "volt per meter"), qtyrange(80, 1000, "MHz")$], [N/A], [Magnetic field (DC)], [$lt qty(1, "ampere per meter")$], [N/A], + [Magnetic field (AC)], [$lt qty(0.3, "ampere per meter")$], [N/A], + [Vibration], [$lt qty(0.5, "g"), qtyrange(5, 500, "Hz")$], [N/A], + [Shock], [$lt qty(5, "g"), qty(11, "ms")$], [N/A], + [Air quality], [Indoor, filtered], [N/A], + [Lighting], [No direct sunlight], [N/A], + [Background radiation], [$lt qty(1, "micro sievert per hour")$], [N/A], ), caption: [Summary of the precision measurements conditions], @@ -321,10 +329,10 @@ Note that electrical supply requirements will be discussed in === Educational tier -This tier aims for a precision of $qty(0.1, "percent")$ ($qty(1000, "ppm")$), and a SNR of -$qty(70, "dB")$. This tier is intended for lowering the barrier of entry by -reducing the components costs and soldering difficulty. It is suitable for -teaching on circuit topologies and general analog computer patching. At this +This tier aims for a precision of $qty(0.1, "percent")$ ($qty(1000, "ppm")$), +and a SNR of $qty(70, "dB")$. This tier is intended for lowering the barrier of +entry by reducing the components costs and soldering difficulty. It is suitable +for teaching on circuit topologies and general analog computer patching. At this level of precision, results are valid within $plus.minus qty(10, "mV")$. The maximum drift rate should be inferior or equal to $qty(60, "ppm per hour")$. @@ -332,22 +340,24 @@ We recommend calibration verification before each session. === Industrial tier -This tier aims for a precision of $qty(0.01, "percent")$ ($qty(100, "ppm")$), and a SNR of -$qty(80, "dB")$. This tier is intended for research, serious experimentation, -and applications requiring repeatable results. It is suitable for control -systems modeling, audio-rate computation, and scientific data acquisition. At -this level of precision, results are valid within $plus.minus qty(1, "mV")$. +This tier aims for a precision of $qty(0.01, "percent")$ ($qty(100, "ppm")$), +and a SNR of $qty(80, "dB")$. This tier is intended for research, serious +experimentation, and applications requiring repeatable results. It is suitable +for control systems modeling, audio-rate computation, and scientific data +acquisition. At this level of precision, results are valid within +$plus.minus qty(1, "mV")$. The maximum drift rate should be inferior or equal to $qty(0.6, "ppm per hour")$. We recommend daily calibration verification. === Metrologic tier -This tier aims for a precision of $qty(0.001, "percent")$ ($qty(10, "ppm")$), and a SNR of -$qty(90, "dB")$. This tier is intended for precision measurement, long-duration -computation, and applications requiring traceable accuracy. It is suitable for -metrology, reference instrumentation, and extended continuous operation. At this -level of precision, results are valid within $plus.minus qty(0.1, "mV")$. +This tier aims for a precision of $qty(0.001, "percent")$ ($qty(10, "ppm")$), +and a SNR of $qty(90, "dB")$. This tier is intended for precision measurement, +long-duration computation, and applications requiring traceable accuracy. It is +suitable for metrology, reference instrumentation, and extended continuous +operation. At this level of precision, results are valid within +$plus.minus qty(0.1, "mV")$. The maximum drift rate should be inferior or equal to $qty(0.014, "ppm per hour")$. We recommend daily calibration verification. @@ -357,20 +367,21 @@ $qty(0.014, "ppm per hour")$. We recommend daily calibration verification. #figure( table( columns: (auto, auto, auto, auto), - table.header([*Parameter*], [*Educational*], [*Industrial*], [*Metrologic*]), - [*Precision*], + table.header([Parameter], [Educational], [Industrial], [Metrologic]), + [Precision], [$qty(0.1, "percent") (qty(1000, "ppm"))$], [$qty(0.01, "percent") (qty(100, "ppm"))$], [$qty(0.00, "percent")% (qty(10, "ppm"))$], - [*SNR*], [$qty(70, "dB")$], [$qty(80, "dB")$], [$qty(90, "dB")$], - [*Result validity*], [$plus.minus qty(0.1, "V")$], [$plus.minus qty(10, "mV")$], [$plus.minus qty(1, "mV")$], + [SNR], [$qty(70, "dB")$], [$qty(80, "dB")$], [$qty(90, "dB")$], + + [Result validity], [$plus.minus qty(0.1, "V")$], [$plus.minus qty(10, "mV")$], [$plus.minus qty(1, "mV")$], - [*Maximum drift rate*], [$qty(60, "ppm per hour")$], [$qty(0.6, "ppm per hour")$], [$qty(0.014, "ppm per hour")$], + [Maximum drift rate], [$qty(60, "ppm per hour")$], [$qty(0.6, "ppm per hour")$], [$qty(0.014, "ppm per hour")$], - [*Drift-free computation*], [$approx qty(16, "h")$], [$approx qty(7, "day")$], [$approx qty(30, "day")$], + [Drift-free computation], [$approx qty(16, "h")$], [$approx qty(7, "day")$], [$approx qty(30, "day")$], - [*Calibration verification*], [Before each session], [Daily], [Daily], + [Calibration verification], [Before each session], [Daily], [Daily], ), caption: [Precision tiers summary], ) @@ -378,13 +389,13 @@ $qty(0.014, "ppm per hour")$. We recommend daily calibration verification. ==== Drift rate derivation The drift rates are calculated such that total accumulated drift over the -drift-free computation period consumes approximately $qty(100, "percent")$ of the precision -budget. +drift-free computation period consumes approximately $qty(100, "percent")$ of +the precision budget. #figure( table( columns: (auto, auto, auto, auto), - table.header([*Tier*], [*Precision*], [*Drift rate*], [*Time to drift $qty(100, "percent")$ of budget*]), + table.header([Tier], [Precision], [Drift rate], [Time to drift $qty(100, "percent")$ of budget]), [*Educational*], [$qty(1000, "ppm")$], [$qty(60, "ppm per hour")$], [$approx qty(16, "h")$], [*Industrial*], [$qty(100, "ppm")$], [$qty(0.6, "ppm per hour")$], [$approx qty(7, "day")$], @@ -464,9 +475,10 @@ the system utilizes a global timebase. At the module connector, the $plus.minus qty(15.00, "V")$ rails shall maintain -an initial accuracy within $plus.minus qty(7.5, "mV")$ ($plus.minus qty(0.05, "percent")$) at -$qty(25, "dC")$. Line regulation shall be better than $plus.minus qty(1.5, "mV")$ -($qty(0.01, "percent")$) for a $plus.minus qty(10, "percent")$ input voltage variation. Load regulation shall +an initial accuracy within $plus.minus qty(7.5, "mV")$ +($plus.minus qty(0.05, "percent")$) at $qty(25, "dC")$. Line regulation shall be +better than $plus.minus qty(1.5, "mV")$ ($qty(0.01, "percent")$) for a +$plus.minus qty(10, "percent")$ input voltage variation. Load regulation shall be better than $plus.minus qty(3.0, "mV")$ ($qty(0.02, "percent")$) over the full load range ($qtyrange(10, 100, "percent", delimiter: "\"to\"")$). Output voltage ripple and noise shall not exceed $qty(500, "uVpp")$ over a @@ -562,10 +574,15 @@ power distribution board, a short DB-25 male to male cable is used to connect the cassette to the power distribution board. D-sub connectors are ubiquitous, sturdy and shielded. +#figure( + image("pictures/db-25-backplane-connector.svg"), + caption: [DB-25 backplane connector], +) + #figure( table( columns: (auto, auto, auto, auto), - table.header([*Pin*], [*Signal*], [*Pin*], [*Signal*]), + table.header([Pin], [Signal], [Pin], [Signal]), [1], [$plus qty(15.00, "V")$], [14], [AGND], [2], [$plus qty(15.00, "V")$], [15], [AGND], [3], [$qty(-15.00, "V")$], [16], [AGND], diff --git a/introduction.typ b/introduction.typ index 8631e46..6948ee9 100644 --- a/introduction.typ +++ b/introduction.typ @@ -1,15 +1,4 @@ -#import "@preview/unify:0.8.1": add-unit, qty - -// All units for the specification should be specified here -#add-unit("ppm", "ppm", "upright(\"ppm\")") -#add-unit("ppb", "ppb", "upright(\"ppb\")") -#add-unit("inch", "\"", "upright(\"\\\"\")", space: false) -#add-unit("digital voltage", "VD", "upright(\"VD\")") -#add-unit("volt peak-to-peak", "Vpp", "upright(V_\"pp\")") -#add-unit("milli volt peak-to-peak", "mVpp", "upright(\"mV\"_\"pp\")") -#add-unit("micro volt peak-to-peak", "uVpp", "upright(mu V_\"pp\")") -#add-unit("dBc", "dBc", "upright(\"dBc\")") // decibels relative to the carrier -#add-unit("rack unit", "U", "upright(U)", space: false) +#import "@preview/unify:0.8.1": qty = Introduction @@ -235,12 +224,14 @@ Metrologic aiming at $qty(10, "ppm")$. === Reader's guide We recommend a reader not familiar with the field to first read this -specification sequentially. Sections 2 and 3 will develop the core -specifications of the SAME ecosystem. Section 4 will specify the module design -principles that allows it to achieve its precision goals. Section 5 will explain -how to verify conformity of a SAME product with this specification. Section 6 -will present a reference implementation of the system. Finally, sections 7 and 8 -will show how and when to use a SAME Analog Computer. +specification sequentially. #ref() and +#ref() will develop the core specifications of the +SAME ecosystem. #ref() will specify the module design principles +that allows it to achieve its precision goals. #ref() +will explain how to verify conformity of a SAME product with this specification. +#ref() will present a reference implementation of the +system. Finally, #ref() and #ref() will show +how and when to use a SAME Analog Computer. == Document conventions diff --git a/main.typ b/main.typ deleted file mode 100644 index 41d166d..0000000 --- a/main.typ +++ /dev/null @@ -1,79 +0,0 @@ -#set document( - title: [SAME Analog Modular Ecosystem], - author: "Denis Chevalier", - description: [SAME Analog Modular Ecosystem Specification], - date: auto, -) - -#set page( - paper: "a4", - header: context { - if counter(page).get().first() > 1 { - grid( - columns: (1fr, 1fr), - align(left, text(8pt)[SAME Analog Modular Ecosystem]), - align(right, text(8pt)[CC BY-SA 4.0 - CERN-OHL-S-2.0+]), - ) - } - }, - - footer: context { - let pg = counter(page).get().first() - if pg > 1 { - v(4pt) - grid( - columns: (1fr, 1fr, 1fr), - align(left, text(8pt)[© 2026 Denis Chevalier]), - align(center, text(8pt)[Page #pg]), - align(right, text(8pt)[Draft]), - ) - } - }, -) - -#set heading(numbering: "1.") -#show heading.where(depth: 1): body => { - pagebreak(weak: true) - body -} - -#set par( - justify: true, -) - -// Title page -#title() - -- SPDX-FileCopyrightText: 2026 Denis Chevalier \ -- SPDX-License-Identifier: CC-BY-SA-4.0 -- SPDX-License-Identifier: CERN-OHL-S-2.0+ - -The text, figures, tables, and mathematical content of this specification are -licensed under CC BY-SA 4.0. If a later version of CC BY-SA is published, the -author grants permission to distribute this work under that later version as -well. - -Hardware designs contained herein (schematics, PCB layouts, mechanical -drawings) are licensed under CERN-OHL-S-2.0+. - -// Toc -#outline( - title: [Table of Contents], - indent: auto, -) - -#outline( - title: [List of Tables], - target: figure.where(kind: table), -) - -#outline( - title: [List of Listings], - target: figure.where(kind: raw), -) - -#include "introduction.typ" - -#include "electrical-specifications.typ" - -#include "mechanical-specifications.typ" diff --git a/mechanical-specifications.typ b/mechanical-specifications.typ index a96de33..40cc933 100644 --- a/mechanical-specifications.typ +++ b/mechanical-specifications.typ @@ -1,4 +1,4 @@ -#import "@preview/unify:0.8.1": qty, qtyrange +#import "@preview/unify:0.8.1": numrange, qty, qtyrange = Mechanical specifications @@ -25,7 +25,7 @@ especially in terms of magnetic shielding. #figure( table( columns: (auto, auto), - table.header([*Parameter*], [*Value*]), + table.header([Parameter], [Value]), [Material], [DC01 cold-rolled steel (EN 10130)], [Thickness], [$qty(1.2, "mm")$], [Finish], [Matte black powder coard (RAL 9005), all surfaces.], @@ -35,10 +35,15 @@ especially in terms of magnetic shielding. ==== External dimensions +#figure( + image("pictures/cassette-external-dimensions.svg"), + caption: "Cassette external dimensions", +) + #figure( table( columns: (auto, auto, auto, auto), - table.header([*Dimension*], [*Value*], [*Tolerance*], [*Note*]), + table.header([Dimension], [Value], [Tolerance], [Note]), [Panel height], [$qty(177.8, "mm")$ ($qty(4, "U"), qty(7, "inch")$)], [$plus.minus qty(0.1, "mm")$], @@ -47,7 +52,8 @@ especially in terms of magnetic shielding. [Grid pitch], [$qty(38.1, "mm")$ ($qty(1.5, "inch")$)], [N/A], - [Theoretical center to center spacing. Two columns of banana jacks ($qty(0.75, "inch")$ grid).], + [Theoretical center to center spacing. Two columns of banana jacks + ($qty(0.75, "inch")$ grid).], [Panel Width], [$qty(38.0, "mm")$ ($qty(1.5, "inch")$)], @@ -75,6 +81,11 @@ interlocking U-shaped steel channel: ===== L-channel (chassis) +#figure( + image("pictures/l-channel.svg"), + caption: [L-channel (chassis) construction], +) + / Role: Structural spine. Holds the PCB and Front Panel. / Geometry: / Left wall ($qty(165.1, "mm") times qty(152.4, "mm")$): PCB mounts here. @@ -102,6 +113,11 @@ interlocking U-shaped steel channel: ===== U-channel (cover) +#figure( + image("pictures/u-channel.svg"), + caption: [U-channel (cover) construction], +) + / Role: EMI Shielding and Protection. / Geometry: / Top ($qty(35.7, "mm") times qty(152.4, "mm")$): vented @@ -113,6 +129,11 @@ interlocking U-shaped steel channel: ===== Front panel +#figure( + image("pictures/front-panel-geometry.svg"), + caption: [Front channel construction], +) + / Geometry: $qty(177.8, "mm") times qty(38.0, "mm")$, body section $qty(165.1, "mm")$ / Holes: Features Countersunk Through-Holes corresponding to the L-Channel's @@ -156,7 +177,7 @@ will fail, degrading the SNR below the $qty(90, "dB")$ target. #figure( table( columns: (auto, auto), - table.header([*Dimension*], [*Value*]), + table.header([Dimension], [Value]), [Height], [$qty(162.7, "mm")$], [Width], [$qty(35.6, "mm")$], [Depth], [$qty(150, "mm")$], @@ -169,10 +190,15 @@ will fail, degrading the SNR below the $qty(90, "dB")$ target. Top and bottom faces include ventilation slots for convective cooling while maintaining EMI shielding. +#figure( + image("pictures/ventilation.svg"), + caption: [Cassette ventilation], +) + #figure( table( columns: (auto, auto), - table.header([*Parameter*], [*Value*]), + table.header([Parameter], [Value]), [Slot size], [$qty(2.5, "mm") times qty(10, "mm")$], [Slot orientation], [Length parallel to cassette depth], [Rows], [$5$], @@ -186,21 +212,33 @@ maintaining EMI shielding. caption: [Cassette ventilation specifications], ) -==== DB-25 connector cutout +==== DB-25 connector cutout + +#figure( + image("pictures/db-25-connector-cutout.svg"), + caption: [DB-25 connector cutout], +) #figure( table( columns: (auto, auto), - table.header([*Parameter*], [*Value*]), + table.header([Parameter], [Value]), [Shape], [D-shaped (standard DB-25 profile)], + [D-opening width], [$qty(33.3, "mm")$], + [D-opening height], [$qty(12.5, "mm")$], + [Mounting hole spacing], [$qty(24.99, "mm")$], + [Mounting hole size], [$diameter qty(3.2, "mm")$], + [Center X], [$qty(17.85, "mm")$ from either edge], + [Center Y], [$qty(82.5, "mm")$ from top/bottom (centered on $qty(165.1, "mm")$)], [Connector assembly], [Panel mount with solder cups], + [Position], [Centered on rear closure], ), caption: [Cassette DB-25 connector cutout specifications], @@ -280,3 +318,571 @@ PCB must be electrically isolated from the steel cassette. $25$) creates the bond between the cable shield and the cassette body. / Verification: Resistance between the DB-25 Shell and any point on the cassette powder-coat-free zones must be $lt qty(0.1, "ohm")$. + +=== PCB + +==== Overview + +Module PCBs mount vertically within the L-channel, attached to the left side +wall via standoffs. The PCB connects to the front panel (banana jacks, controls) +via wire harnesses and to the power distribution board via the rear DB-25 +connector. + +==== Standard dimensions + +#figure( + table( + columns: (auto, auto, auto, auto), + table.header([Parameter], [Value], [Tolerances], [Notes]), + [Height], [$qty(155.0, "mm")$], [$plus.minus qty(0.2, "mm")$], [Vertical dimension when mounted], + + [Depth], [$qty(125.0, "mm")$], [$plus.minus qty(0.2, "mm")$], [Front-to-rear dimension], + + [Thickness], [$qty(1.6, "mm")$], [$plus.minus qty(0.15, "mm")$], [Standard 4-layer stackup], + + [Corner radius], [$qty(3.0, "mm")$], [$plus.minus qty(0.5, "mm")$], [All four corners, for insertion clearance], + ), + caption: [PCB standard dimensions], +) + +==== Board stackup + +All SAME module PCBs shall use a 4-layer stackup: This allows proper ground +management, while remaining easy to solder with standard equipment. + +#figure( + table( + columns: (auto, auto, auto, auto), + table.header([Layer], [Function], [Copper weight], [Notes]), + [L1 (top)], + [Signal + components], + [$qty(1, "oz")$ ($qty(35, "um")$)], + [Component side faces right (toward U-channel)], + + [L2 (inner 1)], + [Ground plane], + [$qty(1, "oz")$ ($qty(35, "um")$)], + [Continuous AGND plane, split for DGND if needed], + + [L3 (inner 2)], + [Power plane], + [$qty(1, "oz")$ ($qty(35, "um")$)], + [Split for $plus.minus qty(15, "V")$, $plus.minus qty(5, "V")$ rails], + + [L4 (bottom)], + [Signal + earth ring], + [$qty(1, "oz")$ ($qty(35, "um")$)], + [Faces left wall (mounting side), digital traces if needed], + ), + caption: [PCB board stackup], +) + +/ Dielectric: FR-4, $"Tg" gt.eq qty(135, "dC")$ + +==== Surface finish + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Specification]), + [Finish], [ENIG (Electroless Nickel Immersion Gold)], + + [Nickel thickness], [$qtyrange(3, 5, "um")$], + + [Gold thickness], [$qtyrange(0.05, 0.1, "um")$ ($qtyrange(1, 2, "micro inch")$)], + + [Solder mask], [Matte black (both sides)], + + [Silkscreen], [White (both sides)], + ), + caption: [PCB surface finish], +) + +===== Rationale + +ENIG provides excellent corrosion resistance for the 50-year service life +target. A flat surface ensures reliable soldering of precision components. Gold +does not oxidize, maintaining consistent contact resistance at test points. + +Black solder mask reduces light reflectivity (some precision semiconductors are +photosensitive). + +==== Earth ring + +The PCB shall include a Chassis Earth ring around the perimeter of the bottom +layer (L4). This ring provides a defined path for any capacitively-coupled noise +to drain to chassis earth rather than coupling into signal traces. + +===== Geometry + +#figure( + table( + columns: (auto, auto, auto), + table.header([Parameter], [Value], [Notes]), + [Width], [$qty(3.0, "mm")$], [Continuous copper pour], + [Clearance from edge], [$qty(0.5, "mm")$], [Manufacturing tolerance], + [Clearance to inner circuitry], [$qty(2.0, "mm")$], [Isolation gap], + [Layer], [L4 (bottom) only], [Faces mounting wall], + ), + caption: [PCB earth ring geometry], +) + +===== Connection + +The earth ring shall not connect to AGND or DGND on the PCB. It connects to +Chassis Earth exclusively through the pin 25 of the DB-25 power distributor via +a trace on L4. + +===== Mounting holes details + +The four mounting holes shall be: + +- Unplated, isolated through-holes, $diameter qty(3.2, "mm")$ (M3 clearance). +- Not connected to any layer (no vias to L1, L2, L3, L4). + +==== Ground planes + +===== AGND plane + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Value]), + [Layer], [L2 (inner 1)], + [Coverage], [Minimum $qty(85, "percent")$ of signal area], + [Splits], [Only if DGND zone required], + [Connection], [Via stitching to AGND traces & pads on L1 and L4], + ), + caption: [PCB AGND plane], +) + +The AGND plane provides: +- Low-impedance return path for analog signals, +- Shielding between signal layers, +- Thermal spreading. + +===== DGND zone (if needed) + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Value]), + [Location], [Defined zone on L2], + [Separation], [$qty(2, "mm")$ gap from AGND plane], + [Connection], [To the DGND pins of the power distributor], + [Via stitching], [Only within DGND zone], + ), + caption: [PCB DGND zone], +) + +==== Power planes + +Layer 3 is divided into power distribution zones: + +#figure( + table( + columns: (auto, auto, auto), + table.header([Zone], [Rail], [Typical area]), + [Zone 1], [$plus qty(15, "V")$], [$qtyrange(30, 40, "percent")$], + [Zone 2], [$qty(-15, "V")$], [$qtyrange(30, 40, "percent")$], + [Zone 3], [$plus qty(5, "V")$ (if needed)], [$qtyrange(10, 15, "percent")$], + [Zone 4], [$qty(-5, "V")$ (if needed)], [$qtyrange(10, 15, "percent")$], + ), + caption: [PCB power planes], +) + +Design rules: +- Miminum $qty(2, "mm")$ clearance between power zones, +- Star distribution from power enty point, +- Bulk decoupling capacitors from power enty point, +- Local decoupling at each IC. + +==== Mounting strategy + +The PCB mounts to the L-channel left wall via four standoffs. + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Value]), + [Standoff thread], [$M 3$], + [Standoff height], [$qty(6, "mm")$], + [Standoff type], [Female threaded, swaged or welded to L-channel], + [Mounting screw], [$M 3 times qty(8, "mm")$ pan head], + ), + caption: [PCB mounting strategy: standoffs], +) + +===== Mounting holes pattern + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Value]), + [Pattern], [Rectangular, $4$ holes], + [Horizontal spacing (X)], [$qty(105.0, "mm")$], + [Vertical spacing (Y)], [$qty(155.0, "mm")$], + [Hole diameter], [$diameter qty(3.2, "mm")$ ($M 3$ clearance)], + [Hole plating], [Unplated, isolated], + ), + caption: [PCB mounting strategy: mounting holes], +) + +====== Positions + +#figure( + table( + columns: (auto, auto, auto), + table.header([Hole], [X], [Y]), + [1 (bottom-left)], [$qty(10.00, "mm")$], [$qty(10.00, "mm")$], + [2 (bottom-right)], [$qty(115.00, "mm")$], [$qty(10.00, "mm")$], + [3 (top-left)], [$qty(10.00, "mm")$], [$qty(145.00, "mm")$], + [4 (top-right)], [$qty(115.00, "mm")$], [$qty(145.00, "mm")$], + ), + caption: [PCB mounting strategy: mounting holes positions], +) + +==== Keep-out zones + +===== Perimeter keep-out + +#figure( + table( + columns: (auto, auto, auto), + table.header([Parameter], [Value], [Notes]), + [Width], [$qty(5.0, "mm")$], [All four edges], + [Applies to], [Components and tall traces], [Solder mask and silkscreen allowed], + + [Reason], [Clearance for cassette walls and earth ring], [], + ), + caption: [PCB keep-out zones: perimeter keep-out], +) + +===== Mounting holes keep-out + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Value]), + [Radius], [$qty(0.5, "mm")$ from hole center], + [Applies to], [Components, traces, planes (except earth ring)], + ), + caption: [PCB keep-out zones: mounting holes keep-out], +) + +==== Interconnect zones + +===== Zone A: power and master oscillator entry (rear) + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Value]), + [Location], [Rear $qty(20, "mm")$ of PCB ($Y = qtyrange(0, 20, "mm", delimiter: "\"to\"")$)], + + [Function], [Connection to DB-25 backplane connector and rear BNC], + [Connector], + [ + / Power: pluggable terminal block (e.g. Phoenix Contact MSTB $qty(3.5, "mm")$ or latching header (e.g Molex KK $qty(3.96, "mm")$). + / Master oscillator (optional): The rear BNC connects to the PCB via a short ($lt qty(50, "mm")$) $qty(50, "ohm")$ coaxial pigtail (RG-174 or RG-316) soldered to dedicated RF pads or a u.FL/SMA connector on the PCB edge. + ], + + [Wire gauge], [$qtyrange(22, 24, "AWG")$ for power, $qty(26, "AWG")$ for signals], + ), + caption: [PCB interconnect zones: zone A], +) + +====== Pin assignment + +The PCB connector shall provide access to all power rails in a logical grouping: + +#figure( + table( + columns: (auto, auto, auto), + table.header([Position], [Signal], [Recommended wire color]), + [1], [$plus qty(15, "V")$], [Red], + [2], [$qty(-15, "V")$], [Orange], + [3], [AGND], [Black], + [4], [$plus qty(10, "V")$ force], [White], + [5], [$plus qty(10, "V")$ sense], [White / red stripe], + [6], [$qty(-10, "V")$ force], [Grey], + [7], [$qty(-10, "V")$ sense], [Gred / red stripe], + [8], [$plus qty(5, "VD")$], [Yellow], + [9], [$qty(-5, "VD")$], [Blue], + [10], [DGND], [Brown], + [11], [Stagger], [Purple], + [12], [Chassis Earth], [Green / yellow stripe], + ), + caption: [PCB interconnect zones: zone A pin assignment], +) + +Not all modules require all signals. Unused positions may be omitted from the +harness. + +===== Zone B: front panel I/O + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Value]), + [Location], [Front $qty(20, "mm")$ of PCB ($Y = qtyrange(135, 155, "mm", delimiter: "\"to\"")$)], + + [Function], [Connection to banana jacks and controls], + [Connector], [Pin headers, terminal blocks, or direct solder pads], + [Wire gauge], [$qtyrange(24, 25, "AWG")$], + ), + caption: [PCB interconnect zones: zone B], +) + +Design guidelines: +- Group outputs on one side, inputs on the other, +- Maintain signal flow from right to left (input #sym.arrow.r processing + #sym.arrow.r output), +- Include test points for each signal node. + +===== Service loop requirements + +All internal wiring shall include a service loop of minimum $qty(20, "mm")$ +additional length. This allows the PCB to be: +- Unscrewed from standoffs, +- Tilted or lifted for inspection, +- Accessed for rework. + +Without disconnecting the wire harnesses. + +==== Silkscreen requirements + +===== Component side (L1 - top) + +#figure( + table( + columns: (auto, auto), + table.header([Element], [Requirement]), + [Reference designators], [All components labeled($R_"bias"$, $C_"bulk"$, $U_"buf"$, etc.)], + + [Polarity marks], [All polarized components (diodes, electrolytics, ICs, etc.)], + + [Pin 1 indicators], [All ICs and connectors], + [Assembly notes], [Tier-specific component values (if applicable)], + [Test points], [Labeled with signal name], + ), + caption: [PCB silkscreen requirements: component side (L1 - top)], +) + +Labels should be functional if possible, defaults to $R_1$, $C_1$, $U_1$, etc. +if there are space constraints. + +===== Solder side (L4 - bottom) + +#figure( + table( + columns: (auto, auto), + table.header([Element], [Requirement]), + [Board identification], [Module name, version, date], + [SAME logo], [Mandatory], + [Precision tier], ["$"EDU"$", "$"IND"$", or "$"MET"$" marking area], + [Designer attribution], [Name, handle or logo], + [License], ["$"CERN-OHL-S-2.0+"$"], + ), + caption: [PCB silkscreen requirements: solder side (L4 - bottom)], +) + +==== Electrical testing + +All PCBs shall pass the following tests before assembly: + +#figure( + table( + columns: (auto, auto), + table.header([Test], [Requirement]), + [Isolation], [$gt qty(100, "mega ohm")$ between unconnected nets], + [Continuity], [All nets per netlist], + [Earth ring isolation], [$gt qty(100, "mega ohm")$ between earth ring and AGND/DGND], + + [Earth ring continuity], + [$lt qty(1, "ohm")$ along entire earth ring perimeter (measure between opposite corners of the ring trace)], + ), + caption: [PCB electrical testing requirements], +) + +=== Panels + +==== Geometry + +The front panel is a separate piece that attaches to the L-channel via countersunk screws. + +#figure( + table( + columns: (auto, auto, auto), + table.header([Parameter], [Value], [Tolerance]), + [Height], [$qty(177.8, "mm")$ ($qty(4, "U"), qty(7, "inch")$)], [$plus.minus qty(0.1, "mm")$], + + [Width], [$qty(38, "mm")$], [$plus 0.0 "/" qty(-0.1, "mm")$], + [Thickness], [$qty(1.2, "mm")$], [$plus.minus qty(0.1, "mm")$], + [Material], [DC01 cold-rolled steel], [N/A], + [Finish], [Matte black powder coat (RAL 9005)], [N/A], + ), + caption: [Panels geometry], +) + +===== Panels zones + +#figure( + table( + columns: (auto, auto, auto), + table.header([Zone], [Height range], [Function]), + [Top lip], [$qtyrange(0, 6.35, "mm")$], [Extends above cassette body], + [Body], [$qtyrange(6.35, 171.45, "mm")$], [Jack and control area], + [Bottom lip], [$qtyrange(171.45, 177.8, "mm")$], [Extends below cassette body], + ), + caption: [Panels zones], +) + +==== Grid + +All panel-mounted components follow a $qty(0.75, "inch")$ ($qty(19.05, "mm")$) +grid for compatibility with standard banana jack spacing and shorting bars. + +#figure( + image("pictures/grid.svg"), + caption: [Grid], +) + +===== Origin + +#figure( + table( + columns: (auto, auto), + table.header([Parameter], [Value]), + [Origin X], [$qty(9.525, "mm")$ from left edge (first column center)], + [Origin Y], [$qty(22.225, "mm")$ from top edge (first row center)], + [Column pitch], [$qty(19.95, "mm")$ ($qty(0.75, "inch")$)], + [Row pitch], [$qty(19.95, "mm")$ ($qty(0.75, "inch")$)], + [Columns], [$2$], + [Rows], [$8$], + ), + caption: [Panels grid orign], +) + +===== Positions + +#figure( + table( + columns: (auto, auto, auto, auto, auto), + table.header([Position], [Column], [Row], [X (from left)], [Y (from top)]), + [A1], [$1$], [$1$], [$qty(9.525, "mm")$], [$qty(22.225, "mm")$], + [B1], [$2$], [$1$], [$qty(28.575, "mm")$], [$qty(22.225, "mm")$], + [A2], [$1$], [$2$], [$qty(9.525, "mm")$], [$qty(41.275, "mm")$], + [B2], [$2$], [$2$], [$qty(28.575, "mm")$], [$qty(41.275, "mm")$], + [A3], [$1$], [$3$], [$qty(9.525, "mm")$], [$qty(60.325, "mm")$], + [B3], [$2$], [$3$], [$qty(28.575, "mm")$], [$qty(60.325, "mm")$], + [A4], [$1$], [$4$], [$qty(9.525, "mm")$], [$qty(79.375, "mm")$], + [B4], [$2$], [$4$], [$qty(28.575, "mm")$], [$qty(79.375, "mm")$], + [A5], [$1$], [$5$], [$qty(9.525, "mm")$], [$qty(98.425, "mm")$], + [B5], [$2$], [$5$], [$qty(28.575, "mm")$], [$qty(98.425, "mm")$], + [A6], [$1$], [$6$], [$qty(9.525, "mm")$], [$qty(117.475, "mm")$], + [B6], [$2$], [$6$], [$qty(28.575, "mm")$], [$qty(117.475, "mm")$], + [A7], [$1$], [$7$], [$qty(9.525, "mm")$], [$qty(136.525, "mm")$], + [B7], [$2$], [$7$], [$qty(28.575, "mm")$], [$qty(136.525, "mm")$], + [A8], [$1$], [$8$], [$qty(9.525, "mm")$], [$qty(155.575, "mm")$], + [B8], [$2$], [$8$], [$qty(28.575, "mm")$], [$qty(155.575, "mm")$], + ), + caption: [Panels grid positions], +) + +===== Component placement rules + +#figure( + table( + columns: (auto, auto, auto), + table.header([Component], [Grid positions], [Hole size]), + [$qty(4, "mm")$ banana jack], [Any], [$diameter qty(8.0, "mm")$], + [$qty(6, "mm")$ potentiometer shaft], [Any], [$diameter qty(7.0, "mm")$], + [$qty(3, "mm")$ LED], [Between grid positions], [$diameter qty(3.2, "mm")$], + [Toggle switch], [Any], [Per switch specification], + [Other components], [Centered on grid if possible], [Per component specification], + ), + caption: [Panels grid: component placement rules], +) + +====== Off-grid placements + ++ Small indicators (LEDs) and labels may be placed between grid positions. ++ Non-specified components (controls, interface ports, etc.) should be centered + on grid positions if possible, or centered on the panel. ++ Mounting screws for the panel (into L-channel flanges) are outside the grid + area. + +==== Labelling + +All panels shall include clear, permanent labelling for user operation. + +#figure( + table( + columns: (auto, auto, auto), + table.header([Element], [Requirement], [Location]), + [Module name], [Mandatory], [Top lip], + [Module mathematical function], [Recommended, when applicable], [Above row $1$], + + [Jack function], [Mandatory], [Above or beside jack], + [Jack type], [Mandatory, color-coded jack], [At jack], + [Signal flow], [Recommended, arrows or grouping], [As needed], + [License], [Mandatory], [Below row $8$], + [Version and tier], [Mandatory], [Bottom lip], + [Module designer name or logo], [Optional], [Bottom lip], + [Module builder name or logo], [Optional], [Bottom lip], + ), + caption: [Panels labelling requirements], +) + +===== Jacks color coding + +#figure( + table( + columns: (auto, auto), + table.header([Jack color], [Signal type]), + [White], [Input (bipolar)], + [Light blue], [Output (bipolar)], + [Light yellow], [Output (unipolar)], + [Red], [Output (gate)], + [Yellow], [Output (reference $plus qty(10, "V")$)], + [Blue], [Output (reference $qty(-10, "V")$)], + [Black], [Analog ground], + ), + caption: [Jacks color coding], +) + +===== Use of colors in labels + +The panel has a matte black background. To maintain legibility, all labels +should be white or off-white, with the following exceptions: +- For the designer or builder name or logo. +- When justified by the mathematical operation performed. + +In any case, colors should be designed to offer sufficient contrast, and not +impact module usability by people suffering from color blindness. + +===== Use of graphism and symbols in labels + + +We recommend the use of mathematical symbols and graphism when they illustrate +the functionality of the module. However, text labels should always be present +to express the jack functions. + +===== Label method + +Commercial, reference implementation or metrologic builds should always use +laser engraving or screen printing methods. Those have excellent durability and +legibility. + +DIY builds can use UV-printed vinyl overlay method: it maintains good durability +and legibility while being more accessible. + +===== Typography + +Labels should be printed in a sans-serif typeface (DIN 1451, Eurostile, +Helvetica, etc.), except mathematical formulas. Module name size should be at +least $qty(4, "mm")$ height. Jack labels should be at least $qty(2, "mm")$ +height. + +== Chassis diff --git a/pictures/cassette-external-dimensions.svg b/pictures/cassette-external-dimensions.svg new file mode 100644 index 0000000..793ec3f --- /dev/null +++ b/pictures/cassette-external-dimensions.svg @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIDE ELEVATION + + + + + + + + + + + + + Chassis Rail Limit + Chassis Rail Limit + + + + + + + Panel Height: 177.8 mm ±0.1 (4U / 7.0") + + + + + Body Height: 165.1 mm ±0.1 (6.5") + + + + Lip height: 6.35 mm + + Lip height: 6.35 mm + + + + + + Depth: 152.4 mm ±0.2 (6.0") + + + + + + + FRONT ELEVATION + + + + + + + + + + + + + + + Width: 38.0 mm + +0.0 / -0.1 mm (1.5") + + + + + + + + + + + + + + + + + + + + + + diff --git a/pictures/db-25-backplane-connector.svg b/pictures/db-25-backplane-connector.svg new file mode 100644 index 0000000..68f1bc0 --- /dev/null +++ b/pictures/db-25-backplane-connector.svg @@ -0,0 +1,1053 @@ + + + + + + + + + + + + + + + + + Shell: Earth + + + + + + +15.00 V + + 1 + + + +