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/test_current_status.py

import unittest
from current_monitor import CurrentMonitor, current_amperes
from status_led import StatusLed, health_color
from thermal_policy import ThermalPolicy

class ADC:
    def __init__(self, value): self.value = value
    def read_u16(self): return self.value

class PWM:
    def freq(self, hz): self.hz = hz
    def duty_u16(self, value): self.duty = value
    def deinit(self): self.closed = True

class CurrentStatusTests(unittest.TestCase):
    def test_bidirectional_scale(self):
        for amperes in (-1, 0, 1):
            raw = (1.65 + amperes) / 3.3 * 65535
            self.assertAlmostEqual(current_amperes(raw), amperes)

    def test_independent_channels_and_clipping(self):
        a, b = ADC(round(2.65/3.3*65535)), ADC(round(.65/3.3*65535))
        m = CurrentMonitor(a,b)
        values = m.sample()
        self.assertAlmostEqual(values[0], 1, places=4)
        self.assertAlmostEqual(values[1], -1, places=4)
        self.assertFalse(m.clipped)
        a.value = 65535
        m.sample()
        self.assertTrue(m.clipped)
        a.value = 32768
        m.sample()
        self.assertFalse(m.clipped)

    def test_health_and_pwm_shutdown(self):
        p = ThermalPolicy()
        self.assertEqual(health_color(p), (1,0,0))
        p.sample(25)
        self.assertEqual(health_color(p), (0,0,1))
        self.assertTrue(p.arm())
        self.assertEqual(health_color(p), (0,1,0))
        p.sample(68)
        self.assertEqual(health_color(p), (1,0.35,0))
        p.sample(80)
        self.assertEqual(health_color(p), (1,0,0))
        p.sample(25)
        self.assertEqual(health_color(p), (1,0,0))
        p.trip('motor driver fault')
        self.assertEqual(health_color(p), (1,0,0))
        channels = [PWM(),PWM(),PWM()]
        led = StatusLed(*channels)
        led.update(p)
        self.assertEqual([c.duty for c in channels], [65535,0,0])
        led.close()
        self.assertTrue(all(c.duty == 0 and c.closed for c in channels))

if __name__ == '__main__': unittest.main()