seveibar/nema17-stepper-motor-driver-tmc2209-usb-pd
RP2040-based USB-C PD stepper-motor controller with TMC2209 drive, AS5600 position feedback, TMP102 thermal shutdown, current/voltage telemetry, RGB status LED, and protected buzzer alarm circuitry.
- Version
- 0.2.0
- License
- unset
- Stars
- 0
schematic/MotorDriverCoreSection.tsx
import { TMC2209_LA_T } from "../imports/TMC2209_LA_T";
import { BSS84 } from "../imports/BSS84";
import { logicTrace, groundTrace, powerTrace, schematicSheets, schematicSections } from "./config";
const sheet = {schSheetName: schematicSheets.motorDriver, schSectionName: schematicSections.driverCore};
export const MotorDriverController = () => <TMC2209_LA_T name="DRIVER" pcbX={9.5} pcbY={-2.5}
schX={0} schY={0} schWidth={3} schHeight={7}
schPinArrangement={{leftSide:{pins:[2,16,19,14,7,9,10,13,20,17],direction:"top-to-bottom"},
rightSide:{pins:[24,21,26,1,23,27,11,12,4,5,6,8],direction:"top-to-bottom"},
topSide:{pins:[28,22,15],direction:"left-to-right"},bottomSide:{pins:[3,18,29,25],direction:"left-to-right"}}} {...sheet}/>;
export const MotorDriverPassives = () => <>
<BSS84
name="Q_PD_ENABLE"
pcbX={5.625}
pcbY={8.25}
schX={-12}
schY={-3}
schPinStyle={{ pin3: { marginTop: 0.2 } }}
schPinArrangement={{
leftSide: { pins: [1], direction: "top-to-bottom" },
rightSide: { pins: [2, 3], direction: "top-to-bottom" },
}}
schSheetName={schematicSheets.motorDriver}
schSectionName={schematicSections.driverCore}
/>
<resistor
name="R_PD_ENABLE_PU" pcbRotation={90}
resistance="100k"
footprint="0402"
supplierPartNumbers={{ jlcpcb: ["C25741"] }}
pcbX={2.875}
pcbY={9.75}
schX={-13.2}
schY={-5.5}
schOrientation="vertical"
schSheetName={schematicSheets.motorDriver}
schSectionName={schematicSections.driverCore}
/>
{[
["R_ENN_PU","10k","0402",4.875,-3.0,-10,4],
["R_UART_TX","1k","0402",11.375,-8.5,-9,-3],
["R_STEP_PD","100k","0402",9.125,-11.25,-6,-5],
["R_ISEN_A","0.15","1206",4.625,-9.5,7,3],
["R_ISEN_B","0.15","1206",12.625,-10.25,10,3],
].map(([name,value,fp,x,y,sx,sy])=><resistor key={name} name={name as string} resistance={value as string} footprint={fp as string}
supplierPartNumbers={String(name).startsWith("R_ISEN_") ? {jlcpcb:["C2683383"]} : undefined}
manufacturerPartNumber={String(name).startsWith("R_ISEN_") ? "RLH12FTCR150" : undefined}
tolerance="1%"
pcbX={x as number} pcbY={y as number} schX={sx as number} schY={sy as number} {...sheet}/>)}
{[
["C_VM_BULK","10uF","1206",15.875,-7.75,-4,7],
["C_VM_HF","100nF","0603",5.375,-7.0,-7,7],
["C_VM_HF2","100nF","0603",7.125,2.25,-10,7],
["C_CP","22nF","0603",8.625,-7.0,5,-4],
["C_VCP","100nF","0603",11.875,-7.0,8,-4],
["C_5VOUT","2.2uF","0603",15.125,-5.5,11,-4],
["C_VCCIO","100nF","0402",10.875,1.5,-1,7],
].map(([name,value,fp,x,y,sx,sy])=><capacitor key={name} name={name as string} capacitance={value as string} footprint={fp as string}
maxVoltageRating={name === "C_CP" ? "50V" : name === "C_5VOUT" || name === "C_VCCIO" ? "10V" : "25V"} schShowRatings
pcbX={x as number} pcbY={y as number} schX={sx as number} schY={sy as number} schOrientation="vertical" maxDecouplingTraceLength={15} {...sheet}/>)}
</>;
const wires = (pairs: string[][]) => pairs.map(([name,from,to])=><trace key={name} name={name} from={from} to={to} thickness={/^(VS_|SENSE_)/.test(name) ? "0.3mm" : "0.15mm"}/>);
export const MotorDriverControlTraces = () => <>
<via name="MCU_GPIO24_ESCAPE" pcbX={0.725} pcbY={3.20005} holeDiameter="0.3mm" outerDiameter="0.45mm"
fromLayer="top" toLayer="bottom" connectsTo={[".MCU > .U1 > .GPIO24", ".MCU_GPIO24_ESCAPE > .top", ".MCU_GPIO24_ESCAPE > .bottom"]}/>
{wires([
["STEP",".MCU > .U1 > .GPIO18",".DRIVER > .STEP"],
["DIR",".MCU > .U1 > .GPIO19",".DRIVER > .DIR"],
["UART_TX",".MCU > .U1 > .GPIO20",".R_UART_TX > .pin1"],
["UART_BUS",".R_UART_TX > .pin2",".DRIVER > .PDN_UART"],
["UART_RX",".MCU > .U1 > .GPIO21",".DRIVER > .PDN_UART"],
["DRIVER_DIAG",".MCU > .U1 > .GPIO23",".DRIVER > .DIAG"],
["DRIVER_ENABLE",".MCU > .U1 > .GPIO22",".Q_PD_ENABLE > .source"],
["TEMP_ESCAPE",".MCU > .U1 > .GPIO24",".MCU_GPIO24_ESCAPE > .top"],
])}
</>;
export const MotorDriverPowerTraces = () => <>
{wires([
["VS_JOIN",".DRIVER > .VS1",".DRIVER > .VS2"],
["VS_BULK",".DRIVER > .VS1",".C_VM_BULK > .pin1"],
["VS_HF",".DRIVER > .VS1",".C_VM_HF > .pin1"],
["VS_HF2",".DRIVER > .VS2",".C_VM_HF2 > .pin1"],
["CHARGE_PUMP_OUT",".DRIVER > .CPO",".C_CP > .pin1"],
["CHARGE_PUMP_IN",".DRIVER > .CPI",".C_CP > .pin2"],
["VCP_CAP",".DRIVER > .VCP",".C_VCP > .pin1"],
["VCP_VS",".DRIVER > .VS1",".C_VCP > .pin2"],
["5VOUT_CAP",".DRIVER > .pin8",".C_5VOUT > .pin1"],
["IO_SUPPLY",".DRIVER > .VCC_IO",".MCU > .L_AVDD > .pin1"],
["IO_CAP",".DRIVER > .VCC_IO",".C_VCCIO > .pin1"],
])}
</>;
export const MotorDriverPrimaryGroundTraces = () => <>
<trace name="BOARD_GND_JOIN" from=".DRIVER > .EP" to="net.GND" {...groundTrace}/>
<trace name="COMMON_GND" from=".DRIVER > .EP" to=".MCU > .U1 > .GND" {...groundTrace}/>
</>;
export const MotorDriverGroundTraces = () => <>
{["GND1","GND2","UNUSED","CLK","STDBY","SPREAD","MS1_AD0","MS2_AD1"].map(pin=>
<trace key={pin} from={`.DRIVER > .${pin}`} to="net.GND" {...logicTrace}/>)}
{["R_ISEN_A","R_ISEN_B","C_VM_BULK","C_VM_HF","C_VM_HF2","C_5VOUT","C_VCCIO","R_STEP_PD"].map(name=>
<trace key={name} from={`.${name} > .pin2`} to="net.GND" {...groundTrace}/>)}
</>;
export const MotorDriverSenseAndControlTraces = () => <>
<trace
name="PD_ENABLE_OUTPUT"
schDisplayLabel="PD_MCU_ENABLE"
from=".Q_PD_ENABLE > .drain"
to=".U_THERM_GATE > .A"
{...logicTrace}
/>
<trace
name="PD_ENABLE_GATE"
from=".Q_PD_ENABLE > .gate"
to=".U_PD > .PG"
schDisplayLabel="PD_GOOD"
{...logicTrace}
/>
<trace
name="PD_ENABLE_GATE_PULLUP"
from=".R_PD_ENABLE_PU > .pin1"
to=".Q_PD_ENABLE > .gate"
{...logicTrace}
/>
<trace
name="PD_ENABLE_PULLUP_SUPPLY"
from=".R_PD_ENABLE_PU > .pin2"
to=".U_PD > .VDD"
{...logicTrace}
/>
{wires([
["SENSE_A",".DRIVER > .BRA",".R_ISEN_A > .pin1"],
["SENSE_B",".DRIVER > .BRB",".R_ISEN_B > .pin1"],
["ENN_PULLUP",".DRIVER > .ENN",".R_ENN_PU > .pin1"],
["ENN_PULLUP_SUPPLY",".R_ENN_PU > .pin2",".DRIVER > .VCC_IO"],
["STEP_PULLDOWN",".DRIVER > .STEP",".R_STEP_PD > .pin1"],
])}
{/* VREF intentionally open: UART sets I_scale_analog=0 before enabling.
INDEX is unused. External 0.15 ohm sense resistors, UART address 0. */}
</>;