You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
from machine import Pin, PWM
|
|
|
|
|
|
class PWMMotor:
|
|
def __init__(self, pin_ia, pin_ib, freq=1000, flip_dir=False):
|
|
"""
|
|
:param pin_ia: Pin connected to IA on L9110S
|
|
:param pin_ib: Pin connected to IB on L9110S
|
|
:param freq: PWM frequency (default 1000Hz)
|
|
:param flip_dir: Boolean to reverse logical forward/backward
|
|
"""
|
|
# Initialize PWM on both pins
|
|
self._pwm_a = PWM(Pin(pin_ia), freq=freq)
|
|
self._pwm_b = PWM(Pin(pin_ib), freq=freq)
|
|
|
|
# Start with motor off
|
|
self._pwm_a.duty_u16(0)
|
|
self._pwm_b.duty_u16(0)
|
|
|
|
self._flip_dir = flip_dir
|
|
self._speed = 0.0 # Range -1.0 to 1.0
|
|
|
|
def set_speed(self, speed):
|
|
"""
|
|
Sets motor speed and direction.
|
|
:param speed: Float between -1.0 (reverse) and 1.0 (forward)
|
|
"""
|
|
self._speed = max(-1.0, min(1.0, speed))
|
|
|
|
# Adjust for flip_dir preference
|
|
effective_speed = -self._speed if self._flip_dir else self._speed
|
|
|
|
# Convert 0.0-1.0 to 16-bit duty cycle (0-65535)
|
|
duty = int(abs(effective_speed) * 65535)
|
|
|
|
if effective_speed > 0:
|
|
# Forward: PWM on A, B held at 0
|
|
self._pwm_a.duty_u16(duty)
|
|
self._pwm_b.duty_u16(0)
|
|
elif effective_speed < 0:
|
|
# Reverse: B held at 0, PWM on B
|
|
self._pwm_a.duty_u16(0)
|
|
self._pwm_b.duty_u16(duty)
|
|
else:
|
|
# Stop
|
|
self.stop()
|
|
|
|
def stop(self):
|
|
self._pwm_a.duty_u16(0)
|
|
self._pwm_b.duty_u16(0)
|
|
self._speed = 0.0
|
|
|
|
def deinit(self):
|
|
"""Release the PWM hardware"""
|
|
self._pwm_a.deinit()
|
|
self._pwm_b.deinit()
|