You've already forked incutec-OpenESC-30x30
mirror of
https://github.com/incutec-hw/OpenESC-30x30.git
synced 2026-08-28 01:46:11 +00:00
Replaces the inline alternates note with a link, so the shared gate driver list is not restated in three board repos. Also drops the unqualified "drop-in successor" claim for XRS280N03C: it is 30 V VDSS and this board is rated to 8S, 33.6 V charged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
184 lines
10 KiB
Markdown
184 lines
10 KiB
Markdown
# OpenESC-30x30
|
|
|
|
Open source 4-in-1 BLDC ESC, 30.5 x 30.5 mm mounting pattern. Four fully
|
|
independent channels, each with its own MCU, gate driver and six MOSFETs: the
|
|
distributed-MCU AM32 topology, not a single shared MCU. Control is DShot over
|
|
the standard 8-pin connector.
|
|
|
|
## Repo
|
|
|
|
| | |
|
|
|---|---|
|
|
| Maintainer | @Just4Stan |
|
|
| Status | See the `status-*` topic on the repo. Never written here. |
|
|
| Designed in | KiCad 10 |
|
|
| KiCad project | `hardware/4in1.kicad_pro` |
|
|
| Root schematic | `hardware/4in1.kicad_sch` (power, current sense, connector) plus `hardware/ESC.kicad_sch`, one channel instantiated 4x |
|
|
| Board | `hardware/4in1.kicad_pcb`, 6 layers, 1.6 mm, 2 oz outer copper (the stackup field reads 1.69 mm; JLC ships 1.6) |
|
|
| Fixtures | [OpenDrone-Fixtures](https://github.com/OpenDrone-hw/OpenDrone-Fixtures): `OpenESC-30x30-QC/` press-contact QC fixture, `OpenESC-30x30-Flashing/` ST-LINK pogo-pin jig, both unrouted |
|
|
| Production panel | `hardware/4in1-panel.kicad_pcb`, carries this board **and** the OpenESC-20x20, not a panel of this board alone |
|
|
| Fab exports | `hardware/production/`, Fabrication Toolkit sets named by revision |
|
|
| Local library | `hardware/components.kicad_sym`, `hardware/4in1ESC-30x30.pretty/`, `hardware/4in1ESC-30x30.3dshapes/`. Frozen pre-consolidation libraries: use them, do not add to them |
|
|
| Shared library | [OpenDrone-hw/KiCad-Library](https://github.com/OpenDrone-hw/KiCad-Library), catalogue only; every library this board uses is local to the repo |
|
|
| Design rules | `hardware/4in1.kicad_dru` |
|
|
| Fab config | `hardware/fabrication-toolkit-options.json` |
|
|
| Board setup | Line standard: 6 layers, 0.09 mm clearance and track, via 0.35 on 0.20 drill |
|
|
| License | CERN-OHL-S-2.0 |
|
|
|
|
The project is named `4in1`, not after the repo. Renaming it would break the
|
|
fab archive names, the release assets and the website board art, so it stays.
|
|
|
|
## Rules
|
|
|
|
Identical in every OpenDrone board repo. Do not edit here; edit the template.
|
|
|
|
- **Never text-edit** `.kicad_sch`, `.kicad_pcb` or `.kicad_dru`. Use KiCad, or
|
|
kicad-skip / the pcbnew API for scripted changes. `.kicad_pro` is JSON and may
|
|
be edited directly for metadata.
|
|
- **Metadata yes, connections no.** An agent may write BOM and documentation
|
|
fields (MPN, Manufacturer, LCSC, Cost, Datasheet, text variables). An agent
|
|
may not change nets, wiring, routing, placement, footprint assignment, or any
|
|
value that changes the circuit.
|
|
- **Close KiCad before any write to a KiCad file.** KiCad caches library tables
|
|
at process start and overwrites files on save.
|
|
- **Reuse before you draw.** Check
|
|
[KiCad-Library](https://github.com/OpenDrone-hw/KiCad-Library) and its
|
|
`PARTS-USED.md` first. If the part is there we have already sourced,
|
|
footprinted and shipped it: copy the symbol and footprint into this repo's
|
|
`lib` library and use it. Draw a new part only when the library has nothing
|
|
that fits, and import it with `easyeda2kicad` from its LCSC number.
|
|
- **One person holds a board layout at a time.** KiCad files do not merge. Say
|
|
on Discord that you are taking it. See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
- **ERC and DRC clean before every pull request.** Commands below.
|
|
|
|
## Environment
|
|
|
|
```sh
|
|
# schematic and board checks
|
|
kicad-cli sch erc --exit-code-violations hardware/4in1.kicad_sch
|
|
kicad-cli pcb drc --schematic-parity --refill-zones --exit-code-violations hardware/4in1.kicad_pcb
|
|
|
|
# netlist, for scripted analysis
|
|
kicad-cli sch export netlist --format kicadsexpr -o /tmp/4in1.net hardware/4in1.kicad_sch
|
|
```
|
|
|
|
`--refill-zones` stops stale fills inventing clearance errors. Keep
|
|
`--schematic-parity` on, but read its output against Layout rules below: the
|
|
board-only bulk bank makes parity noisy, and a real error hides easily in it.
|
|
|
|
On macOS `kicad-cli` is at
|
|
`/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli`, and `pcbnew` imports
|
|
only under KiCad's bundled Python. Shared scripts (renders, STEP export,
|
|
packaging art) live in `OpenDrone-Scripts`.
|
|
|
|
## Architecture
|
|
|
|
Four independent channels share one power input and one connector. Per channel:
|
|
an **AT32F421G8U7** (Cortex-M4, QFN-28) drives an **NSG2065Q** three-phase
|
|
half-bridge gate driver, which drives six **SP40N01GHNK** MOSFETs, two per
|
|
phase. One channel is drawn once in `ESC.kicad_sch` and instantiated four times.
|
|
|
|
Current sensing is **board level, not per channel**: a single INA186A3IDCKR at
|
|
100 V/V sits across two 0.2 mOhm 2512 shunts in parallel, 0.1 mOhm total, in the
|
|
+BATT feed. That gives 10 mV/A and roughly 330 A full scale against a 3.3 V ADC,
|
|
reported as `/CURR`.
|
|
|
|
**Rev3.2 adds a matched input network at the amplifier**: 1 k in each sense
|
|
leg (R89/R90), 100 nF 50 V from each input to ground (C40/C41) and 1 uF
|
|
across the inputs (C42). Through rev3.1 the bare high-side connection put
|
|
both amplifier inputs on the switching bus, and the common-mode feedthrough
|
|
rectified to a duty-dependent offset: measured on the 20x20 sibling
|
|
2026-08-21 (identical topology), errors from +164% to -64% across the
|
|
throttle range, honest only at 100% where AM32 stops chopping. The network
|
|
attenuates the common-mode at the pins ~300x and the mismatch-converted
|
|
differential to 2.8 mVpp worst case (SPICE, 1% R / 10% C opposed); scale is
|
|
unchanged at 10 mV/A. Not yet verified on hardware: the acceptance test is
|
|
the ESC-04 mid-throttle i_a-versus-clamp sweep on a rev3.2 board. Evidence
|
|
for the rev3.1 fault: OpenESC-20x20 AGENTS.md and
|
|
`OpenDrone-Testing/Logs/esc-04-20x20-20260821T150430Z/`.
|
|
|
|
**There is no input protection.** The three clamp diodes (D1-D3) that earlier
|
|
revisions carried are gone: their 24 V standoff sits below the 33.6 V an 8S pack
|
|
reaches, so they were removing themselves. 2S-8S is qualified by bench and
|
|
flight testing, not by a clamp. The practical envelope is set by the MOSFET
|
|
(40 V VDSS), the buck (36 V rated, 45 V absolute maximum) and the current-sense
|
|
full scale.
|
|
|
|
## Key parts
|
|
|
|
| Function | Ref | Part | LCSC | Note |
|
|
|---|---|---|---|---|
|
|
| Motor MCU, x4 | U2, U5, U7, U9 | AT32F421G8U7, QFN-28 | C2765098 | One per channel |
|
|
| Gate driver, x4 | U4, U6, U8, U10 | NSG2065Q, QFN-24 | C41414478 | FD6288Q compatible, integrated bootstrap diodes. Second sources: [KiCad-Library ALTERNATES.md](https://github.com/OpenDrone-hw/KiCad-Library/blob/main/ALTERNATES.md), "Three-phase gate driver, QFN-24 4x4" |
|
|
| Power MOSFET, x24 | Q1-Q24 | SP40N01GHNK, PDFN-8L 5x6 | C22385416 | 6 per channel. Second sources, none fitted: [KiCad-Library ALTERNATES.md](https://github.com/OpenDrone-hw/KiCad-Library/blob/main/ALTERNATES.md), "Power MOSFET, DFN 5x6" |
|
|
| Current sense amp | U12 | INA186A3IDCKR, SC-70-6 | C2058245 | 100 V/V, board level high side |
|
|
| Current shunt, x2 parallel | Rsense1, Rsense2 | 0.2 mOhm 2512 | C695806 | 0.1 mOhm combined |
|
|
| Buck | U13 | LMR54406DBVR, SOT-23-6 | C5219316 | 1.1 MHz, 0.6 A; FB 115k/10k against 0.8 V for 10.0 V out |
|
|
| Buck inductor | U14 | FTC160808S4R7MBCA | C46594347 | 4.7 uH |
|
|
| LDO | U15 | TLV76733DRVR, WSON-6 | C2848334 | +10 V to +3V3 |
|
|
| Connector | J1 | SM08B-SRSS-TB, JST SH 8-pin | C160407 | Also broken out as solder pads (U3) |
|
|
| Bulk electrolytic, supplied | n/a | 470 uF | | Shipped with the board, not fitted to it. The user solders it across the battery terminals. Standard pairing of on-board ceramics with a pack-side elco; it dominates the bus capacitance once installed |
|
|
|
|
## Power
|
|
|
|
```
|
|
+BATT ─┬─► MOSFET drains, motor phases
|
|
├─► shunt pair ─► INA186A3 (U12) ─► /CURR
|
|
└─► LMR54406DBVR buck (U13) + 4.7uH (U14) ─► +10V ─┬─► gate drivers U4/U6/U8/U10
|
|
└─► TLV76733DRVR (U15) ─► +3V3 ─► 4x MCU, INA186
|
|
```
|
|
|
|
## Connectors and I/O
|
|
|
|
8-pin JST SM08B-SRSS-TB (J1). The same eight signals are broken out as solder
|
|
pads (U3). Connector ground returns on pads P1 and P2.
|
|
|
|
| Pin | Net | Function |
|
|
|---|---|---|
|
|
| 1 | +BATT | Battery positive |
|
|
| 2 | GND | Ground |
|
|
| 3 | /CURR | Current sense telemetry, INA186 output |
|
|
| 4 | unconnected | See below |
|
|
| 5 | /M1 | DShot, channel 1 |
|
|
| 6 | /M2 | DShot, channel 2 |
|
|
| 7 | /M3 | DShot, channel 3 |
|
|
| 8 | /M4 | DShot, channel 4 |
|
|
|
|
Pin 4 is the dedicated telemetry pin in the Betaflight 8-pin standard and is
|
|
intentionally left unconnected: ESC to FC telemetry rides the motor signal lines
|
|
over bidirectional extended DShot instead.
|
|
|
|
## Firmware
|
|
|
|
[AM32](https://github.com/am32-firmware/AM32), one independent target per
|
|
channel. Boards ship with the AM32 bootloader pre-loaded; firmware is flashed
|
|
and configured in-browser at [am32.ca](https://am32.ca). The AT32F421 plus
|
|
NSG2065Q per-channel topology is the standard AM32 hardware target for this
|
|
board class, so it works with Betaflight and any other DShot-capable flight
|
|
controller.
|
|
|
|
## Layout rules
|
|
|
|
Bulk decoupling on +BATT and GND exists on the PCB without matching schematic
|
|
symbols. That is a deliberate board-only bank, and it is why DRC parity reports
|
|
are noisy here. Do not run update-from-schematic without checking what it would
|
|
delete.
|
|
|
|
The board outline follows the scalloped pad edges of the solder-pad breakout
|
|
footprint (U3). The extent past the 30.5 mm mounting square is real outline
|
|
geometry, not scratch: do not tidy it away.
|
|
|
|
## Revisions
|
|
|
|
| Rev | Date | Change |
|
|
|---|---|---|
|
|
| Rev3.3 | 2026-08-25 | Export `OpenESC-30x30-rev3.3`, current. Silkscreen rebranded OpenDrone -> incutec (incl. back silk text); rev text pipeline-synced. Bulk bank moved from 52 x 10 uF (Samsung CL31B106KBHNNNE) to 52 x 4.7 uF 50 V X7R 1206 (CCTC TCC1206X7R475K500HT, C380366; was FH C29823 until 2026-08-26, swapped for LCSC retail price after the move off JLCPCB assembly). Via count 1702 (was 1453), 909 in-pad, after the final stitching pass. |
|
|
| Rev3.2 | 2026-08-22 | Export `OpenESC-30x30-rev3.2`. Matched input network at the current-sense amplifier (R89/R90 1k, C40/C41 100n 50V, C42 1u) against the high-side common-mode feedthrough measured on the 20x20 sibling. Scale unchanged, 10 mV/A. |
|
|
| Rev3.1 | 2026-08-14 | Export `30x30-Rev3.1`, current. Bulk bank: 52 x 10 uF 1206 on +BATT/GND, 49 of them PCB-only (only C2, C3, C6 are in the schematic; 24 added since rev3). Board setup on the line standard. |
|
|
| Rev3 | 2026-08-11 | Input clamp diodes D1-D3 removed, C2 and C3 doubled. |
|
|
| Rev1 | 2026-06-05 | Validated build. Fab sets `Rev1-30x30` and `Rev1-30x3020x20`, the latter combined with OpenESC-20x20. |
|
|
| V0.4 | 2026-05-29 | Combined export `V0.4-20x20-30x30`. |
|
|
| V0.3 | 2026-05-06 | Export `V0.3`; combined `V0.3-20x20-30x30` on 2026-05-12. |
|
|
| V0.2 | 2026-05-05 | Export `V0.2`. |
|
|
| V0.1 | 2026-03-18 | First production export. |
|