Circuit review & bench-test guide
robot-power-dist — Robot power distribution board
Document purpose#
This document explains the robot-power-dist board at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the generated schematic (generate_design.py is authoritative for parts, reference designators, nets, and values), the README, and the ERC report in reports/.
This board has NEVER been fabricated. Its status is: schematic generated, ERC clean (0 errors / 0 warnings), netlist membership verified (27 nets / 149 pins). There is no PCB layout, no BOM order, no assembled unit, and no first-article bench result of any kind. Every number in this guide — gate thresholds, divider taps, calibration constants, LED currents, dissipation figures — is a design target to verify on the first assembled board, not a proven result. Several MPNs still carry TBD: / TBD-confirm: prefixes and must be pinned before ordering.
1. What the board does#
The board fans a robot battery rail (VBAT, 6.4–12.6 V, 2S/3S LiPo, arriving already fused and reverse-protected from battery-power-input/) out to four independently fused output channels, behind one master high-side gate. The gate is a parallel pair of DMP4015SSS P-MOSFETs whose only turn-on path is a series chain through a normally-closed e-stop loop AND a host enable — the default state, and the state with any wire cut or host unpowered, is OFF. Each channel carries a 1206 fuse, a 20 mΩ 2512 shunt, an INA226 high-side monitor on a shared I2C bus (addresses 0x40/0x41/0x44/0x45), and a green output-live LED. All four INA226 ALERT outputs are wire-OR'd on one open-drain line (PWR_ALERT_N). The 3.3 V telemetry domain is supplied by the host over Qwiic and is fully separate from the battery power path.
It is not a certified safety device: no redundancy, no monitored contacts, no rated stop category. The no-auto-relatch rule is a fabric/host contract, not a hardware feature.
Functional block diagram#
VBAT 6.4-12.6 V PGATE
J1 ────────────┬──────────────────────┐
│ R1 100k (pull OFF) │ common gate
│ D1 BZT52C10 clamp v
└────────────────> Q1 ‖ Q2 (2x DMP4015SSS, high-side)
│
PGATE ─ R2 10k ─ J2 NC e-stop v
loop ─ Q3 2N7002 ─ GND VDIST ──┬─ F1 ─ R4 20m ─► J3 CH1 U1 INA226 0x40
▲ ├─ F2 ─ R5 20m ─► J4 CH2 U2 INA226 0x41
EN (J9.1, ├─ F3 ─ R6 20m ─► J5 CH3 U3 INA226 0x44
R3 10k pull-down) └─ F4 ─ R7 20m ─► J6 CH4 U4 INA226 0x45
│
R15/R16/R17 ───────────┘ per channel: green LED (R8-R11 + D2-D5)
GATE_STATUS divider
telemetry: J7 Qwiic / J8 header / J9 control
SDA/SCL (R12/R13 + JP1/JP2), PWR_ALERT_N (R14)
2. Safety and scope boundaries#
- This is a paper design. Do not trust any figure here until it is measured on a fabricated, inspected board. Do not connect real robot loads until phases A–D below pass.
- Use a current-limited bench supply (not a LiPo) for all first-power tests. A lithium battery can deliver hundreds of amps into an assembly fault; a bench supply set to 500 mA cannot.
- The board deliberately has no input fuse and no reverse protection — those live on
battery-power-input/. If you bench it standalone, add an inline fuse and observe polarity at J1; reversed VBAT forward-biases the Q1/Q2 body diodes and energizes VDIST unprotected. - The e-stop gating is safety-themed, not safety-rated. Never make a person's safety depend on it. It has one contactor-equivalent (the FET pair), no monitored contacts, and a purely combinational AND.
- The INA226 VS pins run from 3V3 only. Never jumper 3V3 to VBAT/VDIST: the INA226 supply absolute maximum is 6 V and a battery rail destroys all four monitors at once.
- Keep total load within the ~8 A combined master-gate budget and within the upstream battery-board fuse. The INA226 reading saturates at ~4.1 A per channel — saturation is not proof the current stopped rising.
- Ground-referenced scope probes go to board GND only. Shunt drops are high-side, millivolt-level signals; use the INA226 or a differential measurement, not a grounded probe across the shunt.
- Fuse-blow tests are end-of-plan destructive tests. Do them last, with eye protection, on one sacrificial channel first.
3. Power-control sequence#
- With J1 powered but nothing else connected, R1 (100 kΩ) holds PGATE at VBAT, so V_SG = 0 and Q1/Q2 are off. VDIST is dead. R3 (10 kΩ) holds EN low, so an unpowered or unconfigured host also means OFF.
- The host arrives on J7/J8 (3V3 + I2C) and J9 (EN, GATE_STATUS, PWR_ALERT_N). The four INA226s power up from 3V3 and are readable at 0x40/0x41/0x44/0x45 even while the gate is off (their supply is the telemetry rail, not VDIST).
- Turn-on requires both: the NC e-stop loop across J2 closed (button healthy / wire link fitted) and EN driven high. Then Q3 (2N7002) conducts and the series chain PGATE → R2 (10 kΩ) → J2 loop → Q3 → GND pulls the common gate down.
- R1/R2 form a 100k:10k divider, so V_SG ≈ 0.909·VBAT — about 5.8 V at 6.4 V input and an unclamped 11.5 V at 12.6 V, which D1 (BZT52C10) clamps to ≤ 10 V. The FET V_GS rating is ±20 V; the clamp adds margin, it is not survival-critical.
- VDIST energizes and each channel conducts through its fuse and shunt to its terminal. Channel LEDs (D2–D5 via R8–R11) light. The GATE_STATUS divider (R15 39k / R16 10k, R17 100R series) reports VDIST·10/49 on J9.2 (≈ 2.57 V at 12.6 V).
- Opening the loop (button hit, wire cut, connector fall-off) or dropping EN breaks the pull-down chain anywhere along it; R1 recharges the gate to the source and the pair turns off. The hardware is combinational and non-latching: if the loop recloses while EN is still high, power returns. The no-auto-relatch rule (latch a GATE_STATUS drop, require a deliberate EN toggle) is a host/fabric contract that must be tested at the system level, not on this board alone.
Master-gate truth table (to be verified row by row in phase C)#
| Row | J2 e-stop loop | EN (J9.1) | Q3 | Pull-down chain | Expected VDIST |
|---|---|---|---|---|---|
| 1 | closed | high (≥ 2.5 V) | on | complete | ON (≈ VBAT) |
| 2 | closed | low / floating (R3) | off | broken at Q3 | OFF (≈ 0 V) |
| 3 | open | high | on | broken at J2 | OFF |
| 4 | open | low | off | broken twice | OFF |
Only row 1 is ON. Rows 2–4 must all measure OFF; row 2 with EN floating (host unplugged) is the R3 pull-down check and gets its own step.
4. Interfaces#
| Ref | Pins/signals | Intended use |
|---|---|---|
| J1 | 1 VBAT, 2 GND (5.08 mm screw terminal) | Battery rail input from battery-power-input/ (fused + reverse-protected there) |
| J2 | 1 LOOP_A, 2 LOOP_B | NC e-stop loop: wire an NC mushroom button (or chain of them) across 1–2; fit a wire link when unused. Ships OFF until closed |
| J3–J6 | 1 VOUT1..4, 2 GND | Channel 1–4 fused, monitored outputs (screw terminals) |
| J7 | 1 GND, 2 3V3, 3 SDA, 4 SCL | Qwiic / STEMMA QT (JST-SH); host supplies the 3.3 V telemetry rail |
| J8 | 1 3V3, 2 GND, 3 SDA, 4 SCL | 2.54 mm duplicate of J7 — note pins 1/2 are swapped relative to J7 |
| J9 | 1 EN (in), 2 GATE_STATUS (out), 3 PWR_ALERT_N (out, open-drain), 4 GND | Host control/status header |
| JP1 / JP2 | Solder jumpers, shipped bridged | Cut to remove the on-board SDA/SCL pull-ups when the host chain already provides them |
There are no dedicated test points in the rev 0.1 schematic; bench access is via the terminals, headers, and component pads (PGATE at R1/R2/D1 pads, EN at R3, ST_DIV at R15/R16). Consider adding TPs at layout time.
5. Component-by-component review#
5.1 Master gate and e-stop chain#
| Ref | Part / value | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| J1 | Phoenix MKDS 1,5/2-5,08 class terminal (TBD:) | Battery rail entry; must carry the full ~8 A budget | No power | Reversed wiring energizes VDIST through the Q1/Q2 body diodes with no gating |
| Q1, Q2 | Diodes DMP4015SSS-13, −40 V P-MOSFET, SO-8, parallel pair | High-side master switch VBAT→VDIST; two in parallel for the ~8 A budget (R_DS(on) 7 mΩ typ / 11 mΩ max at V_GS = −10 V) | One missing: full load in the other FET, roughly double dissipation; both missing: VDIST dead | D–S short defeats the e-stop entirely (VDIST always live) — this is the single most safety-relevant assembly fault; swapped S/D orientation conducts backwards through the channel |
| Q3 | onsemi 2N7002LT1G, 60 V/115 mA N-MOSFET, SOT-23 | Low-side EN switch closing the gate pull-down chain | Gate can never turn on (VDIST stuck OFF) | D–S short removes the EN term of the AND: loop closed alone turns power on |
| J2 | Phoenix MKDS class terminal (TBD:) | NC e-stop loop interface; the loop is in series with the gate pull-down, so any break = OFF | Loop open = board OFF (fail-safe direction) | Solder bridge or stray strand across 1–2 permanently defeats the e-stop while looking normal |
| R1 | 100 kΩ 0603 (Yageo RC0603FR-07100KL) | Gate-source pull-up: defines the default-OFF state and turns the pair off when the chain breaks | Gate floats: FETs may drift on from leakage/dV/dt — dangerous | Short = gate tied to source, permanently OFF |
| R2 | 10 kΩ 0603 | Series/divider resistor: with R1 sets V_SG = 0.909·VBAT and limits chain current | Chain broken, gate never turns on | Short raises V_SG toward full VBAT (12.6 V) — D1 then carries the clamp alone; verify D1 before blaming R2 |
| R3 | 10 kΩ 0603 | EN pull-down: unpowered/unplugged host = OFF | EN floats: gate state depends on leakage and host tri-state behavior — must be caught in review | Short holds EN low, board can never be enabled |
| D1 | Diodes BZT52C10 10 V zener, SOD-123 (TBD: BZT52C10-7-F) | Clamps V_SG ≤ ~10 V at 3S (unclamped divider gives 11.5 V at 12.6 V; FET rating ±20 V — margin, not survival) | V_SG runs to 11.5 V at 12.6 V: inside rating, reduced margin | Short = gate tied to source, permanently OFF; reversed = ~0.9 V forward drop gate-to-source, also effectively OFF |
5.2 Gate status divider#
| Ref | Value | Function | If omitted or wrong |
|---|---|---|---|
| R15 | 39 kΩ 0603 | GATE_STATUS divider top from VDIST; 39k/10k gives tap = VDIST·10/49 (2.57 V at 12.6 V). Fit 18 kΩ for 2S-only systems, 100 kΩ for 24 V per axa-012 | Open: GATE_STATUS reads 0 even when ON (host will believe the gate failed); wrong value (e.g. the spec's original 100k) never reaches logic-high |
| R16 | 10 kΩ 0603 | Divider bottom | Open: tap floats to VDIST — up to 12.6 V into a 3.3 V host pin, limited only by R15+R17 (~250 µA); short: tap always 0 |
| R17 | 100 Ω 0603 | Series protection on the board-driven GATE_STATUS line | Open: no status; short: only removes the (small) protection |
5.3 Distribution channels (×4 — CH1/CH2/CH3/CH4)#
| Refs | Part / value | Function | If omitted or wrong |
|---|---|---|---|
| F1–F4 | 2 A 1206 SMD fuse (TBD: Littelfuse 0467002.NR) | Per-channel overcurrent protection; rating is load-specific (2 A default; 3 A small motors; up to 5 A drive motors — above 4.1 A the INA226 saturates before the fuse acts) | Open/blown: channel dead, LED dark, INA226 bus voltage reads ~0; oversized: wiring becomes the fuse |
| R4–R7 | 20 mΩ 1% 1 W 2512 (TBD-confirm: Vishay WSL2512R0200FEA18) | Current shunt: 81.92 mV/20 mΩ = 4.096 A full scale; 0.34 W at full scale (1 W part) | Open: channel dead; wrong value scales every current reading proportionally (a 10 mΩ part reads half); poor Kelvin routing at layout adds gain error |
| U1–U4 | TI INA226AIDGSR, TSSOP-10 | Per-channel high-side current/bus-voltage/power monitor, I2C. U1=0x40 (A1=GND, A0=GND), U2=0x41 (A1=GND, A0=3V3), U3=0x44 (A1=3V3, A0=GND), U4=0x45 (A1=3V3, A0=3V3) | Missing: address NACKs, no telemetry (power path still works); swapped A0/A1 straps: device answers at the wrong address — channel attribution silently wrong; VS wired to VDIST instead of 3V3 destroys it (abs max 6 V) |
| C1–C4 | 100 nF 16 V X7R 0603 (Murata GRM188R71C104KA01D) | Per-INA226 VS decoupling | Noisy conversions, possible I2C flakiness |
| R8–R11 | 4.7 kΩ 0603 | Channel LED resistor, ≈ 2.2 mA at 12.6 V | LED dark (no functional impact); too small overdrives the LED |
| D2–D5 | Kingbright APT1608SGC green 0603 LED | Output-live indicator per channel — indicates voltage, not current capability | Dark channel that actually works (check terminal voltage before trusting the LED); reversed = dark |
| J3–J6 | Phoenix MKDS class terminal (TBD:) | Channel outputs (1 VOUTn, 2 GND) | Loose screw = heat at load; miswired polarity damages the load |
5.4 Telemetry and host interface#
| Refs | Part / value | Function | If omitted or wrong |
|---|---|---|---|
| J7 | JST SM04B-SRSS-TB Qwiic | Host 3V3 + I2C entry, Qwiic pin order (GND, 3V3, SDA, SCL) | No telemetry rail: monitors dead, EN pull-down still guarantees OFF |
| J8 | 1×4 2.54 mm header (TBD:) | Duplicate telemetry (3V3, GND, SDA, SCL — note different order than J7) | Miswiring J8 per the J7 order swaps 3V3/GND on the host — review carefully |
| J9 | 1×4 2.54 mm header (TBD:) | EN in / GATE_STATUS out / PWR_ALERT_N out / GND | The only control path; a swapped harness can drive 3.3 V into GATE_STATUS's divider (survivable) or ground EN (stuck OFF) |
| R12, R13 | 4.7 kΩ 0603 | Shared SDA/SCL pull-ups behind JP1/JP2 | No pull-ups anywhere on the chain: bus dead (SDA/SCL stuck low or floating); doubled-up with host pull-ups: still usually fine, check V_OL margins |
| JP1, JP2 | Solder jumpers, shipped bridged | Cut to remove R12/R13 when the host provides pull-ups | Cut with no host pull-ups = dead bus |
| R14 | 10 kΩ 0603 | Single pull-up for the wire-OR'd open-drain PWR_ALERT_N | Line floats: host reads noise/phantom alerts; short to 3V3 would fight the INA226 open-drain drivers (they sink; abs max is exceeded only above 6 V, but the alert becomes unreadable) |
| C5 | 1 µF 10 V X7R 0603 (Murata GRM188R71A105KA61D) | Telemetry-rail bulk decoupling at the Qwiic entry | More 3V3 sag/bounce during simultaneous conversions |
6. Datasheet summary and design interpretation#
| Device | Key manufacturer facts used here | Board-specific interpretation |
|---|---|---|
| INA226 (product page, datasheet PDF) | Supply 2.7–5.5 V (6 V abs max); shunt input ±81.92 mV full scale, 2.5 µV/LSB; bus input 0–36 V, 1.25 mV/LSB; common-mode 0–36 V independent of supply; gain error ≤ 0.1%, offset ≤ ±10 µV; 16 strap-selectable I2C addresses; ALERT is open-drain; CAL = 0.00512/(Current_LSB·R_shunt); default config 0x4127 (1.1 ms conversions, shunt+bus continuous); Manufacturer ID reg 0xFE = 0x5449, Die ID 0xFF = 0x2260 | VS from 3V3 while sensing a 12.6 V rail is exactly the intended split (36 V CM). 20 mΩ gives 4.096 A full scale; ±10 µV offset = ±0.5 mA floor. Only GND/VS strap codes used → 0x40/0x41/0x44/0x45. ID registers give a strap-independent presence check |
| DMP4015SSS (datasheet, product page) | −40 V V_DS, ±20 V V_GS, −9.1 A rated, R_DS(on) 7 mΩ typ / 11 mΩ max at V_GS = −10 V, ≤ 15 mΩ at −4.5 V, SO-8 (pins 1–3 S, 4 G, 5–8 D) | At 2S minimum (6.4 V) drive is only ≈ −5.8 V, so budget with the −4.5 V spec (≤ 15 mΩ). Parallel parts don't share statically; the positive R_DS tempco self-balances — hence the ~5 A per-FET comfort zone, ~8 A combined. Even 4 A/4 A at the 11 mΩ corner ≈ 0.18 W per FET |
| 2N7002LT1G (product page, datasheet PDF) | 60 V V_DS, ±20 V V_GS, 115 mA continuous, V_GS(th) max 2.5 V at 250 µA, SOT-23 | Chain current is well under 1 mA — trivial for the part. The 2.5 V max threshold means EN must be driven with genuine 3.3 V CMOS levels; a marginal 2.5 V-ish high is a turn-on-uncertainty to check on the bench |
| BZT52C10 (product page, datasheet PDF) | 10 V nominal (≈ 9.4–10.6 V window) at 5 mA test current, ~410 mW, SOD-123 | The clamp operates at only ~0.1–0.2 mA, well below the 5 mA test point, so the actual clamped V_SG will sit somewhat below the datasheet V_Z — measure it, expect roughly 9–10 V at 12.6 V input |
| WSL2512 shunt (datasheet) | 20 mΩ ±1%, 1 W, low-TCR metal strip, 2512 | ±1% is the floor of system current accuracy (bigger than INA226 gain error). 0.34 W at 4.1 A full scale — fine, but a 5 A-fused channel reaches 0.5 W: watch temperature |
| Littelfuse 467 series (series page) | 1206-form fast-acting SMD fuse family; per-rating I²t and voltage rating in the series datasheet | MPN still TBD: — the original spec's 0466 NANO2 body does not fit the pinned 1206 land, hence 0467. Verify voltage rating ≥ 12.6 V and I²t against the intended load's inrush before pinning |
| Kingbright APT1608SGC (datasheet) | Green 0603, V_F ≈ 2.2 V, 20 mA max | 4.7 kΩ gives ≈ 2.2 mA at 12.6 V (≈ 0.9 mA at 6.4 V — dim but visible); indicator only |
Check the latest datasheet revision and exact orderable suffix before procurement; all TBD: MPNs must be pinned first.
INA226 calibration math for the 20 mΩ shunt (per channel)#
- Full-scale current: 81.92 mV / 20 mΩ = 4.096 A.
- Current_LSB = full scale / 2¹⁵ = 4.096 / 32768 = 125 µA/bit (a clean round choice; keep it).
- CAL = 0.00512 / (Current_LSB × R_shunt) = 0.00512 / (125 µA × 0.020 Ω) = 0.00512 / 2.5e-6 = 2048 = 0x0800. Write 0x0800 to register 0x05.
- Power_LSB = 25 × Current_LSB = 3.125 mW/bit.
- Example config (register 0x00): default 0x4127 = 1-sample average, 1.1 ms bus + 1.1 ms shunt conversion, continuous shunt+bus (~2.2 ms per update). For quieter readings use 0x4527 (16-sample average, ~35 ms per update).
- Sanity anchors: 1.000 A through the shunt → shunt register (0x01) reads 20 mV / 2.5 µV = 8000 = 0x1F40; current register (0x04) reads 1.000/125 µA = 8000 = 0x1F40 (with CAL = 0x0800 they match by construction). VDIST = 12.60 V → bus register (0x02) reads 12.6/1.25 mV = 10080 = 0x2760.
- Accuracy floor: shunt ±1% dominates; INA226 gain ≤ 0.1%, offset ±10 µV = ±0.5 mA. Expect DMM-vs-register agreement within ~1–2% after assembly.
7. Expected values before bench testing#
All values are calculated targets from an unfabricated schematic.
| Quantity | Design target | What to measure |
|---|---|---|
| VDIST OFF leakage | ≈ 0 V, µA-level | VDIST with loop open or EN low |
| V_SG (gate drive), 6.4 V in | ≈ 5.8 V (0.909·VBAT, below clamp) | VBAT-to-PGATE, DMM across R1/D1 pads |
| V_SG at 12.6 V in | clamped ≈ 9–10 V (unclamped would be 11.5 V) | Same; confirms D1 acts |
| Chain current when ON | ~0.1–0.3 mA total (R1 + zener paths) | Series µA-meter in J2 loop |
| VBAT→VDIST drop, 4 A | ≤ ~25 mV (two FETs sharing, ≤11 mΩ max each) | DMM across Q1/Q2 pair at load |
| Per-FET dissipation, 8 A total | ≈ 0.18 W each at the 11 mΩ corner | Thermal camera / thermocouple soak |
| GATE_STATUS tap at 12.6 V | 2.57 V (VDIST·10/49); 1.31 V at 6.4 V | J9.2 vs DMM on VDIST |
| INA226 presence | ACK at 0x40, 0x41, 0x44, 0x45; reg 0xFE = 0x5449, 0xFF = 0x2260 | I2C scan + register reads |
| Current readback, 1.000 A known load | register 0x1F40 (= 1.000 A), within ~1–2% of DMM | Per channel, CAL = 0x0800 |
| Bus voltage readback | matches DMM on VOUTn within ~0.1% + LSB | Register 0x02 vs DMM |
| Channel LED current | ≈ 2.2 mA at 12.6 V | Visual + optional series measurement |
| Shunt dissipation at 4.096 A | 0.336 W (1 W part) | Shunt temperature at sustained load |
| PWR_ALERT_N idle | high (3.3 V via R14) | J9.3 |
| I2C pull-up | 4.7 kΩ to 3V3 each line (JP1/JP2 bridged) | Ohmmeter, unpowered |
| Turn-off on loop break | gate discharge... release via R1×C_iss(2 FETs): expect tens–hundreds of µs to start, load-dependent VDIST decay | Scope on PGATE and VDIST while opening J2 |
8. Manual schematic and assembly review checklist#
- Confirm Q1/Q2 orientation against the SO-8 pinout (1–3 S, 4 G, 5–8 D): sources to VBAT, drains to VDIST. A reversed FET conducts through its body diode regardless of gating.
- Confirm D1 polarity: cathode to VBAT, anode to PGATE. Reversed = board permanently OFF (a confusing failure).
- Verify Q3 pinout (SOT-23: G/S/D) — a rotated part can tie LOOP_B to GND permanently, deleting the EN term of the AND.
- Buzz the entire pull-down chain unpowered: PGATE pad → R2 → J2.1, J2.2 → Q3 drain. Confirm no path from PGATE to GND that bypasses J2 or Q3.
- Verify per-channel INA226 A0/A1 straps against the address map (U1 GND/GND, U2 GND/3V3, U3 3V3/GND, U4 3V3/3V3) — a swapped strap silently misattributes channels.
- Verify every U1–U4 VS pin connects to 3V3, never VDIST (abs max 6 V).
- Confirm IN+/IN− of each INA226 land across its own shunt with the correct polarity (IN+ on the fuse side, IN− on the terminal side) and that VBUS ties to the VOUTn side.
- Measure R4–R7 (20 mΩ) with a 4-wire ohmmeter or note that a 2-wire DMM cannot resolve them; at minimum confirm they are not open.
- Measure R1, R2, R3, R12–R17 values in-circuit before first power.
- Confirm JP1/JP2 are bridged (or deliberately cut) to match the host's pull-up plan.
- Confirm F1–F4 fitted ratings against the actual loads and that the sum respects the ~8 A gate budget and the upstream battery fuse.
- Note J7 vs J8 pin-order difference (GND/3V3 vs 3V3/GND) on the harness drawings.
- Confirm all
TBD:MPNs were pinned to real orderable parts before the build, and record what was actually fitted.
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record serial number, fitted MPNs, equipment IDs, ambient, and operator. Use a current-limited bench supply (≤ 500 mA limit) until phase D.
A. Unpowered inspection and resistance tests#
- Complete the section 8 checklist under magnification.
- Measure VBAT-to-GND and VDIST-to-GND resistance in both polarities; investigate any hard short.
- Verify J2 loop wiring: with the link/button fitted, J2.1–J2.2 reads ~0 Ω; with the button pressed, open.
- Ohm the fuses: each F1–F4 end-to-end near 0 Ω; VDIST-to-VOUTn total should read fuse + 20 mΩ ≈ near 0 Ω on a 2-wire DMM.
- Confirm SDA and SCL each read ≈ 4.7 kΩ to 3V3 (JP1/JP2 bridged), and PWR_ALERT_N ≈ 10 kΩ to 3V3.
B. Telemetry domain only (no VBAT)#
- Connect the host 3V3/I2C via J7 (or a USB-I2C adapter). Do not connect VBAT yet.
- Measure 3V3 current draw (four INA226s: low single-digit mA expected).
- I2C scan: exactly 0x40, 0x41, 0x44, 0x45 must ACK. Any other address, or a missing one, means a strap or solder fault — fix before proceeding.
- From each device read Manufacturer ID (0xFE = 0x5449) and Die ID (0xFF = 0x2260).
- Write CAL = 0x0800 and config 0x4127 to each; read back. Bus and shunt registers should read ≈ 0 (no VBAT yet).
C. Master-gate truth table and e-stop behavior (current-limited supply)#
- Bench supply on J1: 12.0 V, 200 mA limit. No loads on J3–J6. Loop link fitted, EN floating.
- Row 2 (EN floating): VDIST must be ≈ 0 V (R3 holds EN low). Record any leakage.
- Row 2 (EN driven low): tie EN to GND — VDIST still OFF.
- Row 1: drive EN to 3.3 V. VDIST must jump to ≈ VBAT; all four channel LEDs light; GATE_STATUS reads ≈ VBAT·10/49 (2.45 V at 12.0 V). Measure V_SG: ≈ 9–10 V (clamped). Repeat at 6.4 V input: VDIST follows, V_SG ≈ 5.8 V unclamped, GATE_STATUS ≈ 1.31 V.
- Row 3: with EN still high, open the loop (press the e-stop / pull the link). VDIST must fall to ≈ 0. Scope PGATE and VDIST during the break and record the turn-off waveform.
- Row 4: EN low and loop open — OFF.
- Relatch check (design-intent confirmation): with EN held high, re-close the loop. Hardware will re-energize VDIST — this is the documented combinational behavior, not a fault. Confirm it, then verify the host/fabric supervisor (when present) latches the GATE_STATUS drop and refuses to re-enable without a deliberate EN toggle.
- Repeat step 5 while GATE_STATUS is being sampled by the host: the drop must be visible fast enough for the supervisor contract (record latency).
- Only after every row matches, raise the supply current limit for phase D.
D. Per-channel checks and calibration (known loads)#
- One channel at a time: attach a known resistive load (e.g. 12 Ω/25 W for ~1 A at 12 V) to J3, with a DMM in series (or a calibrated shunt).
- Gate ON: confirm VOUT1 ≈ VDIST minus microvolt-level shunt/fuse drops, LED lit.
- Read U1 bus voltage, shunt voltage, current (with CAL = 0x0800), and power registers. Targets: current within ~1–2% of the DMM; bus within ~0.1%; power ≈ V×I with 3.125 mW LSB.
- Compute the per-channel correction factor (DMM/register) and record it — this is the shunt-tolerance calibration named in the README.
- Repeat for J4/U2, J5/U3, J6/U4. Confirm each reading appears at the expected address (load one channel at a time and check the other three read ≈ 0 A — this catches strap/attribution swaps).
- Step one channel toward full scale (up to ~4 A briefly): confirm the reading saturates near 0x7FFF-equivalent (4.096 A) without damage and the fuse holds. Watch shunt temperature.
- Load two channels simultaneously and verify the VBAT→VDIST drop and Q1/Q2 temperatures against the section 7 targets. A gross temperature imbalance between Q1 and Q2 means one FET is not conducting (solder or orientation).
E. Wire-OR ALERT test#
- Idle state: PWR_ALERT_N (J9.3) reads 3.3 V with no alerts configured.
- On U2 (0x41) only, configure Shunt-Over-Voltage alert: Mask/Enable register 0x06 = 0x8001 (SOL bit 15 + latch enable LEN bit 0) and Alert Limit register 0x07 = 0x0640 (1600 × 2.5 µV = 4 mV = 0.2 A threshold).
- Apply a small ~0.3–0.5 A load to channel 2. PWR_ALERT_N must fall low.
- Attribution: read Mask/Enable from all four devices. Only U2 must show AFF (Alert Function Flag, bit 4) set; the read clears the latched alert and the shared line must return high (remove the load first, or it re-asserts).
- Repeat with the same load on channel 3 while U2's alert is still armed: the line must stay high (proves the alert is channel-specific and the wire-OR is not shorted between channels).
- Arm two channels and load both: line low; both AFF flags set; line releases only after both are cleared/unloaded — confirms true open-drain wire-OR behavior on the single R14 pull-up.
F. Fuse and abuse tests (destructive, last)#
- On one sacrificial channel with a spare fuse fitted, apply a supply- limited overload well above the fuse rating (e.g. 6–8 A from a supply into a 2 A fuse) and confirm the fuse opens, the channel dies, the LED goes dark, and the other channels are undisturbed. Note the INA226 will have saturated at 4.1 A during the event.
- Verify post-blow: bus voltage register for that channel reads ≈ 0, no damage to the shunt or INA226 inputs.
- Only after everything above: repeat selected phase C/D checks from the real
battery-power-input/chain instead of the bench supply.
G. Release-only tests#
System-level supervisor (no-auto-relatch fabric contract), vibration on the screw terminals, thermal soak at full budget in the enclosure, and the layout-dependent items (Kelvin shunt routing verification, copper heating) can only be assessed after a PCB layout exists — none does today.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| VDIST never turns on | EN at Q3 gate, J2 continuity, PGATE voltage | R3/EN drive, loop wiring, Q3 orientation, R2 open, D1 shorted/reversed, R1 short |
| VDIST on with EN low or loop open | PGATE, Q3 D–S, J2 solder | Q1/Q2 D–S short (critical), Q3 shorted, bridge across J2 |
| VDIST on but sags at load | VBAT→VDIST drop, Q1 vs Q2 temperature | One FET not conducting (solder/orientation), undersized supply |
| V_SG ≈ 11.5 V at 12.6 V in | D1 polarity/presence | D1 missing, reversed, or wrong part |
| One channel dead, LED dark | Fuse continuity, VOUTn | Blown/open F, open shunt, terminal wiring |
| LED dark but channel powered | LED polarity, R8–R11 | Reversed D2–D5, open resistor |
| I2C scan missing an address | A0/A1 straps, VS pin, SDA/SCL solder | Strap error, unpowered VS, TSSOP solder fault |
| Two channels report each other's current | Address map vs physical channel | Swapped A0/A1 straps — fix attribution before trusting telemetry |
| Current reading off by a fixed ratio | Shunt value, CAL register | Wrong shunt fitted, CAL ≠ 0x0800, missing per-channel correction |
| PWR_ALERT_N stuck low | Read AFF on all four; unpowered resistance to GND | Latched alert never cleared, INA226 damaged, solder short |
| PWR_ALERT_N never asserts | R14 presence, Mask/Enable readback | Alert not armed (0x06), limit (0x07) too high, open ALERT pin joint |
| GATE_STATUS wrong scale | R15/R16 values, VDIST | 100k fitted instead of 39k (spec deviation trap), R16 open |
| Bus dead | SDA/SCL to 3V3 resistance | JP1/JP2 cut with no host pull-ups, 3V3 absent |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
Fitted MPNs for all former TBD: parts (fuses, shunts, D1, terminals) | |
| Fuse ratings fitted per channel and intended loads | |
| Bench supply / DMM / scope / load, calibration dates | |
| Ambient, airflow | |
| Section 8 checklist result | |
| Phase A resistance results | |
| I2C scan result (addresses seen) and ID register reads | |
| Truth-table rows 1–4 results, both 6.4 V and 12.6 V | |
| V_SG measured (clamped and unclamped points) | |
| Loop-break turn-off capture reference | |
| Relatch behavior confirmation + supervisor latency | |
| Per-channel calibration factors (DMM/register), CAL used | |
| Cross-attribution check result | |
| ALERT wire-OR test results (assert, attribute, release) | |
| Load/thermal soak results (drop, Q1/Q2/shunt temperatures) | |
| Fuse-blow test result | |
| Deviations, photos, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The architecture is coherent and deliberately conservative: a default-OFF high-side gate whose only turn-on path is a series AND of an NC e-stop loop and a host enable, four channels that each carry their own fuse, shunt, and monitor, and a telemetry domain that cannot back-feed the power path. The design honestly documents its two sharpest edges — the combinational (non-latching) gate, whose no-auto-relatch guarantee lives in the host fabric, and the unmatched static current sharing of the parallel FET pair.
The principal risks are exactly what an unfabricated board implies: nothing has ever been measured. The highest-value first-article checks are the truth table (especially proving VDIST cannot energize with the loop open — a Q1/Q2 drain-source short or a J2 solder bridge silently deletes the e-stop), the D1 clamp at 3S voltage, INA226 address attribution, the CAL = 0x0800 current readback against a DMM, and the wire-OR ALERT attribution flow. Before any of that, the TBD: MPNs must be pinned, a PCB layout produced (wide VBAT/VDIST copper, Kelvin-ish shunt routing), and the resulting board built and inspected. Until then, treat every number in this guide as a target, and never as evidence.