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. */}
</>;