mirror of https://github.com/periph/devices
Initial commit for review
parent
c14e02d418
commit
602d50b331
@ -0,0 +1,11 @@
|
|||||||
|
// Copyright 2018 The Periph Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed under the Apache License, Version 2.0
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package ina219 controls a Texas Instruments ina260 current,
|
||||||
|
// voltage and power monitor IC over an i2c bus.
|
||||||
|
//
|
||||||
|
// # Datasheet
|
||||||
|
//
|
||||||
|
// http://www.ti.com/lit/ds/symlink/ina260.pdf
|
||||||
|
package ina260
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
package ina260_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"periph.io/x/conn/v3/i2c/i2creg"
|
||||||
|
"periph.io/x/devices/v3/ina260"
|
||||||
|
"periph.io/x/host/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if _, err := host.Init(); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
busNumber := 0
|
||||||
|
bus, err := i2creg.Open(fmt.Sprintf("/dev/i2c-%d", busNumber))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer bus.Close()
|
||||||
|
|
||||||
|
// Fuel gauge
|
||||||
|
fuelGauge := ina260.New(bus)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
f, err := fuelGauge.Read()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
log.Printf("%f V %f A %f W", f.Voltage, f.Current, f.Power)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,99 @@
|
|||||||
|
package ina260
|
||||||
|
|
||||||
|
import (
|
||||||
|
"periph.io/x/conn/v3/i2c"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
INA260_CHIP_ID uint8 = 0x40
|
||||||
|
INA260_CONFIG uint8 = 0x00 // CONFIGURATION REGISTER (R/W)
|
||||||
|
INA260_CURRENT uint8 = 0x01 // SHUNT VOLTAGE REGISTER (R)
|
||||||
|
INA260_BUSVOLTAGE uint8 = 0x02 // BUS VOLTAGE REGISTER (R)
|
||||||
|
INA260_POWER uint8 = 0x03 // POWER REGISTER (R)
|
||||||
|
INA260_MASK_ENABLE uint8 = 0x06 // MASK ENABLE REGISTER (R/W)
|
||||||
|
INA260_ALERT_LIMIT uint8 = 0x07 // ALERT LIMIT REGISTER (R/W)
|
||||||
|
INA260_MFG_UID uint8 = 0xFE // MANUFACTURER UNIQUE ID REGISTER (R)
|
||||||
|
INA260_DIE_UID uint8 = 0xFF // DIE UNIQUE ID REGISTER (R)
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
type Power struct {
|
||||||
|
Current float64
|
||||||
|
Voltage float64
|
||||||
|
Power float64
|
||||||
|
}
|
||||||
|
|
||||||
|
type ina260 struct {
|
||||||
|
Conn *i2c.Dev
|
||||||
|
Power Power
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(bus i2c.Bus) *ina260 {
|
||||||
|
|
||||||
|
dev := &i2c.Dev{Bus: bus, Addr: uint16(INA260_CHIP_ID)}
|
||||||
|
power := Power{
|
||||||
|
Current: 0,
|
||||||
|
Voltage: 0,
|
||||||
|
Power: 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
ina260 := &ina260{
|
||||||
|
Conn: dev,
|
||||||
|
Power: power,
|
||||||
|
}
|
||||||
|
|
||||||
|
return ina260
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *ina260) Read() (Power, error) {
|
||||||
|
|
||||||
|
var power Power
|
||||||
|
|
||||||
|
reg := []byte{byte(INA260_CURRENT)}
|
||||||
|
currentBytes := make([]byte, 2)
|
||||||
|
if err := i.Conn.Tx(reg, currentBytes); err != nil {
|
||||||
|
return power, err
|
||||||
|
}
|
||||||
|
|
||||||
|
reg = []byte{byte(INA260_BUSVOLTAGE)}
|
||||||
|
voltageBytes := make([]byte, 2)
|
||||||
|
if err := i.Conn.Tx(reg, voltageBytes); err != nil {
|
||||||
|
return power, err
|
||||||
|
}
|
||||||
|
|
||||||
|
reg = []byte{byte(INA260_POWER)}
|
||||||
|
powerBytes := make([]byte, 2)
|
||||||
|
if err := i.Conn.Tx(reg, powerBytes); err != nil {
|
||||||
|
return power, err
|
||||||
|
}
|
||||||
|
|
||||||
|
amps := uint16(currentBytes[0])<<8 + uint16(currentBytes[1])
|
||||||
|
volts := uint16(voltageBytes[0])<<8 + uint16(voltageBytes[1])
|
||||||
|
watts := uint16(powerBytes[0])<<8 + uint16(powerBytes[1])
|
||||||
|
|
||||||
|
power.Voltage = 0.00125 * float64(volts)
|
||||||
|
power.Current = 0.00125 * float64(amps)
|
||||||
|
power.Power = 0.01 * float64(watts) // 10mW/bit
|
||||||
|
|
||||||
|
return power, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ManufacturerId(d *i2c.Dev) (uint16, error) {
|
||||||
|
reg := []byte{byte(INA260_MFG_UID)}
|
||||||
|
manufacturerBytes := make([]byte, 2)
|
||||||
|
if err := d.Tx(reg, manufacturerBytes); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
manufacturerID := uint16(manufacturerBytes[0])<<8 + uint16(manufacturerBytes[1])
|
||||||
|
return manufacturerID, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DieId(d *i2c.Dev) (uint16, error) {
|
||||||
|
reg := []byte{byte(INA260_DIE_UID)}
|
||||||
|
dieBytes := make([]byte, 2)
|
||||||
|
if err := d.Tx(reg, dieBytes); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
dieID := uint16(dieBytes[0])<<8 + uint16(dieBytes[1])
|
||||||
|
return dieID, nil
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue