ShiboSoftwareDev/usb-pd-dc-motor-controller
USB‑PD–powered 2A brushed-DC motor controller combining dual USB‑C ports, ESP32‑C3 control, CH224K PD negotiation, DRV8876 H‑bridge drive, protection/filtering, status RGB LED, and motor output.
- Version
- 1.0.0
- License
- unset
- Stars
- 0
index.circuit.tsx
PCB
Schematic
import { AP2112K_3_3TRG1 } from "./imports/AP2112K_3_3TRG1"
import { CH224K } from "./imports/CH224K"
import { DRV8876PWPR } from "./imports/DRV8876PWPR"
import { ESP32_C3_WROOM_02_N4 } from "./imports/ESP32_C3_WROOM_02_N4"
import { LTST_C19HE1WT } from "./imports/LTST_C19HE1WT"
import { SKRPACE010 } from "./imports/SKRPACE010"
import { SMBJ16CAQ_13_F } from "./imports/SMBJ16CAQ_13_F"
import { SS54 } from "./imports/SS54"
import { TCJD107M025R0055E } from "./imports/TCJD107M025R0055E"
import { TYPE_C_16PIN_2MD_073_ } from "./imports/TYPE_C_16PIN_2MD_073_"
import { USBLC6_2SC6 } from "./imports/USBLC6_2SC6"
import { WJ500V_5_08_2P } from "./imports/WJ500V_5_08_2P"
const R = ({ jlcpcb, ...props }: any) => (
<resistor supplierPartNumbers={{ jlcpcb: [jlcpcb] }} {...props} />
)
const C = ({ jlcpcb, ...props }: any) => (
<capacitor supplierPartNumbers={{ jlcpcb: [jlcpcb] }} {...props} />
)
const MountingHole = ({ name, pcbX, pcbY }: any) => (
<chip
name={name}
pcbX={pcbX}
pcbY={pcbY}
pinLabels={{ pin1: ["GND"] }}
connections={{ pin1: "net.GND" }}
footprint={
<footprint>
<platedhole portHints={["pin1"]} shape="circle" holeDiameter="3.2mm" outerDiameter="5.6mm" />
</footprint>
}
/>
)
/**
* USB-PD brushed-DC controller.
* Reference architecture: Pololu Jrk G2 (USB-connected single brushed motor),
* implemented with TI DRV8876 and a native-USB ESP32-C3.
*/
export default function UsbPdDcMotorController() {
return (
<board width="82mm" height="55mm" layers={4} thickness="1.6mm" minViaHoleDiameter="0.3mm" minViaPadDiameter="0.55mm" autorouterVersion="beta_pipeline7" autorouterEffortLevel="2x">
<net name="GND" />
<net name="USB_5V" />
<net name="V3V3" />
<net name="USB_DM_CONN" />
<net name="USB_DP_CONN" />
<net name="USB_DM_ESD" />
<net name="USB_DP_ESD" />
<net name="PD_VBUS_RAW" />
<net name="PD_DP" />
<net name="PD_DM" />
<net name="PD_VDD" />
<net name="VMOTOR" />
<net name="PD_POWER_GOOD" />
<net name="MOTOR_ENABLE_PWM" />
<net name="MOTOR_DIRECTION" />
<net name="DRIVER_SLEEP" />
<net name="DRIVER_FAULT" />
<net name="MOTOR_CURRENT" />
<net name="VREF_2A" />
<net name="CP_HIGH" />
<TYPE_C_16PIN_2MD_073_ name="J_DATA" pcbX={-28} pcbY={-23.5} noConnect={["SBU1", "SBU2"]} connections={{ VBUS1: "net.USB_5V", VBUS2: "net.USB_5V", GND1: "net.GND", GND2: "net.GND", EH1: "net.GND", EH2: "net.GND", EH3: "net.GND", EH4: "net.GND", Dn1: "net.USB_DM_CONN", Dn2: "net.USB_DM_CONN", Dp1: "net.USB_DP_CONN", Dp2: "net.USB_DP_CONN" }} />
<R name="R_DATA_CC1" resistance="5.1k" footprint="0402" jlcpcb="C25905" pcbX={-29} pcbY={-18.5} connections={{ pin1: ".J_DATA > .CC1", pin2: "net.GND" }} />
<R name="R_DATA_CC2" resistance="5.1k" footprint="0402" jlcpcb="C25905" pcbX={-30} pcbY={-14.5} pcbRotation={180} connections={{ pin1: ".J_DATA > .CC2", pin2: "net.GND" }} />
<USBLC6_2SC6 name="U_USB_ESD" pcbX={-25} pcbY={-17.5} pcbRotation={90} connections={{ pin1: "net.USB_DM_CONN", pin6: "net.USB_DM_ESD", pin3: "net.USB_DP_CONN", pin4: "net.USB_DP_ESD", VBUS: "net.USB_5V", GND: "net.GND" }} />
<R name="R_USB_DM" resistance="22" footprint="0402" jlcpcb="C25092" pcbX={-22} pcbY={-15.8} connections={{ pin1: "net.USB_DM_ESD", pin2: ".U_MCU > .IO18" }} />
<R name="R_USB_DP" resistance="22" footprint="0402" jlcpcb="C25092" pcbX={-22} pcbY={-18.2} connections={{ pin1: "net.USB_DP_ESD", pin2: ".U_MCU > .IO19" }} />
<AP2112K_3_3TRG1 name="U_LDO" pcbX={-34} pcbY={-13} noConnect={["NC"]} connections={{ VIN: "net.USB_5V", EN: "net.USB_5V", VOUT: "net.V3V3", GND: "net.GND" }} />
<C name="C_LDO_IN" capacitance="1uF" footprint="0603" jlcpcb="C15849" pcbX={-38} pcbY={-10} connections={{ pin1: "net.USB_5V", pin2: "net.GND" }} />
<C name="C_LDO_OUT" capacitance="1uF" footprint="0603" jlcpcb="C15849" pcbX={-30} pcbY={-10} connections={{ pin1: "net.V3V3", pin2: "net.GND" }} />
<ESP32_C3_WROOM_02_N4 name="U_MCU" pcbX={-23} pcbY={7} connections={{ "3V3": "net.V3V3", GND: "net.GND", EP: "net.GND", IO1: "net.MOTOR_ENABLE_PWM", IO2: "net.MOTOR_DIRECTION", IO3: "net.DRIVER_FAULT", IO0: "net.MOTOR_CURRENT", IO7: "net.PD_POWER_GOOD", IO10: "net.DRIVER_SLEEP" }} />
<C name="C_MCU_100N" capacitance="100nF" footprint="0402" jlcpcb="C1525" pcbX={-11} pcbY={13} connections={{ pin1: "net.V3V3", pin2: "net.GND" }} />
<C name="C_MCU_10U" capacitance="10uF" footprint="0805" jlcpcb="C15850" pcbX={-11} pcbY={10} connections={{ pin1: "net.V3V3", pin2: "net.GND" }} />
<R name="R_EN" resistance="10k" footprint="0402" jlcpcb="C25744" pcbX={-37} pcbY={11} connections={{ pin1: "net.V3V3", pin2: ".U_MCU > .EN" }} />
<SKRPACE010 name="SW_RESET" pcbX={-38} pcbY={0} noConnect={["pin3", "pin4"]} connections={{ pin1: ".U_MCU > .EN", pin2: "net.GND" }} />
<R name="R_IO8_STRAP" resistance="10k" footprint="0402" jlcpcb="C25744" pcbX={-37} pcbY={7} connections={{ pin1: "net.V3V3", pin2: ".U_MCU > .IO8" }} />
<R name="R_IO9_STRAP" resistance="10k" footprint="0402" jlcpcb="C25744" pcbX={-37} pcbY={4} connections={{ pin1: "net.V3V3", pin2: ".U_MCU > .IO9" }} />
<SKRPACE010 name="SW_BOOT" pcbX={-38} pcbY={-6} noConnect={["pin3", "pin4"]} connections={{ pin1: ".U_MCU > .IO9", pin2: "net.GND" }} />
<TYPE_C_16PIN_2MD_073_ name="J_POWER" pcbX={-8} pcbY={-23.5} noConnect={["SBU1", "SBU2"]} connections={{ VBUS1: "net.PD_VBUS_RAW", VBUS2: "net.PD_VBUS_RAW", GND1: "net.GND", GND2: "net.GND", EH1: "net.GND", EH2: "net.GND", EH3: "net.GND", EH4: "net.GND", Dn1: "net.PD_DM", Dn2: "net.PD_DM", Dp1: "net.PD_DP", Dp2: "net.PD_DP" }} />
<CH224K name="U_PD" pcbX={-8} pcbY={-16} pcbRotation={90} noConnect={["CFG2", "CFG3"]} connections={{ DP: "net.PD_DP", DM: "net.PD_DM", CC1: ".J_POWER > .CC1", CC2: ".J_POWER > .CC2", VDD: "net.PD_VDD", GND: "net.GND", PG: "net.PD_POWER_GOOD" }} />
<R name="R_PD_VDD" resistance="1k" footprint="1206" jlcpcb="C844867" manufacturerPartNumber="CRCW12061K00FKEAHP" pcbX={-15} pcbY={-13} pcbRotation={180} connections={{ pin1: "net.PD_VBUS_RAW", pin2: "net.PD_VDD" }} />
<C name="C_PD_VDD" capacitance="1uF" footprint="0603" jlcpcb="C15849" pcbX={-14.5} pcbY={-9.5} connections={{ pin1: "net.PD_VDD", pin2: "net.GND" }} />
<R name="R_PD_VBUS" resistance="10k" footprint="0603" jlcpcb="C2906982" pcbX={-1} pcbY={-13} pcbRotation={180} connections={{ pin1: "net.PD_VBUS_RAW", pin2: ".U_PD > .VBUS" }} />
<R name="R_PD_CFG1" resistance="56k" footprint="0603" jlcpcb="C23206" pcbX={-4} pcbY={-10.5} connections={{ pin1: ".U_PD > .CFG1", pin2: "net.GND" }} />
<R name="R_PD_PG" resistance="10k" footprint="0402" jlcpcb="C25744" pcbX={-1} pcbY={-9.5} connections={{ pin1: "net.V3V3", pin2: "net.PD_POWER_GOOD" }} />
<fuse name="F1" currentRating="2A" voltageRating="30V" footprint="1812" supplierPartNumbers={{ jlcpcb: ["C960026"] }} manufacturerPartNumber="BSMD1812-200-30V" pcbX={2} pcbY={-18} connections={{ pin1: "net.PD_VBUS_RAW" }} />
<SS54 name="D_REVERSE" pcbX={9.5} pcbY={-18} pcbRotation={180} connections={{ anode: ".F1 > .pin2", cathode: "net.VMOTOR" }} />
<TCJD107M025R0055E name="C_MOTOR_BULK" pcbX={15} pcbY={-18} pcbRotation={90} connections={{ pin1: "net.VMOTOR", pin2: "net.GND" }} />
<C name="C_VM_10U_A" capacitance="10uF" footprint="0805" jlcpcb="C15850" pcbX={21} pcbY={-17} connections={{ pin1: "net.VMOTOR", pin2: "net.GND" }} />
<C name="C_VM_10U_B" capacitance="10uF" footprint="0805" jlcpcb="C15850" pcbX={25} pcbY={-17} connections={{ pin1: "net.VMOTOR", pin2: "net.GND" }} />
<SMBJ16CAQ_13_F name="D_TVS" pcbX={17} pcbY={-12} pcbRotation={180} connections={{ pin1: "net.VMOTOR", pin2: "net.GND" }} />
<DRV8876PWPR name="U_DRIVER" pcbX={15} pcbY={2} connections={{ pin1: "net.MOTOR_ENABLE_PWM", pin2: "net.MOTOR_DIRECTION", nSLEEP: "net.DRIVER_SLEEP", nFAULT: "net.DRIVER_FAULT", VREF: "net.VREF_2A", IPROPI: "net.MOTOR_CURRENT", IMODE: "net.GND", OUT1: ".J_MOTOR > .pin1", OUT2: ".J_MOTOR > .pin2", VM: "net.VMOTOR", VCP: "net.CP_HIGH", CPH: ".C_CP_FLY > .pin1", CPL: ".C_CP_FLY > .pin2", PGND: "net.GND", GND: "net.GND", EP: "net.GND" }} />
<C name="C_DRIVER_VM" capacitance="100nF" footprint="0603" jlcpcb="C14663" pcbX={9} pcbY={-4.5} connections={{ pin1: "net.VMOTOR", pin2: "net.GND" }} />
<C name="C_CP_VCP" capacitance="100nF" footprint="0603" jlcpcb="C14663" pcbX={21} pcbY={-4.5} connections={{ pin1: "net.CP_HIGH", pin2: "net.VMOTOR" }} />
<C name="C_CP_FLY" capacitance="22nF" footprint="0603" jlcpcb="C21122" pcbX={20} pcbY={2} />
<R name="R_SLEEP_PD" resistance="100k" footprint="0402" jlcpcb="C25741" pcbX={8} pcbY={6} connections={{ pin1: "net.DRIVER_SLEEP", pin2: "net.GND" }} />
<R name="R_FAULT_PU" resistance="10k" footprint="0402" jlcpcb="C25744" pcbX={8} pcbY={9} connections={{ pin1: "net.V3V3", pin2: "net.DRIVER_FAULT" }} />
<R name="R_IPROPI" resistance="1.5k" footprint="0402" jlcpcb="C25867" pcbX={11} pcbY={11} pcbRotation={180} connections={{ pin1: "net.MOTOR_CURRENT", pin2: "net.GND" }} />
<R name="R_VREF_TOP" resistance="1k" footprint="0402" jlcpcb="C11702" pcbX={15} pcbY={11} connections={{ pin1: "net.V3V3", pin2: "net.VREF_2A" }} />
<R name="R_VREF_BOTTOM" resistance="10k" footprint="0402" jlcpcb="C25744" pcbX={18} pcbY={11} connections={{ pin1: "net.VREF_2A", pin2: "net.GND" }} />
<WJ500V_5_08_2P name="J_MOTOR" pcbX={35.5} pcbY={2} pcbRotation={90} />
<LTST_C19HE1WT name="LED_STATUS" pcbX={-2} pcbY={8} connections={{ _POS: "net.V3V3" }} />
<R name="R_LED_R" resistance="1k" footprint="0402" jlcpcb="C11702" pcbX={1} pcbY={10} connections={{ pin1: ".LED_STATUS > .R_NEG", pin2: ".U_MCU > .IO4" }} />
<R name="R_LED_G" resistance="1k" footprint="0402" jlcpcb="C11702" pcbX={1} pcbY={8} connections={{ pin1: ".LED_STATUS > .G_NEG", pin2: ".U_MCU > .IO5" }} />
<R name="R_LED_B" resistance="1k" footprint="0402" jlcpcb="C11702" pcbX={1} pcbY={6} connections={{ pin1: ".LED_STATUS > .B_NEG", pin2: ".U_MCU > .IO6" }} />
<trace from=".J_POWER > .VBUS1" to=".F1 > .pin1" thickness="1mm" />
<trace from=".F1 > .pin2" to=".D_REVERSE > .anode" thickness="1mm" />
<trace from=".D_REVERSE > .cathode" to="net.VMOTOR" thickness="1mm" />
<trace from=".U_DRIVER > .OUT1" to=".J_MOTOR > .pin1" thickness="1mm" />
<trace from=".U_DRIVER > .OUT2" to=".J_MOTOR > .pin2" thickness="1mm" />
<trace name="DRV_PMODE_GND" from=".U_DRIVER > .PMODE" to=".U_DRIVER > .GND" thickness="0.2mm" />
<MountingHole name="MH1" pcbX={-36.5} pcbY={22} />
<MountingHole name="MH2" pcbX={36.5} pcbY={22} />
<MountingHole name="MH3" pcbX={-36.5} pcbY={-18.5} />
<MountingHole name="MH4" pcbX={36.5} pcbY={-18.5} />
<silkscreentext text="USB DATA" pcbX={-28} pcbY={-21.2} fontSize="1.2mm" />
<silkscreentext text="15V USB-PD" pcbX={-8} pcbY={-21.2} fontSize="1.2mm" />
<silkscreentext text="MOTOR" pcbX={34} pcbY={8} fontSize="1.2mm" />
<silkscreentext text="2A USB-PD DC MOTOR CONTROLLER" pcbX={9} pcbY={23} fontSize="1.2mm" />
<silkscreentext text="DRV8876 / ESP32-C3" pcbX={13} pcbY={20.5} fontSize="0.9mm" />
<silkscreentext text="BOOT" pcbX={-35} pcbY={-9} fontSize="0.7mm" />
<silkscreentext text="RESET" pcbX={-35} pcbY={-3} fontSize="0.7mm" />
</board>
)
}