imrishabh18/rp2040-motor-controller

The circuit implements a powered USB interface with a W25Q16 flash memory chip, a RP2040 microcontroller, and AO3400A MOSFETs for switch control, enabling USB communication, memory storage, and device power management.

Version
1.0.19
License
unset
Stars
0

firmware/as5600.py

"""Read-only AS5600 single-turn angle feedback. Never burns OTP settings."""
ADDRESS = 0x36


class AS5600:
    def __init__(self, bus):
        self.bus = bus
        self.angle_degrees = None
        self.zero_raw = 0
        self.raw = None

    def sample(self):
        self.angle_degrees = None
        self.raw = None
        data = self.bus.readfrom_mem(ADDRESS, 0x0B, 3)
        if len(data) != 3:
            raise OSError("short encoder response")
        status = data[0]
        if not status & 0x20 or status & 0x18:
            raise ValueError("encoder magnet missing, too weak, or too strong")
        self.raw = ((data[1] & 0x0F) << 8) | data[2]
        self.angle_degrees = ((self.raw - self.zero_raw) & 0x0FFF) * 360 / 4096
        return self.angle_degrees

    def zero(self):
        self.sample()
        self.zero_raw = self.raw
        self.angle_degrees = 0.0