AnasSarkiz/usb-c-pwm-pa25
A component library defining an AO3400A N-channel MOSFET, 47 µF polarized capacitor, 3-pin through-hole connector, and 9.1 V Zener diode with PCB footprints and 3D CAD models.
- Version
- 0.1.0-prototype.2
- License
- unset
- Stars
- 0
lib/board.tsx
import { Fragment } from "react";
import { UsbPower } from "./usb-power";
import { MotorPower } from "./motor-power";
import { MotorBridge } from "./motor-bridge";
import { RailClamp } from "./rail-clamp";
import { Controller } from "./controller";
import { UserControls } from "./user-controls";
const mountCenters = [
[-40, -27.5],
[-40, 27.5],
[40, -27.5],
[40, 27.5],
] as const;
export function PwmControllerBoard() {
return (
<board
width="90mm"
height="65mm"
thickness="1.6mm"
layers={4}
allowBlindAndBuriedVias={false}
defaultViaTenting="both_sides"
schLayout={{ layoutMode: "none" }}
minTraceWidth="0.15mm"
autorouterVersion="beta_pipeline7"
autorouterEffortLevel="2x"
minViaPadDiameter="0.60mm"
minViaHoleDiameter="0.30mm"
autorouter={{ local: true, traceClearance: 0.15, allowViaInPad: false }}
minBoardEdgeClearance={0.5}
minTraceToPadEdgeClearance={0.2}
minPadEdgeToPadEdgeClearance={0.15}
minViaEdgeToPadEdgeClearance={0.3}
minViaHoleEdgeToViaHoleEdgeClearance={0.25}
minPlatedHoleDrillEdgeToDrillEdgeClearance={0.25}
>
{[
"CC1",
"CC2",
"INPUT_LIMIT",
"INPUT_SLEW",
"FB",
"BOOT",
"CPH",
"CPL",
"VCP",
].map((name) => (
<Fragment key={name}>
<net name={name} />
</Fragment>
))}
{[
"PD_MIN",
"PD_MAX",
"PD_IOP",
"SDA",
"SCL",
"INPUT_EN",
"INPUT_OV",
"HEALTH",
"PWR_OFF",
"MOTOR_UV",
"MOTOR_OV",
"MOTOR_SLEW",
"MOTOR_LIMIT",
"PWM",
"DIR",
"DRIVE_ENABLE",
"IPROPI",
"CURRENT_ADC",
"CLAMP_SENSE",
"CLAMP_GATE",
"TEMP_ADC",
"TEMP_REF",
"NRST",
"FWD",
"REV",
"POT_ADC",
"VM_ADC",
"MCU_ENABLE",
"LED_FAULT",
"LED_READY",
"SWDIO",
"SWCLK",
"POT_WIPER",
"LED_PWR_A",
"LED_READY_A",
"LED_FAULT_A",
].map((name) => (
<Fragment key={name}>
<net name={name} />
</Fragment>
))}
{["VBUS", "PD_OUT", "V15", "V12_BUCK", "VM"].map((name) => (
<Fragment key={name}>
<net name={name} isPowerNet nominalTraceWidth="0.8mm" />
</Fragment>
))}
{["V3V3", "PD_3V3", "PD_1V5", "VREF_2V5"].map((name) => (
<Fragment key={name}>
<net name={name} isPowerNet nominalTraceWidth="0.2mm" />
</Fragment>
))}
{["MOTOR_A", "MOTOR_B", "SW", "BRAKE_DRAIN"].map((name) => (
<Fragment key={name}>
<net name={name} nominalTraceWidth="0.8mm" />
</Fragment>
))}
<net name="GND" isGroundNet nominalTraceWidth="0.8mm" />
<UsbPower />
<MotorPower />
<MotorBridge />
<RailClamp />
<Controller />
<UserControls />
{(["inner1", "inner2"] as const).map((layer) => (
<Fragment key={layer}>
<copperpour
name={`ground_${layer}`}
layer={layer}
connectsTo="net.GND"
clearance={0.2}
boardEdgeMargin={0.5}
cutoutMargin={0.5}
useThermalReliefs={false}
/>
</Fragment>
))}
<copperpour
name="ground_top"
layer="top"
connectsTo="net.GND"
clearance={0.2}
boardEdgeMargin={0.5}
cutoutMargin={0.5}
useThermalReliefs={false}
/>
<copperpour
name="ground_bottom"
layer="bottom"
connectsTo="net.GND"
clearance={0.2}
boardEdgeMargin={0.5}
cutoutMargin={0.5}
useThermalReliefs={false}
/>
{[22.45, 27.55].flatMap((pcbX) =>
[-3.45, -2.55].map((pcbY) => (
<Fragment key={`${pcbX},${pcbY}`}>
<via
pcbX={pcbX}
pcbY={pcbY}
fromLayer="top"
toLayer="bottom"
outerDiameter={0.6}
holeDiameter={0.3}
connectsTo="net.GND"
tented
/>
</Fragment>
)),
)}
<fiducial
name="FID1"
pcbX={-34}
pcbY={30}
padDiameter={1}
soldermaskPullback={0.5}
/>
<fiducial
name="FID2"
pcbX={34}
pcbY={-29.5}
padDiameter={1}
soldermaskPullback={0.5}
/>
<fiducial
name="FID3"
pcbX={-34}
pcbY={-30}
padDiameter={1}
soldermaskPullback={0.5}
/>
{mountCenters.map(([pcbX, pcbY], index) => (
<Fragment key={index}>
<hole name={`H${index + 1}`} diameter={3.2} pcbX={pcbX} pcbY={pcbY} />
<keepout
shape="circle"
radius={4}
pcbX={pcbX}
pcbY={pcbY}
layers={["top", "inner1", "inner2", "bottom"]}
/>
</Fragment>
))}
<silkscreentext
text="PA25 PWM • A1 PROTOTYPE"
pcbX={-12}
pcbY={12.5}
fontSize={1.1}
/>
<silkscreentext
text="USB-C PD 15V / 1.5A"
pcbX={-31}
pcbY={-10}
fontSize={0.9}
/>
<silkscreentext text="SPEED" pcbX={-27} pcbY={30} fontSize={1} />
<silkscreentext
text="FWD STOP REV"
pcbX={-11}
pcbY={30}
fontSize={0.9}
/>
<silkscreentext text="12V MOTOR" pcbX={38} pcbY={1.5} fontSize={0.9} />
<silkscreentext
text="PWR READY FAULT"
pcbX={-26}
pcbY={-28}
fontSize={0.8}
/>
<silkscreentext
text="BRAKE LOAD — MAY BE HOT"
pcbX={21}
pcbY={30.5}
fontSize={0.8}
/>
<silkscreentext
text="For evaluation only;"
pcbX={0}
pcbY={3}
fontSize={1.4}
layer="bottom"
/>
<silkscreentext
text="not FCC approved for resale."
pcbX={0}
pcbY={0}
fontSize={1.4}
layer="bottom"
/>
</board>
);
}