Files
drivers/l9110x/l9110x.go
T
deadprogram 1bb1b621c6 all: correct go fmt
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-09-25 13:23:16 +02:00

100 lines
2.3 KiB
Go

// Package l9110x provides a driver to the L9110/L9110S H-bridge chip
// typically used to control DC motors.
//
// Datasheet: https://www.elecrow.com/download/datasheet-l9110.pdf
package l9110x // import "tinygo.org/x/drivers/l9110x"
import (
"machine"
)
// Device is a motor without speed control.
// ia and ib are the directional pins.
type Device struct {
ia, ib machine.Pin
}
// New returns a new Motor driver for GPIO-only operation.
func New(direction1, direction2 machine.Pin) Device {
return Device{
ia: direction1,
ib: direction2,
}
}
// Configure configures the Device.
func (d *Device) Configure() {
d.ia.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.ib.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.Stop()
}
// Forward turns motor on in forward direction.
func (d *Device) Forward() {
d.ia.High()
d.ib.Low()
}
// Backward turns motor on in backward direction.
func (d *Device) Backward() {
d.ia.Low()
d.ib.High()
}
// Stop turns motor off.
func (d *Device) Stop() {
d.ia.Low()
d.ib.Low()
}
// PWM is the interface necessary for controlling the motor driver.
type PWM interface {
Configure(config machine.PWMConfig) error
Channel(pin machine.Pin) (channel uint8, err error)
Top() uint32
Set(channel uint8, value uint32)
SetPeriod(period uint64) error
}
// PWMDevice is a motor with speed control.
// ia and ib are the directional/speed PWM pins.
type PWMDevice struct {
pwm PWM
ca, cb uint8
}
// NewWithSpeed returns a new PWMMotor driver that uses 2 PWM pins to control both direction and speed.
func NewWithSpeed(ca, cb uint8, pwm PWM) PWMDevice {
return PWMDevice{
pwm: pwm,
ca: ca,
cb: cb,
}
}
// Configure configures the PWMDevice. Note that the pins, PWM interface,
// and channels must all already be configured.
func (d *PWMDevice) Configure() (err error) {
d.Stop()
return
}
// Forward turns motor on in forward direction at specific speed as a percentage.
func (d *PWMDevice) Forward(speed uint32) {
d.pwm.Set(d.ca, d.pwm.Top()*speed/100)
d.pwm.Set(d.cb, 0)
}
// Backward turns motor on in backward direction at specific speed as a percentage.
func (d *PWMDevice) Backward(speed uint32) {
d.pwm.Set(d.ca, 0)
d.pwm.Set(d.cb, d.pwm.Top()*speed/100)
}
// Stop turns motor off.
func (d *PWMDevice) Stop() {
d.pwm.Set(d.ca, 0)
d.pwm.Set(d.cb, 0)
}