astra/pd-power-supply

USB-PD Power Supply with RP2040 controller

Version
1.1.6
License
unset
Stars
0

layout.ts

// Physical and schematic placement are intentionally independent.
// Small SMD controller parts sit under the OLED, which is mounted 6 mm above the PCB.
const pcb: Record<string, [number, number]> = {
  "J_PWR": [
    -34.8,
    6
  ],
  "U_PD": [-24,10],
  "C_PD": [-18.8,12],
  "F1": [
    -14,
    19
  ],
  "C_PD_IN": [-24,15.5],
  "J_DATA": [
    -34.8,
    -6
  ],
  "R_CC1": [
    -32.5,
    12.8
  ],
  "R_CC2": [
    -29.3,
    12.8
  ],
  "R_DP": [
    -26,
    -3
  ],
  "R_DM": [
    -26,
    -1
  ],
  "C_USB": [
    -27,
    -5
  ],
  "D_AUX": [
    21,
    19
  ],
  "D_USB": [
    -21.7,
    18.2
  ],
  "U_LOGIC": [
    11,
    9.5
  ],
  "C_LOGIC_IN": [
    21,
    14.5
  ],
  "C_LOGIC_HF": [
    15,
    16.5
  ],
  "L_LOGIC": [
    9,
    19
  ],
  "C_LOGIC_OUT1": [
    19,
    1
  ],
  "C_LOGIC_OUT2": [
    24,
    -2
  ],
  "U_MCU": [
    -16,
    5
  ],
  "C_IO1": [
    -13,
    10
  ],
  "C_IO2": [
    -10,
    6
  ],
  "C_IO3": [
    -10,
    -1
  ],
  "C_IO4": [
    -22,
    2
  ],
  "C_IO5": [-22,4.5],
  "C_IO6": [-18.5,10],
  "C_UV": [
    -10,
    9
  ],
  "C_AV": [
    -10,
    3
  ],
  "C_DV1": [
    -16,
    11
  ],
  "C_DV2": [
    -20,
    -1
  ],
  "C_VREGI": [
    -8,
    6
  ],
  "C_VREGO": [
    -8,
    9
  ],
  "U_FLASH": [
    -2,
    5
  ],
  "C_FLASH": [
    -1,
    12
  ],
  "R_CS": [
    -6,
    -2
  ],
  "R_BOOT": [
    -9,
    -6
  ],
  "SW_BOOT": [
    34,
    7
  ],
  "SW_RESET": [
    -9,
    -12
  ],
  "R_RUN": [
    -7,
    0
  ],
  "Y1": [
    -16,
    -3
  ],
  "R_XTAL": [
    -13,
    0
  ],
  "C_X1": [
    -19,
    -4.5
  ],
  "C_X2": [
    -13,
    -4.5
  ],
  "R_KNOB": [
    -26,
    1
  ],
  "C_KNOB": [
    -26,
    4
  ],
  "R_KNOB_PD": [-28.5,7],
  "R_BLEED": [
    31,
    -16
  ],
  "R_SHUNT": [
    33,
    -11
  ],
  "J_LEVER": [
    22,
    -13.3
  ],
  "U_SENSE": [
    32,
    -3
  ],
  "C_SENSE": [
    27,
    2
  ],
  "R_SDA": [
    8,
    -1
  ],
  "R_SCL": [
    13,
    -2
  ],
  "R_PD_CFG": [-27.8,10],
  "R_PG": [-20,15],
  "C_BST1": [
    8,
    14.5
  ],
  "C_BST2": [12,14.5],
  "C_VCC": [
    17,
    11.5
  ],
  "R_FB_TOP": [
    12,
    3.5
  ],
  "R_FB_BOT": [
    12,
    0.5
  ],
  "R_RT": [
    5,
    3.5
  ],
  "R_COMP": [
    19,
    8.5
  ],
  "C_COMP": [
    22,
    8.5
  ],
  "R_FF": [
    23,
    3.5
  ],
  "C_FF": [
    16,
    3.5
  ],
  "RV_COARSE": [
    -21,
    -14.5
  ],
  "RV_FINE": [
    3,
    -14.5
  ],
  "R_FINE": [
    6,
    -3
  ],
  "C_FINE": [
    6,
    -6
  ],
  "R_FINE_PD": [
    9,
    -6
  ],
  "J_I2C": [
    -3,
    17.8
  ],
  "R_PD_SDA": [
    -17,
    14
  ],
  "R_PD_SCL": [
    -14,
    16
  ],
  "J_SWITCH": [
    -37.55,
    16.5
  ],
  "U_LOAD": [
    26,
    14
  ],
  "R_LOAD_EN": [
    30,
    13
  ],
  "R_LOAD_ILM": [
    30,
    17
  ],
  "C_LOAD_DVDT": [25,9],
  "C_LOAD_IN": [
    28,
    20
  ],
  "C_LOAD_OUT": [36,2.5]
}
const schematic: Record<string, [string, string, number, number, number]> = {
  "J_PWR": [
    "pd",
    "pd_input",
    -6.5,
    2.5,
    0
  ],
  "U_PD": [
    "pd",
    "pd_input",
    0.0,
    2.0,
    0
  ],
  "R_PD1": [
    "pd",
    "pd_input",
    -3.5,
    5.0,
    0
  ],
  "R_PD2": [
    "pd",
    "pd_input",
    -3.5,
    3.5,
    0
  ],
  "C_PD": [
    "pd",
    "pd_input",
    -1.5,
    5.0,
    270
  ],
  "F1": [
    "pd",
    "pd_input",
    4.0,
    5.0,
    0
  ],
  "C_PD_IN": [
    "pd",
    "pd_input",
    -4.5,
    5.0,
    270
  ],
  "Q_CFG1": [
    "pd",
    "cfg",
    -6.0,
    -3.0,
    0
  ],
  "R_CFG1": [
    "pd",
    "cfg",
    -6.0,
    -1.0,
    90
  ],
  "R_GATE1": [
    "pd",
    "cfg",
    -8.0,
    -3.5,
    270
  ],
  "Q_CFG2": [
    "pd",
    "cfg",
    0.0,
    -3.0,
    0
  ],
  "R_CFG2": [
    "pd",
    "cfg",
    0.0,
    -1.0,
    90
  ],
  "R_GATE2": [
    "pd",
    "cfg",
    -2.0,
    -3.5,
    270
  ],
  "Q_CFG3": [
    "pd",
    "cfg",
    6.0,
    -3.0,
    0
  ],
  "R_CFG3": [
    "pd",
    "cfg",
    6.0,
    -1.0,
    90
  ],
  "R_GATE3": [
    "pd",
    "cfg",
    4.0,
    -3.5,
    270
  ],
  "D_AUX": [
    "logic",
    "logic",
    -6.5,
    2.5,
    0
  ],
  "D_USB": [
    "logic",
    "logic",
    -6.5,
    0.0,
    0
  ],
  "C_LOGIC_IN": [
    "logic",
    "logic",
    -4.2,
    0.5,
    270
  ],
  "C_LOGIC_HF": [
    "logic",
    "logic",
    -1.6,
    0.5,
    270
  ],
  "U_LOGIC": [
    "logic",
    "logic",
    1.0,
    2.0,
    0
  ],
  "C_BST": [
    "logic",
    "logic",
    3.5,
    4.5,
    0
  ],
  "L_LOGIC": [
    "logic",
    "logic",
    5.0,
    2.0,
    0
  ],
  "C_LOGIC_OUT1": [
    "logic",
    "logic",
    7.0,
    0.5,
    270
  ],
  "C_LOGIC_OUT2": [
    "logic",
    "logic",
    9.6,
    0.5,
    270
  ],
  "J_DATA": [
    "usb",
    "data",
    -6.0,
    1.5,
    0
  ],
  "R_CC1": [
    "usb",
    "data",
    -2.5,
    3.5,
    270
  ],
  "R_CC2": [
    "usb",
    "data",
    -0.5,
    3.5,
    270
  ],
  "R_DP": [
    "usb",
    "data",
    -2.0,
    0.5,
    0
  ],
  "R_DM": [
    "usb",
    "data",
    -2.0,
    -1.0,
    0
  ],
  "C_USB": [
    "usb",
    "data",
    -6.0,
    5.0,
    270
  ],
  "SW_BOOT": [
    "usb",
    "boot",
    3.5,
    2.5,
    0
  ],
  "R_BOOT": [
    "usb",
    "boot",
    6.5,
    2.5,
    0
  ],
  "R_CS": [
    "usb",
    "boot",
    8.5,
    4.0,
    270
  ],
  "SW_RESET": [
    "usb",
    "boot",
    3.5,
    -2.0,
    0
  ],
  "R_RUN": [
    "usb",
    "boot",
    6.5,
    -0.5,
    270
  ],
  "U_MCU": [
    "mcu",
    "mcu",
    -4.5,
    0.0,
    0
  ],
  "C_IO1": [
    "mcu",
    "decoupling",
    2.5,
    4.5,
    270
  ],
  "C_IO2": [
    "mcu",
    "decoupling",
    4.5,
    4.5,
    270
  ],
  "C_IO3": [
    "mcu",
    "decoupling",
    6.5,
    4.5,
    270
  ],
  "C_IO4": [
    "mcu",
    "decoupling",
    8.5,
    4.5,
    270
  ],
  "C_IO5": [
    "mcu",
    "decoupling",
    2.5,
    1.5,
    270
  ],
  "C_IO6": [
    "mcu",
    "decoupling",
    4.5,
    1.5,
    270
  ],
  "C_UV": [
    "mcu",
    "decoupling",
    6.5,
    1.5,
    270
  ],
  "C_AV": [
    "mcu",
    "decoupling",
    8.5,
    1.5,
    270
  ],
  "C_DV1": [
    "mcu",
    "decoupling",
    2.5,
    -1.5,
    270
  ],
  "C_DV2": [
    "mcu",
    "decoupling",
    4.5,
    -1.5,
    270
  ],
  "C_VREGI": [
    "mcu",
    "decoupling",
    6.5,
    -1.5,
    270
  ],
  "C_VREGO": [
    "mcu",
    "decoupling",
    8.5,
    -1.5,
    270
  ],
  "U_FLASH": [
    "support",
    "flash",
    -4.0,
    1.5,
    0
  ],
  "C_FLASH": [
    "support",
    "flash",
    -4.0,
    4.5,
    270
  ],
  "Y1": [
    "support",
    "clock",
    5.0,
    1.5,
    0
  ],
  "R_XTAL": [
    "support",
    "clock",
    8.0,
    2.0,
    0
  ],
  "C_X1": [
    "support",
    "clock",
    3.0,
    -1.0,
    270
  ],
  "C_X2": [
    "support",
    "clock",
    7.0,
    -1.0,
    270
  ],
  "RV1": [
    "io",
    "knob",
    -6.0,
    4.0,
    270
  ],
  "R_KNOB": [
    "io",
    "knob",
    -3.0,
    4.0,
    0
  ],
  "C_KNOB": [
    "io",
    "knob",
    -1.0,
    2.5,
    270
  ],
  "R_KNOB_PD": [
    "io",
    "knob",
    1.0,
    2.5,
    270
  ],
  "U_SENSE": [
    "io",
    "monitor",
    -4.5,
    -2.5,
    0
  ],
  "C_SENSE": [
    "io",
    "monitor",
    -7.5,
    -2.5,
    270
  ],
  "R_SHUNT": [
    "io",
    "monitor",
    0,
    0.0,
    0
  ],
  "R_BLEED": [
    "io",
    "monitor",
    -1.0,
    -3.5,
    270
  ],
  "DS1": [
    "io",
    "display",
    7.0,
    4.0,
    0
  ],
  "R_SDA": [
    "io",
    "display",
    4.0,
    5.0,
    270
  ],
  "R_SCL": [
    "io",
    "display",
    5.0,
    3.0,
    270
  ],
  "J_SCREW": [
    "io",
    "outputs",
    4.5,
    -1.5,
    0
  ],
  "J_HEADER": [
    "io",
    "outputs",
    7.5,
    -1.5,
    0
  ],
  "J_LEVER": [
    "io",
    "outputs",
    6.0,
    -4.5,
    0
  ]
}
const revised: Record<string, [string,string,number,number,number]> = {
 J_SWITCH:['load','load_control',-6,3,0], U_LOAD:['load','load_control',0,2,0],
 R_LOAD_EN:['load','load_control',-3,-1,270],R_LOAD_ILM:['load','load_control',3,-1,270],
 C_LOAD_DVDT:['load','load_control',5,-1,270],C_LOAD_IN:['load','load_control',-3,5,270],C_LOAD_OUT:['load','load_control',4,5,270],
 U_PD:['pd','pd_input',0,2,0], C_PD:['pd','pd_input',-3,4.5,270], R_PD_CFG:['pd','pd_input',2,4.5,270], R_PG:['pd','pd_input',6,4.5,270],
 R_PD_SDA:['pd','cfg',-3,-2,270],R_PD_SCL:['pd','cfg',1,-2,270],
 C_BST1:['logic','logic',-1,5,0], C_BST2:['logic','logic',3,5,0], C_VCC:['logic','logic',-2,-2,270],
 R_FB_TOP:['logic','logic',8,3.5,270], R_FB_BOT:['logic','logic',6,-1,270],
 R_RT:['logic','logic',0,-3,270], R_COMP:['logic','logic',3,-2,0], C_COMP:['logic','logic',4,-4,0],R_FF:['logic','logic',3,1,0], C_FF:['logic','logic',5,1,0],
 RV_COARSE:['io','knob',-7,4,270],RV_FINE:['io','knob',-7,0.5,270],
 R_FINE:['io','knob',-4,0.5,0],C_FINE:['io','knob',-2,-1,270], R_FINE_PD:['io','knob',0,-1,270],
 J_I2C:['io','display',7,4,0],
}
export function placement(name: string) {
  const sch=revised[name] ?? schematic[name]
  if (!pcb[name] || !sch) throw new Error(`Missing placement for ${name}`)
  const [pcbX, pcbY] = pcb[name]
  const [schSheetName, schSectionName, schX, schY, schRotation] = sch
  return {pcbX, pcbY, schSheetName, schSectionName, schX, schY, schRotation}
}
export const sheets = [
 ['pd','01 - USB-PD PPS / I2C control'],['logic','02 - Buck-boost logic supply'],
 ['usb','03 - USB data and boot'],['mcu','04 - RP2040 and decoupling'],
 ['support','05 - Flash and crystal'],['io','06 - Coarse / fine, JST display and outputs'],['load','07 - SMD toggle and output eFuse'],
] as const
export const sections = [
 ['pd_input','USB-C / CH224A programmable sink'],['cfg','Dedicated I2C1 / power-good'],
 ['logic','3.3 V buck-boost / diode OR'],['data','USB 2.0 data'],['boot','ROM boot and reset'],
 ['mcu','RP2040'],['decoupling','Decoupling'],['flash','2 MB QSPI flash'],['clock','12 MHz crystal'],
 ['load_control','Maintained toggle / 1.5 A overload protection'],['knob','Coarse / fine voltage request'],['monitor','Output sensing'],['display','JST-PH I2C display'],['outputs','WAGO output connector'],
] as const
export const sectionSheet: Record<string,string> = {load_control:'load',pd_input:'pd',cfg:'pd',logic:'logic',data:'usb',boot:'usb',mcu:'mcu',decoupling:'mcu',flash:'support',clock:'support',knob:'io',monitor:'io',display:'io',outputs:'io'}
export const sectionTitles: Record<string,[number,number]> = {load_control:[-8.5,6.1],pd_input:[-8.5,6.1],cfg:[-8.5,-0.5],logic:[-8.5,6.1],data:[-8.5,6.1],boot:[2.5,6.1],mcu:[-8.5,6.1],decoupling:[1.5,6.1],flash:[-8.5,6.1],clock:[1.5,6.1],knob:[-8.5,6.1],monitor:[-8.5,-2],display:[3,6.1],outputs:[3,0]}