astra/nema17-stepper-motor-controller-spring-clamp-rp2040
A 4-layer RP2040 controller board that negotiates USB‑C PD motor power and drives a NEMA17 stepper via a DRV8825, with current sensing, thermal shutdown, RGB status LED, buzzer alarm, optional AS5600 encoder, protection/filtering, and test points.
- Version
- 1.4.0
- License
- unset
- Stars
- 0
firmware/stepper_driver.py
"""DRV8825 STEP/DIR adapter for the 20 V PCB (fixed 1/16 microsteps).
A stop resets the indexer and removes holding torque. The application must
re-establish its position after a stop/fault; this is not position feedback.
"""
class StepperDriver:
def __init__(self, pin_factory=None, delay_us=None):
if pin_factory is None:
from machine import Pin
pin_factory = Pin
if delay_us is None:
from time import sleep_us
delay_us = sleep_us
self.delay_us = delay_us
# Disable first: nENBL is active LOW. The PCB also pulls it high.
self.enable_n = pin_factory(21, pin_factory.OUT, value=1)
self.reset_n = pin_factory(20, pin_factory.OUT, value=0)
self.step_pin = pin_factory(18, pin_factory.OUT, value=0)
self.direction = pin_factory(19, pin_factory.OUT, value=0)
def disable(self):
self.enable_n.value(1)
self.step_pin.value(0)
self.reset_n.value(0)
def enable(self):
# Called only after ThermalGuard has verified temperature, fault and wake.
self.step_pin.value(0)
self.reset_n.value(1)
self.enable_n.value(0)
def pulse(self, forward, permitted):
if not permitted() or self.enable_n.value() or not self.reset_n.value():
return False
self.direction.value(1 if forward else 0)
self.delay_us(2) # DIR setup/hold requirement: >= 650 ns.
if not permitted():
self.disable()
return False
self.step_pin.value(1)
self.delay_us(3) # STEP high/low requirements: >= 1.9 us each.
self.step_pin.value(0)
self.delay_us(3)
return True