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

firmware/src/motor_service.c

#include "motor_service.h"
#include "tmc5160_config.h"

void pd1180_motor_service_reset(pd1180_motor_service_t *m) {
  pd1180_tmc_invalidate(&m->driver);
  m->status=(pd1180_tmc_status_t){0};
  m->attempted_configuration=false;
  m->applied_current_permille=0;
}
bool pd1180_motor_service(pd1180_motor_service_t *m, const pd1180_control_t *c,
                         pd1180_inputs_t *in, uint16_t requested) {
  in->driver_ready=false;
  if (!c->armed || !c->power_permit || !in->motor_power_good || !in->vmotor_in_range ||
      !in->configuration_verified || !in->motion_wiring_verified || !requested ||
      requested>PD1180_BENCH_CURRENT_MAX_PERMILLE) {
    pd1180_motor_service_reset(m);
    return false;
  }
  const uint16_t limit=(uint32_t)requested*c->current_limit_permille/1000u;
  if (limit<32u) return false;
  if (!m->driver.configured) {
    if (m->attempted_configuration) return false;
    m->attempted_configuration=true;
    if (!pd1180_tmc_configure_ramp(&m->driver,limit)) return false;
    m->applied_current_permille=limit;
    if (!pd1180_tmc_set_chopper(&m->driver,true)) return false;
  }
  if (!pd1180_tmc_status(&m->driver,&m->status)) return false;
  // Verify internal-ramp mode and grounded unused encoder pins continuously.
  if ((m->status.ioin&0x4Cu)!=0u) {
    pd1180_tmc_invalidate(&m->driver); return false;
  }
  if (limit!=m->applied_current_permille) {
    if (!pd1180_tmc_set_current(&m->driver,limit)) return false;
    m->applied_current_permille=limit;
  }
  in->driver_ready=true;
  return true;
}