seveibar/nema17-stepper-motor-driver-tmc2209-usb-pd

RP2040-based USB-C PD stepper-motor controller with TMC2209 drive, AS5600 position feedback, TMP102 thermal shutdown, current/voltage telemetry, RGB status LED, and protected buzzer alarm circuitry.

Version
0.2.0
License
unset
Stars
0

firmware/test_power_status.py

import unittest
from power_telemetry import convert_adc, power_acceptable
from status_led import grb_frame, TIMING_NS

class PowerStatusTests(unittest.TestCase):
    def test_adc_conversion_at_known_voltage_and_current(self):
        v, i = convert_adc(round(12 / 11 / 3.3 * 65535), round(1.5 / 3.3 * 65535))
        self.assertAlmostEqual(v,12,places=3)
        self.assertAlmostEqual(i,1.5,places=3)
    def test_reference_and_zero_calibration(self):
        v, i = convert_adc(32767.5, 32767.5,3.2,0.1)
        self.assertAlmostEqual(v,17.6)
        self.assertAlmostEqual(i,1.5)
        self.assertEqual(convert_adc(0,0,current_zero_v=0.01),(0,0))
    def test_fallback_overvoltage_and_overcurrent_rejected(self):
        for v in [0,5,9,15,20]: self.assertFalse(power_acceptable(v,0.5))
        self.assertTrue(power_acceptable(12,1.5))
        self.assertFalse(power_acceptable(12,1.8))
        self.assertFalse(power_acceptable(float('nan'),0))
    def test_adc_invalid_inputs(self):
        for v,i in [(-1,0),(0,65536)]:
            with self.assertRaises(ValueError): convert_adc(v,i)
    def test_led_color_order_and_brightness_limit(self):
        self.assertEqual(grb_frame(4,2,1),bytes([2,4,1]))
        self.assertEqual(grb_frame(255,-1,99),bytes([0,8,8]))
    def test_led_timing_matches_manufacturer(self):
        h0,l0,h1,l1=TIMING_NS
        self.assertTrue(200<=h0<=350 and 200<=l1<=350)
        self.assertTrue(550<=h1<=1200 and 550<=l0<=1200)
        self.assertEqual(h0+l0,1250)
        self.assertEqual(h1+l1,1250)