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