techmannih/nema34-mounted-stepper-controller

A 48 V USB‑C PD 3.1 EPR NEMA‑34 stepper controller PCB combining STM32/TMC5160 control, external MOSFET motor bridges, protected power and regenerative braking, USB data, telemetry, diagnostics, status LEDs, and buzzer alarms.

Version
0.3.92
License
unset
Stars
1

engineering/power-audit.json

{
  "schema_version": 1,
  "checked_at": "2026-10-15T23:00:47.765Z",
  "status": "screen-complete-hardware-unqualified",
  "powered_tests_performed": false,
  "full_current_operation_authorized": false,
  "operating_risks": [
    {
      "id": "brake-unavailable",
      "severity": "high",
      "status": "open",
      "closure": "Qualify brake-open, supply-loss and worst-stop energy/transients; driver inhibit is not an energy sink."
    },
    {
      "id": "input-current-coordination",
      "severity": "high",
      "status": "open",
      "closure": "TPS26630 removes the deliberate 2x pulse allowance. Qualify its finite limiting/fast-trip response with the exact EPR source/cable and measure all upstream loads against the allocation."
    },
    {
      "id": "motor-mounted-thermal",
      "severity": "high",
      "status": "open",
      "closure": "Agree the motor current waveform and qualify winding, MOSFET, shunt, capacitor and connector temperatures; the local TMP102 is insufficient evidence."
    },
    {
      "id": "external-brake-installation",
      "severity": "high",
      "status": "open",
      "closure": "Specify load energy, duty, resistor pulse limits, thermal interface, heatsink and mechanical installation."
    },
    {
      "id": "ripple-and-brake-turnoff",
      "severity": "medium",
      "status": "open",
      "closure": "Measure each bulk-capacitor ripple/heating and Q16 VDS turn-off overshoot with the intended brake harness; qualify any required clamp/snubber."
    }
  ],
  "input_sha256": {
    "index.circuit.tsx": "51fae7ba95264851e1ccc3f17c060cd151ebb6e01e5452a80e31cf61ec6a67b7",
    "dist/index/circuit.json": "999b1d0370187bfe344e3491a3ad159e1495d6008c3f1c762bb9c79785c2a997",
    "docs/design-manifest.json": "7c248b3e62fb52a9a1f0adb009b8e2c8bcd16f759aece861356a2750990af783",
    "hardware-contract.json": "5e3d2add0a124504ba1ab5ded48d84217936b99e1ecb0c1edbc1dd7b3b31d161",
    "docs/motor-data.json": "4579b126fccbfcd4d7620f2dec90dfd7fe9c5cd299be555aea5053a673f86103",
    "firmware/include/tmc5160_config.h": "eaa9d3f2a2a33382ad0c7cfc986ce2f216ad17cd1aa5a8ec04e0db91b27c5335",
    "firmware/src/tmc5160.c": "f46873b8e9d4fb700ee17b18ac47a6ad454777a6e25c87374de47359419ea0f2",
    "firmware/src/motor_service.c": "240ba8af856bedda5cb2f1d063762969bbf207307b601ba458a0fcda4e05b1bd",
    "firmware/target/main.cpp": "5fd29f0d780149ff7eabca08fe133e9dd22f4720178907746fc7d398c91f8aa2",
    "dist/manufacturing/kicad-project/pd1180-epr-r0.3.kicad_pcb": "4e53cf5210003b327a1b4cd49f3c5c81ff3a0f5f44277b71c384c29bc95a5cb3",
    "scripts/power-audit.mjs": "7cbf727a9eac0153a828c6698e312a0fb333d06109a3937de271eed3253dcc20",
    "firmware/src/control.c": "95c4700a91e3cc3fe744a3b887c28ed6db261104a68430f6b6e2e6fcb8fd29e2"
  },
  "assumptions": {
    "resistor_initial_tolerance_fraction": 0.01,
    "protection_resistor_initial_tolerance_fraction": 0.001,
    "protection_resistor_max_tcr_ppm_per_c": 25,
    "protection_temperature_range_c": [
      -40,
      125
    ],
    "comparator_hysteresis_and_noise_allocation_v": 0.002,
    "motor_bus_dynamic_overshoot_allocation_v": 0.5,
    "source_high_voltage_design_allowance_fraction": 0.05,
    "input_ovp_noise_margin_v": 0.3,
    "bulk_capacitance_tolerance_fraction": 0.2,
    "winding_inductance_high_screen_fraction": 0.2,
    "winding_copper_temperature_coefficient_per_c_assumed": 0.00393,
    "winding_copper_temperature_model_reference_c": 25,
    "slew_capacitance_initial_tolerance_fraction": 0.1,
    "capacitor_dc_bias_and_temperature_included": false,
    "motor_model": "34HS31-6004S1",
    "motor_phase_resistance_25c_ohm": 0.48,
    "motor_phase_inductance_h": 0.0035,
    "motor_rotor_inertia_kg_m2": 0.00014,
    "external_load_inertia": null,
    "motor_rpm_and_stop_time": null,
    "mosfet_hot_resistance_multiplier": 2,
    "mosfet_hot_multiplier_is_guaranteed": false,
    "switching_frequency_sensitivity_hz": [
      20000,
      40000
    ],
    "missing_models": [
      "PCB thermal boundary conditions",
      "MOSFET switching/dead-time losses",
      "capacitor RMS ripple",
      "motor iron/friction/load losses",
      "source/cable transient response"
    ]
  },
  "calculations": {
    "commissioning_profile": {
      "scope": "Unloaded rotor only; no coupling, driven load, gravity load or external back-drive",
      "selection_basis": "Retained low-energy commissioning choice; not copied from PD-1180 ratings",
      "motor_operation_authorized": false,
      "max_requested_current_permille": 240,
      "irun": 6,
      "nominal_rms_a": 0.8271367552997603,
      "nominal_sine_peak_a": 1.169748017282197,
      "nominal_speed_rpm": 9.999610483646393,
      "nominal_acceleration_rpm_per_s": 9.976020010071807,
      "nominal_ramp_stop_s": 1.0023647179487178,
      "nominal_rotor_energy_j": 0.00007675760976800189,
      "nominal_winding_energy_j": 0.002394543241887354,
      "nominal_rotor_energy_at_1000rpm_j": 0.7676358978625054,
      "brake_open_sensitivity": {
        "each_phase_instantaneous_current_a": 1.5,
        "rpm": 15,
        "returned_energy_j": 0.009622718077019064,
        "minimum_capacitance_f": 0.0007520000000000001,
        "peak_from_50v4_v": 50.653255920140225,
        "peak_from_upper_cutoff_v": 54.063069372837965,
        "upper_cutoff_peak_plus_0v5_allocation_v": 54.563069372837965,
        "residual_margin_below_55v_v": 0.43693062716203457,
        "guaranteed_bound": false,
        "note": "Lossless energy screen only. The 1.5 A/phase and 15 rpm sensitivity is an engineering allocation requiring measurement; it does not close startup continuity, running brake failure or transient margin."
      },
      "note": "Clock, current regulation, winding nonlinearity and speed are uncalibrated. No attached load is allowed in this prototype scope; unknown application inertia remains unknown in motor-data.json."
    },
    "driver_supply": {
      "volts": {
        "nominal": 12.001100110011,
        "min": 11.567323802883527,
        "max": 12.567047330673857
      },
      "external_operating_range_v": [
        10,
        13
      ],
      "inductor_h": 0.000047,
      "inductor_isat_25c_a": 2.7,
      "regulator_high_side_limit_max_a": 2.4,
      "inductor_minimum_at_minus_20_percent_h": 0.0000376,
      "regulator_minimum_inductance_h": 0.00002310118994609165,
      "output_nominal_capacitance_f": 0.000066,
      "note": "PFM regulation and resistor temperature allowances included. Saturation rating is specified at 25 C; hot current, capacitor bias, load steps and startup remain measured qualification items."
    },
    "supply": {
      "contract_w": 240,
      "efuse_limit": {
        "formula_nominal_a": 3.6072144288577155,
        "table_interpolated_nominal_a": 3.625250501002004,
        "min_a": 3.251345740808972,
        "max_a": 4.001781787357958,
        "resistor_tolerance_with_temperature_fraction": 0.0034999999999999996,
        "device_error_allocation_fraction": 0.1,
        "upstream_input_allocation_a": 0.25,
        "total_input_screen_a": 4.251781787357958,
        "remaining_contract_margin_a": 0.7482182126420422,
        "manufacturer_guaranteed_at_selected_resistance": false
      },
      "nominal_motor_input_ceiling_w": 173.14629258517033,
      "tolerance_low_current_ceiling_w_at_48v": 156.06459555883066,
      "upstream_logic_current_margin_a_at_5a_contract": 0.9982182126420422,
      "overload_after_pgood": {
        "nominal_current_ceiling_a": 3.6072144288577155,
        "pulse_multiplier": 1,
        "deliberate_2x_pulse_window_ms": 0,
        "hard_5a_ceiling": false,
        "fast_trip_nominal_multiplier": 2,
        "note": "TPS26630 1x active limiting, TI 8.3.7.1.1. Finite loop response and a separate 2x fast-trip threshold can still permit brief overshoot; this is not an ideal instantaneous 5 A clamp."
      },
      "efuse_thermal_screen": {
        "ron_max_ohm_at_125c": 0.053,
        "conduction_loss_w_at_formula_limit": 0.6896357845952426,
        "conduction_loss_w_at_upper_current_screen": 0.8487556461023821,
        "linear_limiting_loss_w_at_4v_drop_and_formula_limit": 14.428857715430862,
        "pcb_temperature_rise_qualified": false,
        "note": "I²R applies while fully enhanced. Active limiting dissipates (VIN-VOUT)*I and invokes thermal regulation/shutdown; MODE remains open for latch-off. No PCB thermal impedance, SOA or restart qualification is inferred."
      },
      "note": "Input limit is not a phase-current limit. The 250 mA upstream allocation must be verified on hardware; the 4.99k interpolation and device-error allowance are screening assumptions."
    },
    "thresholds_v": {
      "input_uvlo": {
        "min": 42.61912336633663,
        "nominal": 44.4,
        "max": 46.23272181818182
      },
      "input_ovp": {
        "min": 50.9325569583707,
        "nominal": 52.404,
        "max": 53.89272675135474
      },
      "brake_on_screen": {
        "min": 51.378846705081195,
        "nominal": 52.04050000000001,
        "max": 52.64373394120547
      },
      "brake_off_nominal": 51.393040000000006,
      "brake_off_screen": {
        "min": 50.73177802219108,
        "nominal": 51.393040000000006,
        "max": 52.14691389636242
      },
      "independent_reference_envelope_gap": -0.048568900330955955,
      "brake_on_to_cutoff_shared_reference_minimum_gap": 0.10754540065474764,
      "shared_reference_error_v": 0.003725,
      "each_comparator_error_screen_v": 0.00840797902362465,
      "coordination_note": "U13 and U14 share the same U12 output, verified in compiled connectivity. U12 error is common; comparator offset/CMRR/PSRR and resistor errors are independent. Independent absolute envelopes may overlap across different boards. Dynamic separation still requires measurement.",
      "brake_off_above_high_source_and_noise_allocation": 0.031778022191073785,
      "motor_cutoff_screen": {
        "min": 52.59516504087451,
        "nominal": 53.20754716981132,
        "max": 53.825859349397014
      },
      "vsa_operating_max": 50,
      "vs_operating_max": 55,
      "note": "Screening corners, not a qualified min/max specification. Shared reference prevents treating the two trips as independent distributions."
    },
    "current": {
      "target_rms_a": 3.8,
      "sine_peak_a": 5.374011537017761,
      "programmed_rms_a": 3.7811965956560467,
      "sensitivity_min_rms_a": 3.556571055320044,
      "sensitivity_max_rms_a": 4.010360025695807,
      "motor_rated_phase_a": 6,
      "motor_qualified_driver_rms_a": null,
      "motor_rating_note": "Manufacturer states AMPS/PHASE, not an approved TMC5160 RMS setpoint. Resolve waveform, peak/hold current and thermal limits before motor-enabled firmware.",
      "note": "Existing board design-current screen, not an approved setting for the ordered motor. TMC ±5% is specified at full scale; applying it to GLOBALSCALER=139 is only a sensitivity calculation, not a guaranteed tolerance."
    },
    "dissipation_w": {
      "regulation_shunt_cycle_upper_bound_each": 0.47652,
      "regulation_shunt_held_peak_upper_bound_each": 0.95304,
      "phase_telemetry_shunt_cycle_each": 0.0722,
      "phase_telemetry_shunt_held_peak_each": 0.1444,
      "eight_bridge_mosfets_conduction_25c_max_rds_total": 0.872176,
      "eight_bridge_mosfets_conduction_hot_sensitivity_total": 1.744352,
      "efuse_at_nominal_limit_and_125c_max_ron": 0.6896357845952426,
      "two_motor_windings_25c": 13.8624,
      "two_motor_windings_100c_linear_copper_sensitivity": 17.9483424,
      "note": "Loss estimates exclude switching losses and do not determine junction temperature. Low-side shunt current depends on decay duty; held-peak bound covers the high-current microstep."
    },
    "inrush": {
      "capacitance_f": 0.00094,
      "stored_energy_at_48v_j": 1.08288,
      "charge_to_48v_c": 0.04512,
      "nominal_ramp_ms": 96,
      "initial_tolerance_ramp_ms": [
        74.67588591184098,
        126.58076116272102
      ],
      "nominal_capacitor_current_a": 0.47,
      "initial_tolerance_capacitor_current_a": [
        0.2851618181818182,
        0.7250533333333332
      ],
      "nominal_initial_efuse_dissipation_w": 22.56,
      "note": "No-load linear ramp model; thermally regulated startup, MLCC bias and additional loads alter the ramp. Verify eFuse SOA and PGOOD timing."
    },
    "regeneration": {
      "bulk_energy_48_to_53v_j": 0.23735,
      "bulk_energy_48_to_53v_min_cap_j": 0.18988000000000002,
      "bulk_energy_48_to_brake_on_nominal_j": 0.18998041091750043,
      "winding_energy_nominal_sine_quadrature_j": 0.05054,
      "brake_unavailable_return_screen": {
        "voltage_after_nominal_cutoff_nominal_cap_nominal_inductance_v": 54.208624689446914,
        "voltage_after_upper_cutoff_min_cap_nominal_inductance_v": 55.0603126427565,
        "voltage_after_upper_cutoff_min_cap_high_inductance_v": 55.303896852224575,
        "min_cap_energy_headroom_upper_cutoff_to_55v_j": 0.04804410135239778,
        "mechanical_regeneration_included": false,
        "note": "All remaining winding energy returned to the bus after inhibit; lossless screening cases, not measured or predicted waveforms. Inductance under operating current, current tolerance, ESR/ESL, source response and mechanical energy are not bounded by this model. Exceeding 55 V requires closure even when static threshold checks pass."
      },
      "rotor_only_energy_j": {
        "100": 0.007676358978625057,
        "500": 0.19190897446562635,
        "1000": 0.7676358978625054,
        "2000": 3.0705435914500216
      },
      "brake_nominal_at_53v": {
        "ohm": 10,
        "current_a": 5.3,
        "power_w": 280.9
      },
      "brake_at_55v_and_minus_2_percent_resistance": {
        "current_a": 5.612244897959183,
        "power_w": 308.67346938775506
      },
      "continuous_281w_resistor_case_to_ambient_max_c_per_w_at_50c": 0.1245995016019936,
      "note": "Brake sizing requires load inertia, stop time, duty and gravity. 300 W LPS300 rating requires 85 C maximum case temperature; pulse energy and repetition must be checked separately."
    },
    "ripple_and_brake_switch": {
      "bulk_capacitors": [
        "C22",
        "C23"
      ],
      "manufacturer_part": "EEUFR1J471",
      "each_rated_ripple_a_at_100khz": 1.995,
      "measured_each_ripple_a": null,
      "equal_current_sharing_qualified": false,
      "brake_return_component_references": [
        "D20",
        "J3",
        "Q16",
        "R134"
      ],
      "explicit_clamp_or_snubber_verified": false,
      "measured_q16_turnoff_peak_v": null,
      "note": "A rating at 100 kHz is not a validated chopping/braking waveform rating. D20 provides a local cable-inductance recirculation path and R134 feeds startup continuity sensing. Their presence does not qualify switching overshoot or runtime brake integrity."
    },
    "brake_feedback": {
      "divider_ratio": 19.431372549019606,
      "maximum_open_return_v_at_2ma_leakage": 20.2164,
      "each_top_resistor_nominal_w_at_55v": 0.14476911782225704,
      "note": "D20 2 mA at 125 C rated reverse voltage is the leakage screen; higher junction temperatures and actual ADC errors need qualification. Divider is 1%, 100 ppm/C, two 250 mW 1206 top resistors; board ambient design limit 50 C, local temperature must stay within derated ratings."
    },
    "telemetry": {
      "volts_per_ampere": 0.1,
      "phase_output_at_target_peak_v": [
        1.1125988462982237,
        2.187401153701776
      ],
      "vmon_at_55v": 2.8947368421052633,
      "note": "Nominal transfer only; ADC/reference/gain errors, offset, common-mode switching and sampling require calibration."
    }
  },
  "errors": [],
  "outstanding": [
    "Measured VSA ripple and VS transient margin",
    "Measured brake/cutoff tolerance coordination",
    "PD source/cable finite current-limit and fast-trip coordination; upstream current measurement",
    "Ordered motor current convention, external load inertia, speed, ambient and mechanics qualification",
    "TI-generated EEPROM image and approved configuration identity",
    "Fabricator stack-up/impedance/filled-via approval",
    "Assembled-board current, thermal, USB, brake and fault measurements"
  ],
  "sources": {
    "tmc5160a": "https://www.analog.com/media/en/technical-documentation/data-sheets/tmc5160a_datasheet_rev1.18.pdf#page=120",
    "efuse": "https://www.ti.com/lit/ds/symlink/tps2663.pdf#page=6",
    "mosfet": "https://www.ti.com/lit/ds/symlink/csd19534q5a.pdf#page=3",
    "reference": "https://www.ti.com/lit/ds/symlink/ref34.pdf",
    "driver_regulator": "https://www.ti.com/lit/ds/symlink/lmr36510.pdf",
    "driver_inductor": "https://www.bourns.com/docs/product-datasheets/srp7050ta.pdf",
    "comparator": "https://www.ti.com/lit/ds/symlink/tlv3201.pdf#page=6",
    "cutoff_resistor": "https://www.yageogroup.com/component-documentation/download/specsheet/RT0603BRD071K2L",
    "brake": "https://www.vishay.com/docs/50052/lps300.pdf",
    "bulk_capacitor": "https://industrial.panasonic.com/ww/products/pt/aluminum-cap-lead/models/EEUFR1J471",
    "motor": "https://files.omc-stepperonline.com/34HS31-6004S1_Full_Datasheet.pdf"
  }
}