mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
6d431e0726
INA219: add INA219 driver
184 lines
4.3 KiB
Go
184 lines
4.3 KiB
Go
package ina219
|
|
|
|
type Config struct {
|
|
// BusVoltageRange sets the bus voltage range.
|
|
BusVoltageRange BusVoltageRange
|
|
|
|
// PGA sets the programmable gain amplifier.
|
|
PGA PGA
|
|
|
|
// BusADC sets the bus ADC resolution.
|
|
BusADC BusADC
|
|
|
|
// ShuntADC sets the shunt ADC resolution.
|
|
ShuntADC ShuntADC
|
|
|
|
// Mode sets the operating mode.
|
|
Mode Mode
|
|
|
|
// Calibration sets the calibration value for the expected
|
|
// voltage and current values.
|
|
Calibration Calibration
|
|
|
|
// 1000 / uA per bit
|
|
CurrentDivider float32
|
|
|
|
// 1mW per bit
|
|
PowerMultiplier float32
|
|
}
|
|
|
|
// RegisterValue returns the register value of the configuration.
|
|
func (c *Config) RegisterValue() uint16 {
|
|
return c.BusVoltageRange.RegisterValue() |
|
|
c.PGA.RegisterValue() |
|
|
c.BusADC.RegisterValue() |
|
|
c.ShuntADC.RegisterValue() |
|
|
c.Mode.RegisterValue()
|
|
}
|
|
|
|
// Generate a new configuration from a register value.
|
|
func NewConfig(config int16, calibration int16) Config {
|
|
return Config{
|
|
BusVoltageRange: BusVoltageRange(config >> 13 & 0x1),
|
|
PGA: PGA(config >> 11 & 0x3),
|
|
BusADC: BusADC(config >> 7 & 0xF),
|
|
ShuntADC: ShuntADC(config >> 3 & 0xF),
|
|
Mode: Mode(config & 0x7),
|
|
Calibration: Calibration(calibration),
|
|
}
|
|
}
|
|
|
|
// Configurations from
|
|
// https://github.com/adafruit/Adafruit_INA219/blob/master/Adafruit_INA219.cpp
|
|
var (
|
|
// Config32V2A is a configuration for a 32V 2A range.
|
|
Config32V2A = Config{
|
|
BusVoltageRange: Range32V,
|
|
PGA: PGA8,
|
|
BusADC: ADC12,
|
|
ShuntADC: SADC12,
|
|
Mode: ModeContShuntBus,
|
|
Calibration: Calibration16V400mA,
|
|
CurrentDivider: 10.0,
|
|
PowerMultiplier: 2.0,
|
|
}
|
|
|
|
// Config32V1A is a configuration for a 32V 1A range.
|
|
Config32V1A = Config{
|
|
BusVoltageRange: Range32V,
|
|
PGA: PGA8,
|
|
BusADC: ADC12,
|
|
ShuntADC: SADC12,
|
|
Mode: ModeContShuntBus,
|
|
Calibration: Calibration32V1A,
|
|
CurrentDivider: 25.0,
|
|
PowerMultiplier: 0.8,
|
|
}
|
|
|
|
// Config16V400mA is a configuration for a 16V 400mA range.
|
|
Config16V400mA = Config{
|
|
BusVoltageRange: Range16V,
|
|
PGA: PGA1,
|
|
BusADC: ADC12,
|
|
ShuntADC: SADC12,
|
|
Mode: ModeContShuntBus,
|
|
Calibration: Calibration16V400mA,
|
|
CurrentDivider: 20.0,
|
|
PowerMultiplier: 1.0,
|
|
}
|
|
)
|
|
|
|
// BusVoltageRange is the bus voltage range.
|
|
type BusVoltageRange int8
|
|
|
|
const (
|
|
Range16V BusVoltageRange = 0 // 0-16V
|
|
Range32V BusVoltageRange = 1 // 0-32V
|
|
)
|
|
|
|
func (r BusVoltageRange) RegisterValue() uint16 {
|
|
return uint16(r) << 13
|
|
}
|
|
|
|
// PGA is the programmable gain amplifier.
|
|
type PGA int8
|
|
|
|
const (
|
|
PGA1 PGA = 0 // 40mV
|
|
PGA2 PGA = 1 // 80mV
|
|
PGA4 PGA = 2 // 160mV
|
|
PGA8 PGA = 3 // 320mV
|
|
)
|
|
|
|
func (p PGA) RegisterValue() uint16 {
|
|
return uint16(p) << 11
|
|
}
|
|
|
|
// BusADC is the bus ADC resolution.
|
|
type BusADC int8
|
|
|
|
const (
|
|
ADC9 BusADC = 0 // 9-bit
|
|
ADC10 BusADC = 1 // 10-bit
|
|
ADC11 BusADC = 2 // 11-bit
|
|
ADC12 BusADC = 3 // 12-bit
|
|
)
|
|
|
|
func (b BusADC) RegisterValue() uint16 {
|
|
return uint16(b) << 7
|
|
}
|
|
|
|
// ShuntADC is the shunt ADC resolution.
|
|
type ShuntADC int8
|
|
|
|
const (
|
|
SADC9 ShuntADC = 0 // 9-bit
|
|
SADC10 ShuntADC = 1 // 10-bit
|
|
SADC11 ShuntADC = 2 // 11-bit
|
|
SADC12 ShuntADC = 3 // 12-bit
|
|
)
|
|
|
|
func (s ShuntADC) RegisterValue() uint16 {
|
|
return uint16(s) << 3
|
|
}
|
|
|
|
// Mode is the operating mode.
|
|
type Mode int8
|
|
|
|
const (
|
|
ModePowerDown Mode = 0 // power-down
|
|
ModeTrigShunt Mode = 1 // triggered shunt voltage
|
|
ModeTrigBus Mode = 2 // triggered bus voltage
|
|
ModeTrigShuntBus Mode = 3 // triggered shunt and bus voltage
|
|
ModeADCOff Mode = 4 // ADC off
|
|
ModeContShunt Mode = 5 // continuous shunt voltage
|
|
ModeContBus Mode = 6 // continuous bus voltage
|
|
ModeContShuntBus Mode = 7 // continuous shunt and bus voltage
|
|
)
|
|
|
|
// ModeTriggered is a mask for triggered modes.
|
|
const ModeTriggeredMask Mode = 0x4
|
|
|
|
// ModeTriggered returns true if the mode is a triggered mode.
|
|
func ModeTriggered(m Mode) bool {
|
|
return m != ModePowerDown && m&ModeTriggeredMask == 0
|
|
}
|
|
|
|
func (m Mode) RegisterValue() uint16 {
|
|
return uint16(m)
|
|
}
|
|
|
|
// Calibration is the calibration register for the INA219. Values from:
|
|
// https://github.com/adafruit/Adafruit_INA219/blob/master/Adafruit_INA219.cpp
|
|
type Calibration uint16
|
|
|
|
const (
|
|
Calibration32V2A Calibration = 4096
|
|
Calibration32V1A Calibration = 10240
|
|
Calibration16V400mA Calibration = 8192
|
|
)
|
|
|
|
func (c Calibration) RegisterValue() uint16 {
|
|
return uint16(c)
|
|
}
|