Circuit review & bench-test guide
AXA-004 — Discrete H-bridge lab PMOD module
Document purpose#
This document explains the axa-004-hbridge-lab module at component level and turns the design intent into a practical manual-review and bench-test plan. It is based on the generator (generate_design.py), the module README, the actuator-line rules in ../README.md, and the AO3400A/AO3401A manufacturer datasheets.
This is an unfabricated prototype design. Status at time of writing: schematic generated, ERC clean (0/0), netlist reviewed, PCB layout not started, no board built, no bench evidence of any kind, and the mandatory deadtime_gen HDL and testbench do not exist yet. Every number below is a design target or a datasheet-derived estimate to verify — nothing here is proof that an assembled board is safe.
This is the most dangerous board in the actuator family. It is a discrete H-bridge with no driver IC, no dead-time hardware, no interlock, no fuse, no current sensing, and no protection other than resistors, body diodes, and your own logic. Shoot-through — a direct short of the motor supply through two FETs — is physically possible by design, because teaching that hazard honestly is the module's purpose. Treat every instruction in sections 4, 8, and 9 as mandatory, not advisory.
1. What the board does#
The module is a two-half-bridge (full H-bridge) motor driver built from six SOT-23 FETs on a 3.3 V PMOD interface. The FPGA fabric generates all four gate signals (HS1, LS1, HS2, LS2 — all active-high). Each half-bridge has an AO3401A P-channel high-side FET and an AO3400A N-channel low-side FET; a third small AO3400A per channel acts as a level inverter so the 3.3 V PMOD pin can control a P-FET gate that lives near VM. Motor power VM (5–12 V) enters only on the J2 screw terminal, never through the PMOD. The bridge output OUT1/OUT2 goes to the J3 screw terminal. Flyback is handled by FET body diodes only.
There is no fault output, no current sense, no thermal feedback, and no enable pin. The module is deliberately dumb; the curriculum pairs it with a sense module for closed-loop work.
Functional block diagram#
PMOD J1 (3.3 V logic only, all host-driven, all ACTIVE-HIGH)
│
├─ HS1 ─100R(R1)─> Q3 AO3400A inverter ─┐ VM 5–12 V ── J2 ──┬── C1 C2 C3
│ └10k(R5) to GND │ drain = HG1_PD │ bulk+HF
│ 10k(R4) series │
│ HG1 ──────────┴──── 10k(R3) pull-up to VM ────────┤
│ │ │
│ v gate │
│ Q1 AO3401A P-FET (source = VM) ──────────────────---┤
│ │ drain │
│ ├──────────────> OUT1 ──> J3 pin 1 │
│ │ drain │
├─ LS1 ─100R(R2)─> Q2 AO3400A N-FET (source = GND) │
│ └10k(R6) to GND │
│ │
├─ HS2 ─100R(R7)─> Q6 inverter ── R10/R9 ── Q4 AO3401A ──┐ │
│ └10k(R11) to GND ├─> OUT2 ──> J3 pin 2
├─ LS2 ─100R(R8)─> Q5 AO3400A ───────────────────────────┘
│ └10k(R12) to GND
└─ 3V3 / GND (PMOD pins 5, 6, 11, 12; grounds join on the module)
HSx = LSx = 1 ==> VM shorted to GND through Q_high + Q_low. NO INTERLOCK.
2. Safety and scope boundaries#
- The FPGA gate-drive logic must be proven in a self-checking testbench before any bitstream ever drives this board (section 5). This is a hard precondition, not a recommendation.
- Dead time must be measured on the real board with VM disconnected (section 4.4) before the motor supply is ever connected.
- First power is VM = 5 V through a bench supply set to a 100 mA current limit, with no motor attached (section 9.D).
- Never hot-plug motor leads. Never connect or disconnect anything at J2 or J3 while VM is energized. An interrupted inductive circuit arcs and spikes.
- Rail sequencing: logic 3.3 V (PMOD host) up before VM; VM off before logic goes down. The 10 k idle pull-downs cover the unpowered-host case, but a half-configured FPGA with floating or contending I/O is not a defined state — never rely on it.
- "Hands clear" convention for first spin: when VM is first raised with a motor attached, nobody touches the board, wiring, or motor. Stand back; kill power at the supply, not at the board.
- Wear safety glasses for all powered bridge tests. A SOT-23 failing in shoot-through can crack or eject its package.
- There is no reverse-polarity protection on J2. Reversed VM conducts through the Q1/Q2 (and Q4/Q5) body diodes in series as a near-short. Verify supply polarity with a meter before every first connection.
- The bench supply's current limit is the only fuse this board has. Use a supply with a real, fast CC limit; a large lab supply in CV mode with a 10 A limit will destroy the bridge before you can react.
- This is an educational lab module. It is not designed, reviewed, or intended for anything safety-relevant, unattended, or load-bearing.
3. Topology and control review#
3.1 Low-side path (fast, direct)#
LSx drives the AO3400A gate directly through 100 Ω (R2/R8). The AO3400A is a logic-level FET: worst-case RDS(on) is 48 mΩ at VGS = 2.5 V and 32 mΩ at 4.5 V, so 3.3 V drive lands between those, comfortably enhanced. Gate RC is roughly 100 Ω x 630 pF Ciss ≈ 63 ns, so the low-side switches in the sub-microsecond range. LSx = 1 → low side ON.
3.2 High-side path (slow, two-stage)#
A 3.3 V pin cannot swing a P-FET gate referenced to VM, so HSx (through 100 Ω, R1/R7) drives a small AO3400A inverter (Q3/Q6). The inverter's drain pulls the AO3401A gate down through a 10 kΩ series resistor (R4/R10) against a 10 kΩ pull-up to VM (R3/R9):
- Inverter OFF → gate = VM → VSG = 0 → high side OFF (default).
- Inverter ON → the 10k/10k divider parks the gate at VM/2 → VSG = VM/2 → high side ON. The inversion is cancelled: HSx = 1 → high side ON.
Gate-rating math: VSG = VM/2 is 6 V at VM = 12 V (inside the AO3401A ±12 V absolute maximum with 2x margin) and 2.5 V at VM = 5 V, exactly the AO3401A's specified enhancement point (RDS(on) is rated at VGS = −2.5 V, < 85 mΩ). Below 5 V the high side barely enhances; above 12 V the divider erodes the gate-rating margin. VM range is therefore 5–12 V, hard.
3.3 The timing asymmetry — read this before choosing a dead time#
The low-side gate sees ~100 Ω; the high-side gate sees 10 kΩ networks. Using datasheet Ciss values as first-order estimates (Miller charge makes reality slower, not faster):
- High-side turn-on (gate discharged toward VM/2 through R4 with R3 fighting): Thevenin ≈ 5 kΩ into ≈ 645 pF → τ ≈ 3.2 µs, plus the inverter stage delay.
- High-side turn-off (gate recharged to VM through R3 alone, R4 path open): τ ≈ 10 kΩ x 645 pF ≈ 6.5 µs. The channel only stops conducting once VSG falls below VGS(th) (as low as 0.5 V), i.e. the gate must climb to within ~0.5 V of VM — several time constants. Expect high-side turn-off to take on the order of 15–30 µs. This estimate must be replaced by a measurement (section 4.4).
Consequences: the datasheet nanosecond switching times (measured at RGEN = 3 Ω) do not apply to this board; dead time must cover the slow, asymmetric high-side edges (the dangerous edge is high-side-off → low-side-on); and usable PWM frequency is low — plan on hundreds of Hz to a few kHz, not tens of kHz.
3.4 Idle and default states#
All four PMOD nets have 10 kΩ pull-downs (R5, R6, R11, R12). An unpowered, unconfigured, or tri-stated host therefore leaves the inverters off, the P-FET gates at VM, and the N-FET gates at GND: all four power FETs off. This is the module's only hardware safety feature and it protects only against inactive hosts — it does nothing against a host actively driving wrong levels.
3.5 Honest protection audit#
What exists: 10 k idle pull-downs; the VM/2 divider bounding VSG; 100 Ω gate resistors (ringing damping and PMOD pin current limiting); FET body diodes for flyback; VM kept off the PMOD with grounds joined on the module.
What does NOT exist: dead-time hardware, cross-coupled or logic interlock of any kind, gate-driver IC, undervoltage lockout, fuse, current limit, current or fault sense, temperature sense, TVS or clamp beyond body diodes, reverse input protection, and dedicated flyback diodes. If HSx and LSx are both high, nothing on this board intervenes. That is the design.
4. SHOOT-THROUGH: the physics, the numbers, and the mandatory dead-time verification#
4.1 What shoot-through is#
Each half-bridge is a totem pole from VM to GND. If the high-side and low-side FET of the same leg conduct simultaneously — even for tens of nanoseconds while one is still turning off as the other turns on — the motor supply is short-circuited through the two channels. Nothing limits the current except the two RDS(on) values and the source impedance of VM (bench supply plus C1/C2/C3, which are sitting right at the bridge precisely to deliver current fast).
4.2 The numbers for this board#
At VM = 12 V with the high side at VSG = 6 V (RDS(on) ≈ 47–60 mΩ) and the low side at VGS = 3.3 V (≈ 24–48 mΩ), the cross-conduction path is roughly 70–110 mΩ. Ignoring supply impedance, the prospective current is 12 V / ~0.09 Ω ≈ 130 A — the local ceramic capacitors alone will source a large fraction of that for the first microseconds. Compare the datasheet limits: AO3400A IDM = 30 A pulsed, AO3401A IDM = −27 A pulsed, both in SOT-23 packages rated 1.4 W.
Energy scale: a single 50 ns overlap at ~100 A and 12 V dissipates on the order of E ≈ V x I x t ≈ 60 µJ per edge, split between two dies. That sounds small, but at a 20 kHz PWM rate with overlap on both edges it is 2 x 20,000 x 60 µJ ≈ 2.4 W of continuous extra dissipation — above the 1.4 W absolute package rating before the motor draws a single milliamp. The FETs heat, RDS(on) rises roughly 1.6x by 125 °C (datasheet Fig. 4), VGS(th) falls with temperature, switching slows, overlap widens, and the failure runs away. Escalation with VM is quadratic: power in the short scales as VM²/R.
A static logic bug — both gates simply held high, the classic FPGA mistake at reset, during configuration, or in an unreached-state default — shorts VM continuously. At 130 A prospective (or even at a 5 A bench-supply limit sustained into 0.09 Ω once the caps are drained) the SOT-23s exceed their pulsed and thermal ratings within microseconds to milliseconds: instant, unrecoverable destruction, sometimes with package rupture. This board deliberately exposes raw gates to the FPGA; there is no hardware interlock of any kind (section 3.5). The only thing standing between a bitstream and a fireball is your deadtime_gen and its testbench.
4.3 Why the body diodes make dead time visible (and necessary)#
During correct dead time, the motor's inductive current cannot stop; it freewheels through a FET body diode (VSD ≈ 0.7 V typical, 1.0 V max, 2 A continuous diode rating on both parts). On a scope you will see OUTx fly one diode drop above VM or below GND during the gap. That step is the signature of healthy dead time — and also why dead time should be shortened (never eliminated) once measured: diode conduction dissipates ~0.7 V x I instead of RDS(on) x I², and the AO3401A body diode Qrr of 3.5 nC is recovered as a small extra current spike at every transition.
4.4 MANDATORY dead-time verification procedure (before VM ever carries real current)#
Do this before the motor supply is connected at full capability. Two acceptable VM configurations for this test:
- VM disconnected entirely. Gate waveforms of the low side and inverter are observable; high-side gate is not meaningful without VM.
- VM fed through a series resistor (e.g. 1 kΩ from a 5 V supply, or the bench supply at 5 V / 100 mA limit). This energizes the 10 k pull-ups so high-side gate waveforms are real, while limiting any overlap fault to harmless current.
Procedure, per leg (leg 1 = Q1/Q2, leg 2 = Q4/Q5):
- Load the testbench-proven bitstream (section 5). Configure complementary PWM on HSx/LSx with the designed dead time.
- Scope both gates of the same leg simultaneously: channel A on HGx (the AO3401A gate, referenced to VM — use math VM−HGx or a differential probe to display VSG), channel B on LGx (the AO3400A gate to GND). Ground-referenced probing of HGx is acceptable here because VM is current-limited.
- Trigger on each PWM edge in turn and measure the non-overlap gap at both edges: from VSG falling below 0.5 V (AO3401A VGS(th) minimum) to LGx rising past 0.65 V (AO3400A VGS(th) minimum), and the mirror-image gap on the other edge. Use the thresholds, not the 50% points — the high-side edges are slow ramps, not steps.
- Sweep duty cycle across the full commanded range, including 0%, 100%, and abrupt duty/direction changes, and confirm non-overlap never collapses. Repeat for both legs. Repeat at VM(test) corresponding to 5 V and 12 V if the resistor-fed method allows, because the VM/2 gate swing and thus effective thresholds change with VM.
- Record the worst-case measured gap and the measured high-side turn-off time in the bench record (section 11).
Acceptance: the measured non-overlap gap at every edge, every duty, both legs, must be at least 2x the measured high-side turn-off time (the slowest transition in the system, estimated ~15–30 µs in section 3.3, but the measurement rules). Given the estimates, a first-pass dead-time setting of 50–100 µs is the sensible starting point; shorten it later, with the scope watching, once real numbers are in hand. The datasheet ns-class switching times must not be used to justify short dead times — they were measured with a 3 Ω generator, three orders of magnitude stiffer than this board's 10 k high-side network.
Never connect an unlimited motor supply until this procedure has passed and is recorded.
5. FABRIC-TESTBENCH-FIRST RULE (hard precondition)#
No bitstream may drive this board until the gate-drive HDL has passed a self-checking testbench demonstrating, at minimum:
- No-overlap invariant: under any input sequence (random stimulus plus directed corner cases), HSx and LSx of the same leg are never asserted simultaneously, including for a single clock cycle.
- Dead-time counter: every HSx↔LSx handover inserts at least the programmed dead time, and the programmed value covers the asymmetric high-side timing with the section 4.4 margin.
- All-off default: all four outputs are deasserted at reset, from power-up/configuration until explicitly enabled, and on any estop or illegal-state condition; unreached FSM states trap to all-off.
- Glitch-free duty/direction changes: mid-period command changes never bypass the dead-time state machine.
The testbench must fail loudly (assertion, non-zero exit) on violation. Also verify the FPGA constraint file: the four PMOD pins must not have pull-ups enabled, must be driven (not tri-stated) once configured, and the configuration-time state of the chosen pins must be checked against the FPGA family's documentation. This rule exists because section 4.2 shows a single bad state is destruction, not degradation. deadtime_gen and this testbench are listed as a release gate in the README and do not exist yet — that alone blocks all powered testing.
6. Component-by-component review#
Every reference designator in the design is covered below. #FLG01–#FLG03 are ERC power-flag symbols only; they place no physical part.
6.1 Power FETs#
| Ref. | Part / datasheet summary | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| Q1 | AO3401A, −30 V, −4 A P-FET, SOT-23 | Channel 1 high-side switch; source at VM, drain at OUT1; body diode is OUT1's flyback path above VM | Leg 1 can only pull OUT1 low; forward drive of the motor in that polarity is lost; flyback above VM lost | D–S short ties OUT1 to VM permanently → any LS1 assertion is a dead short; wrong orientation misplaces the body diode and gate |
| Q2 | AO3400A, 30 V, 5.7 A N-FET, SOT-23 | Channel 1 low-side switch; body diode is OUT1's flyback path below GND | Leg 1 cannot pull OUT1 low; flyback below GND lost | D–S short ties OUT1 to GND → any HS1 assertion is a dead short |
| Q3 | AO3400A (same part) | Channel 1 high-side level inverter: drain = HG1_PD pulls the Q1 gate low via R4; cancels inversion so HS1 = 1 → high side ON | High side 1 permanently off (gate parked at VM by R3) | D–S short holds Q1 permanently ON via the divider → LS1 assertion is a dead short; G–S short = high side 1 permanently off |
| Q4 | AO3401A | Channel 2 high-side switch (mirror of Q1) | As Q1, leg 2 | As Q1, leg 2 |
| Q5 | AO3400A | Channel 2 low-side switch (mirror of Q2) | As Q2, leg 2 | As Q2, leg 2 |
| Q6 | AO3400A | Channel 2 level inverter (mirror of Q3) | As Q3, leg 2 | As Q3, leg 2 |
Note the pattern: every single-FET short converts one PMOD signal into a shoot-through trigger. This is why the unpowered resistance checks in section 9.A are done before anything else, every session.
6.2 Gate network resistors (channel 1 / channel 2)#
| Ref. | Value | Function | If absent/open | If shorted or wrong value |
|---|---|---|---|---|
| R1 / R7 | 100 Ω (Yageo RC0603FR-07100RL) | HSx → inverter (Q3/Q6) gate: damps ringing, limits PMOD pin current | High side of that channel uncontrollable (inverter gate floats near GND via R5/R11 → high side off) | Short: loses damping, PMOD pin sees the raw gate; large value: slows the inverter and widens the high-side asymmetry |
| R2 / R8 | 100 Ω (RC0603FR-07100RL) | LSx → low-side (Q2/Q5) gate directly: damping + pin protection | Low side of that channel off (gate held by R6/R12 through... open — gate floats: dangerous, Miller coupling can half-turn-on Q2/Q5) | Short: raw pin drive, ringing; large value: slows the fast edge the dead-time budget assumed |
| R3 / R9 | 10 kΩ (RC0603FR-0710KL) | HGx pull-up to VM: high side OFF by default; sole turn-off charge path | Q1/Q4 gate floats — high side state undefined, can drift on, shoot-through hazard. Absolutely mandatory part | Short: gate hard-tied to VM, high side stuck off (safe direction, but dead); wrong (small) value shifts the divider and raises VSG above VM/2, eroding the ±12 V gate margin |
| R4 / R10 | 10 kΩ (RC0603FR-0710KL) | Series half of the divider: with R3/R9 parks the gate at VM/2, keeping VSG ≤ 6 V at VM = 12 V (inside the ±12 V rating) | High side never turns on (gate stays at VM) | Short: inverter-on slams the gate to ~0 V → VSG = VM = 12 V, at the AO3401A absolute-maximum gate rating with zero margin — reject the board until fixed |
| R5 / R11 | 10 kΩ (RC0603FR-0710KL) | HSx idle pull-down: unpowered/tri-stated host → inverter off → high side off | HSx floats when host inactive; charge or leakage can enable a high side with no host in control | Short: HSx grounded, high side of that channel never operates (safe direction, but dead) |
| R6 / R12 | 10 kΩ (RC0603FR-0710KL) | LSx idle pull-down: unpowered host → low side off | LSx floats when host inactive; a drifting low-side gate plus an active high side is shoot-through | Short: LSx grounded, low side dead (safe direction) |
6.3 Decoupling#
| Ref. | Value / part | Function | If absent/open | If shorted or wrong |
|---|---|---|---|---|
| C1, C2 | 10 µF 25 V X5R 0805 (Murata GRM21BR61E106KA73L) | VM bulk reservoir for bridge switching current; keeps commutation current loops local | VM sags/rings at every commutation; long supply leads become the switching loop; gate divider (referenced to VM) bounces | Short: VM–GND short (supply limit trips); 25 V rating leaves margin at 12 V but X5R derating means effective C is well below 10 µF at 12 V — acceptable, but note it |
| C3 | 100 nF 50 V X7R 0603 (Murata GRM188R71H104KA93D) | High-frequency decoupling right at the bridge | HF ringing on VM edges, worse EMI, gate-divider noise | Short: VM–GND short |
These capacitors are also what makes shoot-through instantly destructive: they are low-ESR ceramics placed to deliver current fast, and they do not care whether the load is a motor or a fault.
6.4 Connectors#
| Ref. | Part | Function | Review points |
|---|---|---|---|
| J1 | PMOD plug, Type 1 GPIO | 1 HS1, 2 LS1, 3 HS2, 4 LS2, 5 GND, 6 3V3, 7–10 NC, 11 GND, 12 3V3. All host-driven, all active-high | A one-pin misalignment on the PMOD swaps gate signals — buzz out pin 1 to the host before first configuration. 3V3 powers nothing on this module (no ICs); grounds join here |
| J2 | Phoenix MKDS 1,5/2-5,08 screw terminal (MPN listed TBD in the generator — confirm before ordering) | Motor supply input: 1 VM (5–12 V), 2 GND. Never power via PMOD | No reverse protection. Torque the screws; a loose VM wire under motor current arcs and spikes. Verify polarity with a meter before every first connection |
| J3 | Phoenix MKDS 1,5/2-5,08 screw terminal (MPN TBD) | Bridge output: 1 OUT1, 2 OUT2 | Motor leads only; never hot-plug (section 8). Swapping the two leads only reverses direction — the one harmless miswire on this board |
7. Datasheet summary and design interpretation#
Sources (fetched 2026-07; check the latest revision before procurement):
- AO3400A datasheet (Alpha & Omega Semiconductor, Rev 3.1 July 2023): <https://aosmd.com/res/data_sheets/AO3400A.pdf>
- AO3401A datasheet (Alpha & Omega Semiconductor, Rev 3.1 December 2023): <https://aosmd.com/res/data_sheets/AO3401A.pdf>
| Parameter | AO3400A (N, low side + inverters) | AO3401A (P, high side) | Board interpretation |
|---|---|---|---|
| VDS max | 30 V | −30 V | 2.5x margin at VM = 12 V; inductive spikes ride on body diodes, but ringing must be scoped |
| VGS abs max | ±12 V | ±12 V | The VM/2 divider exists exactly for this: VSG = 6 V at VM = 12 V. A shorted R4/R10 puts the P-FET at its limit |
| VGS(th) | 0.65 / 1.05 / 1.45 V (min/typ/max) | −0.5 / −0.9 / −1.3 V | Dead-time measurement thresholds (section 4.4). The 0.5 V P-FET minimum is why "gate near VM" is not "off" |
| RDS(on) | < 26.5 mΩ @ 10 V; < 32 mΩ @ 4.5 V; < 48 mΩ @ 2.5 V (typ 24) | < 50 mΩ @ −10 V; < 60 mΩ @ −4.5 V; < 85 mΩ @ −2.5 V (typ 60) | At 3.3 V / VM-2 drive expect ~25–48 mΩ (N) and ~47–85 mΩ (P); sets conduction loss and the ~130 A shoot-through prospective |
| ID continuous (25 °C) | 5.7 A | −4.0 A | Bridge continuous rating is the P-FET's 4 A — before thermal reality on a 2-layer board; derate hard |
| IDM pulsed | 30 A | −27 A | Any shoot-through exceeds this; motor stall must stay far below it |
| PD / RθJA | 1.4 W; RθJA 70–90 °C/W (t ≤ 10 s), 100–125 °C/W steady-state on 1 in² 2 oz FR-4 | same | At 2 A motor current: P-FET ~0.24 W → ~+30 °C rise; fine. At 4 A: ~0.96 W → junction climbs toward the limit. SOA is a single-pulse curve (datasheet note F, Fig. on later pages) — it does not bless repetitive overlap events; check the SOA figure directly before any high-current plan |
| Qg total | 6 nC typ (VGS = 4.5 V) | 14 nC (−10 V), 7 nC (−4.5 V); Qgs 1.5 nC, Qgd 2.5 nC | Small charges, but through 10 kΩ they still mean microseconds (section 3.3) |
| Switching (RGEN = 3 Ω) | td(on) 3 ns, tr 2.5 ns, td(off) 25 ns, tf 4 ns | td(on) 6.5 ns, tr 3.5 ns, td(off) 41 ns, tf 9 ns | Not applicable to this board's 10 k gate network — cited only to show how misleading they'd be for dead-time sizing |
| Ciss | 630 pF | 645 pF | With 10 k networks: τ ≈ 3.2–6.5 µs high side (section 3.3) |
| Body diode | VSD 0.7 typ / 1.0 max V; IS 2 A cont.; trr 8.5 ns, Qrr 2.6 nC | −0.7 / −1.0 V; −2 A; trr 11 ns, Qrr 3.5 nC | Flyback path is 2 A continuous per diode — another reason motor current stays ≤ 2 A until measured; expect ~0.7 V steps on OUTx during dead time |
Values not extracted here (SOA curve coordinates, transient thermal impedance curves) must be checked against the datasheet pages directly before any test that depends on them.
8. Actuator-specific safety (mandatory)#
- Current-limited first power, always. The bench supply limit is the board's only fuse. Section 9 gives the ladder: 100 mA → 500 mA → 1 A → 2 A, each step gated on clean captured waveforms.
- Know your stall current before connecting a motor. A stalled or shorted-rotor DC motor draws VM divided by winding resistance. Typical estimates (verify for the actual motor by measuring winding resistance cold): N20-class gearmotors ~0.36–1.6 A stall depending on winding and voltage; JGA25-class up to ~4 A. A 4 A stall equals the AO3401A's entire 25 °C continuous rating and doubles the body-diode rating — a JGA25 at 12 V on this board must be treated as an overload experiment, not a drive application. Set the supply current limit at or below the intended test current, always below stall.
- Flyback / inductive-kick verification. There are no clamp diodes; body diodes are it. On first motor tests, scope OUT1/OUT2 and VM: confirm the dead-time diode drops (~0.7 V beyond the rails), confirm OUTx never rings past ±30 V (VDS rating), and confirm VM does not pump up when braking or reversing (a supply that cannot sink current lets regenerated energy charge C1/C2 upward — watch VM at every direction change).
- Never hot-plug motor leads. Breaking an inductive circuit at a screw terminal makes an arc and an unclamped voltage spike. Power down VM, wait for the supply to read zero, then touch J2/J3.
- Rail sequencing. Logic 3.3 V and a configured, testbench-proven bitstream first; VM second. Shutdown in reverse: VM to zero, then logic. Never leave VM applied while reconfiguring the FPGA — configuration-time pin states are the host's problem and the pull-downs are the only guard.
- Hands clear for first spin. First motor rotation happens with hands away and the supply's output switch as the kill point.
- Secure the motor body before it can spin (a gearmotor on a bench walks, twists its leads, and shorts them).
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record everything in the section 11 template. Prerequisites for anything past step B: section 5 testbench proof recorded; section 4.4 dead-time plan ready.
Bench contexts#
- (a) PMOD host FPGA board: the normal case. The host provides 3.3 V and drives the four gates. VM comes from a separate current-limited supply; grounds join on the module via the PMOD.
- (b) Standalone (no FPGA): 3.3 V bench supply to PMOD 3V3/GND is pointless by itself (nothing on the module consumes 3.3 V); what standalone testing really means is stimulating HSx/LSx with a signal generator. Warning: a generator gives you no interlock either, and it is easier, not harder, to create overlap with two free-running channels or a mis-set complementary output than with proven HDL. If you stimulate standalone: drive only ONE gate signal at a time with the other three grounded, or use a two-channel generator with hardware-verified complementary + dead-time mode, keep VM resistor-fed or ≤ 100 mA limited throughout, and never attach a motor under generator stimulus. Ground the generator to module GND at one point.
A. Unpowered inspection and resistance tests (every session, before anything)#
- Nothing connected. Inspect under magnification: Q1–Q6 orientation (SOT-23 pin 1), no solder bridges on the FET pads, resistor values against section 6.2, C1–C3 present, screw terminals tight.
- Diode-mode meter, both polarities, record values:
- VM to GND: must not be a short. Expect one body-diode drop (~0.5–0.7 V) in one polarity through Q1+Q2 / Q4+Q5 series pairs and high resistance in the other.
- OUT1 to VM, OUT1 to GND, OUT2 to VM, OUT2 to GND: one diode drop in the body-diode direction, open the other way. A hard short in any of these is a failed FET or a solder bridge — do not power; find it.
- Ohmmeter: HS1, LS1, HS2, LS2 each to GND ≈ 10 kΩ (pull-downs present). HG1/HG2 to VM ≈ 10 kΩ. Anything wildly off means a wrong or open resistor in the gate network — the most safety-critical passives on the board.
- PMOD pinout buzz-out from J1 pin 1 through to the host connector.
B. Logic-only functional test (VM absent or resistor-fed)#
- Context (a): host powered, testbench-proven bitstream loaded, VM disconnected. Scope HS1/LS1/HS2/LS2 at the PMOD: clean 3.3 V levels, correct complementary pattern, dead-time gaps visible, all-off at reset and on estop input.
- Feed VM through 1 kΩ from 5 V (or 5 V at 100 mA limit). Verify HG1/HG2 sit at VM when the high side is commanded off and at ~VM/2 when commanded on. Verify IG1/IG2 (inverter gates) follow HSx.
- Run the full section 4.4 dead-time verification now. Record the worst-case gaps and the measured high-side turn-off time. Do not proceed until the 2x acceptance margin holds everywhere.
C. First power ladder, no motor#
- VM = 5.0 V, supply current limit 100 mA, J3 empty. Idle (all-off): input current should be ≈ VM leakage only, well under 1 mA (the 10 k pull-ups carry no DC when the inverters are off). More than a few mA at idle is a fault — stop.
- Run complementary PWM at low frequency (≤ 1 kHz). Supply current should stay in the low-mA range (gate divider draws VM/20k ≈ 0.25 mA per active high side, plus switching charge). Scope OUT1/OUT2: clean rail-to-rail swings.
- Watch for the shoot-through signature: current-limit LED flicker or supply current spikes synchronized to PWM edges. Any sign → stop, re-measure dead time.
- Raise VM to 12.0 V, limit still 100 mA. Repeat 1–3. Verify VSG ≈ 6 V on an active high side (differential or VM-referenced measurement).
- Only after clean captures at both voltages: raise the limit to 500 mA and re-run. Nothing should change — there is no load yet.
D. Resistive load#
- VM = 5 V, limit 500 mA. Power a ~22 Ω / 5 W resistor across J3. Verify OUT1−OUT2 waveform polarity matches the commanded direction table (HS1+LS2 = OUT1 positive; HS2+LS1 = negative).
- Step VM to 12 V, limit 1 A, load sized for ≤ 1 A. Capture OUTx edges; confirm no ringing beyond ±30 V absolute on any FET drain.
- Measure FET package temperatures after 10 minutes. Compare with the RθJA-based estimate for the measured current.
E. First motor test (small motor first)#
- Motor: N20-class first, never JGA25-class for first spin. Measure its winding resistance; compute stall current; set the supply limit below it and at or below 1 A.
- Motor secured, hands clear, safety glasses on. VM = 5 V. Command low duty (~20%). Observe rotation, listen, watch supply current.
- Scope OUT1/OUT2 during running PWM: confirm body-diode conduction steps during dead time, no rail excursions beyond one diode drop, VM stable (no pump-up) on start, stop, and direction reversal at low duty.
- Step through duty range, then direction reversals, then VM = 12 V with the limit raised only as far as the measured running current requires (≤ 2 A until a thermal soak has passed).
- Deliberate stall test (optional, instrumented): only with the supply limit set to a value the section 7 thermal math supports (≤ 2 A recommended), for seconds not minutes, with FET temperature watched.
- 30-minute soak at the intended operating point; record FET, terminal, and motor temperatures.
F. Not covered by this plan#
Repetitive-avalanche characterization, EMC, long-term reliability, JGA25 stall-level (4 A) operation, and any operation without the testbench gate remain out of scope. The module has no release claim until the README's release checklist (layout, DRC, fab outputs, HDL deliverable) is complete.
10. Expected values#
| Quantity | Design target / estimate | How to measure |
|---|---|---|
| Idle VM current (all gates low) | ≪ 1 mA (leakage only) | Bench supply readout, step C.1 |
| Per-channel divider current, high side on | VM/20 kΩ: 0.25 mA @ 5 V, 0.6 mA @ 12 V | Supply delta when commanding HSx |
| VSG of an ON high side | VM/2: 2.5 V @ 5 V, 6.0 V @ 12 V | VM−HGx, differential or math |
| Low-side gate rise/fall | ~0.1–0.3 µs (100 Ω x Ciss + margin) | Scope LGx |
| High-side turn-on (VSG 0 → plateau) | ~5–15 µs estimate (τ ≈ 3.2 µs + Miller) — measure | Scope HGx vs. VM |
| High-side turn-off to non-conduction | ~15–30 µs estimate (τ ≈ 6.5 µs, several τ + Miller) — measure | Scope VSG through 0.5 V threshold |
| Dead-time gap, every edge | ≥ 2x measured high-side turn-off; first pass 50–100 µs | Section 4.4, both gates simultaneously |
| PWM frequency | ≤ ~1 kHz initial; raise only per measured edges | Scope |
| OUTx during dead time | One VSD step (~0.7 V) beyond the rail toward freewheel direction | Scope OUTx |
| OUTx ringing | Never beyond ±30 V (VDS abs max); flag anything past ±20 V | Scope, single-shot on commutation |
| High-side drop at 1 A | ~47–85 mΩ x 1 A ≈ 50–85 mV (VSG-dependent) | DMM VM to OUTx, FET on, DC test |
| Low-side drop at 1 A | ~25–48 mΩ x 1 A ≈ 25–48 mV | DMM OUTx to GND |
| FET temperature rise at 2 A continuous | Rough estimate ~+25–45 °C (P ≈ I²R, RθJA 100–125 °C/W steady-state) — verify | IR camera / thermocouple, 30-min soak |
| N20 stall current | ~0.36–1.6 A typical estimate — measure winding R | DMM on the actual motor, cold |
| JGA25 stall current | Up to ~4 A typical estimate — out of scope for first tests | DMM on the actual motor |
11. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| Supply current-limits instantly at VM apply, gates idle | Unpowered diode checks of section 9.A | Shorted FET, solder bridge, reversed VM at J2, shorted C1–C3 |
| Supply current spikes at PWM edges | Dead-time gap per section 4.4; supply current probe vs. gate edges | Shoot-through: dead time too short for measured high-side turn-off; HDL overlap bug; wrong R3/R4 values |
| One high side never turns on | IGx follows HSx? HGx drops to VM/2? | R1/R7 open, Q3/Q6 dead or misoriented, R4/R10 open |
| One high side never turns OFF | HGx stuck below VM with HSx low | Q3/Q6 D–S short, R3/R9 open (floating gate), HSx stuck high from host |
| High side on but VSG wrong (not VM/2) | HGx voltage; R3/R4 values in-circuit | Wrong divider resistor, partially soldered joint |
| Low side never turns on | LGx level vs. LSx | R2/R8 open, Q2/Q5 dead, host pin misassigned |
| OUTx stuck at a rail regardless of commands | Diode checks on that FET pair | FET D–S short — remove VM immediately; that leg is one gate assertion away from shoot-through |
| Motor runs one direction only | Gate patterns on all four signals | Host pin swap at J1, one dead FET, HDL direction bug |
| VM rises above supply setting on reversal/braking | VM waveform on scope at direction change | Regeneration pumping C1/C2; supply cannot sink — add controlled ramp-down in HDL or a dump load; reduce reversal aggressiveness |
| Excessive OUTx ringing | Single-shot on commutation edge, probe grounded short | Long motor leads, missing/failed C3, layout loop (once laid out) |
| FETs hot at modest current | Individual FET drops at DC | Under-enhanced gate (low VM on high side), raised RDS(on) from prior overstress — a survived shoot-through often leaves degraded FETs; replace, do not trust |
| Board behaves after a known overlap event | Full 9.A resistance checks + RDS(on) drops | Assume FET damage until measurements prove otherwise |
12. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| Testbench evidence (repo commit, sim log path, pass output) | |
| Bitstream / HDL version, dead-time setting | |
| Bench context: (a) FPGA host ID or (b) generator model + mode | |
| Supply IDs, current-limit settings per step | |
| Scope/probes (diff probe for VSG?), calibration date | |
| Unpowered diode/resistance check results (9.A) | |
| Measured high-side turn-off time, per leg, per VM | |
| Measured worst-case dead-time gap, both edges, both legs (4.4) | |
| First-power idle current @ 5 V / 12 V | |
| No-load PWM captures (file paths) | |
| Resistive-load results, OUTx ringing extremes | |
| Motor type, measured winding R, computed stall current | |
| First-spin result, reversal/VM-pump observation | |
| Thermal soak temperatures | |
| Any overlap/current-limit event (treat as suspected FET damage) | |
| Deviations, photos, raw-file paths | |
| Reviewer / date / disposition |
13. Review conclusion#
The design is internally consistent and does what it claims: a minimal discrete H-bridge whose only safety features are passive defaults (10 k pull-downs, VM/2 gate divider) and whose active safety is delegated entirely to FPGA fabric. The gate-rating math checks out against the AO3401A datasheet (VSG = 6 V max at VM = 12 V against a ±12 V rating; 2.5 V at VM = 5 V matching the specified enhancement point), and the AO3400A is genuinely logic-level at 3.3 V. The 10 k high-side gate network makes switching slow and asymmetric by three to four orders of magnitude relative to the datasheet's 3 Ω test conditions — that is the pedagogical point, and it dictates dead times in the tens of microseconds and PWM in the low-kHz range, both of which must be established by measurement, not by this document's estimates.
The principal risks, in order: (1) any bitstream reaching the board without the not-yet-written self-checking deadtime_gen testbench — this is the single gate that prevents instant destruction; (2) dead time sized from datasheet nanosecond switching numbers instead of the measured slow high-side turn-off; (3) unlimited or high-limit supplies — the bench current limit is the only fuse; (4) motor stall current versus the 4 A / 2 A-body-diode / 1.4 W SOT-23 envelope, especially JGA25-class motors at 12 V; (5) no reverse protection at J2; (6) PCB layout does not exist yet — the bridge commutation loop, gate-network placement, and thermal copper will materially change every switching and thermal number above and this guide must be revisited after layout. Nothing in this document substitutes for the release checklist in the README.