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)