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

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
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>
  )
}