techmannih/nema34-mounted-stepper-controller
A USB-C PD-powered RP2040 motor controller with protected 48 V power, DRV8262 dual-bridge drive for a NEMA34 motor, regenerative-braking resistor, isolated sensing, hardware interlocks, and telemetry/status interfaces.
- Version
- 0.3.113
- License
- unset
- Stars
- 1
firmware/src/step_motion.c
#include "step_motion.h"
void step_motion_stop(step_motion_t *s) { *s=(step_motion_t){0}; }
void step_motion_renew(step_motion_t *s, uint32_t now, bool run) {
if(!s->active && !run) return;
if(!s->active) { s->last_us=now; s->phase=0; s->speed_millihz=0; s->high=false; s->ramp_remainder=0; }
s->active=true; s->lease_us=now; s->requested=run;
}
bool step_motion_tick(step_motion_t *s, uint32_t now, bool hardware_ok) {
const uint32_t dt=now-s->last_us;
if(!s->active || !hardware_ok || now-s->lease_us>=25000u || dt>100u) {
step_motion_stop(s); return false;
}
s->last_us=now;
/* One-second acceleration to 10 RPM. No backlog of pulses after a delayed ISR. */
s->ramp_remainder+=dt*STEP_MOTION_MAX_MILLIHZ;
uint32_t increment=s->ramp_remainder/1000000u;
s->ramp_remainder%=1000000u;
if(s->requested) {
s->speed_millihz+=increment;
if(s->speed_millihz>STEP_MOTION_MAX_MILLIHZ) s->speed_millihz=STEP_MOTION_MAX_MILLIHZ;
} else if(s->speed_millihz<=increment) { step_motion_stop(s); return false; }
else s->speed_millihz-=increment;
s->phase+=s->speed_millihz*dt;
if(s->high) { s->high=false; return false; }
if(s->phase>=1000000000u) { s->phase-=1000000000u; s->high=true; }
return s->high;
}