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"
}
}