Last active
December 16, 2020 08:05
-
-
Save zerog2k/c02e94600ccaaa80d051 to your computer and use it in GitHub Desktop.
read TI TMP513/TMP512 (all-in-one current, voltage, temp sensors) via I2C on arduino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// read TI TMP512/TMP513 over I2C | |
// Jens Jensen AF5MI 2014 | |
#include <Wire.h> | |
// address of device - see datasheet, assumes A0 = SCL. | |
#define ADDR 0x5F | |
// current calibration register, see datasheet for calc | |
// I = (V_shunt * CalReg) / 4096 | |
#define ICAL 4096 // R_shunt = 0.10 ohms | |
#define PR_mW 2 // PR multiplier per LSB to get mW result | |
#define CR_mA 0.1f // CR multiplier per LSB to get mA result | |
#define CONFREG1 0b0000100110011111 // config reg 1 - see datasheet | |
#define CFGREG1 0x00 // shunt config | |
#define CFGREG2 0x01 // temp config | |
#define STATUSREG 0x02 | |
#define SMBUSCTLREG 0x03 | |
#define SVR 0x04 // shunt voltage result, 10uV LSB | |
#define BVR 0x05 // bus voltage result, 4mV LSB | |
#define PR 0x06 // power measurement result | |
#define CR 0x07 // current measurement result | |
#define LTR 0x08 // local temp result register | |
#define RTR1 0x09 // remote temp result 1 register | |
#define RTR2 0x0A // remote temp result 2 register | |
#define RTR3 0x0B // remote temp result 3 register | |
#define SCAL 0x15 // shunt calibration register | |
#define RTS1_NFACTOR 0x16 // n-Factor 1 Register 16h (r/w) | |
#define RTS2_NFACTOR 0x17 // n-Factor 2 Register 17h (r/w) | |
#define RTS3_NFACTOR 0x18 // n-Factor 3 Register 18h (r/w) | |
void setup() | |
{ | |
Wire.begin(); // join i2c bus (address optional for master) | |
Serial.begin(9600); // start serial for output | |
Serial.println("started TMP513 reader"); | |
/* | |
// adjust nfactor for remote temp sense 1 | |
Wire.beginTransmission(ADDR); | |
Wire.write(RTS1_NFACTOR); | |
Wire.write(0x00); // NF7–NF0: n-Factor Bits | |
Wire.write(0x00); // HST7–HST0: Hysteresis Register Bits | |
Wire.endTransmission(); | |
// adjust nfactor for remote temp sense 2 | |
Wire.beginTransmission(ADDR); | |
Wire.write(RTS2_NFACTOR); // n-Factor 2 Register 17h (Read/Write) | |
Wire.write(0x00); // NF7–NF0: n-Factor Bits | |
Wire.write(0x00); // HST7–HST0: Hysteresis Register Bits | |
Wire.endTransmission(); | |
// setup config 1 register | |
Wire.beginTransmission(ADDR); | |
Wire.write(CFGREG1); | |
byte cr1hi = CONFREG1 >> 8; | |
byte cr1lo = CONFREG1 & 0xFF; | |
Wire.write(cr1hi); | |
Wire.write(cr1lo); | |
Wire.endTransmission(); | |
*/ | |
// setup current calibration register | |
Wire.beginTransmission(ADDR); | |
Wire.write(SCAL); | |
Wire.write(highByte(ICAL)); | |
Wire.write(lowByte(ICAL)); | |
Wire.endTransmission(); | |
} | |
float getTempC( byte reg ) { | |
// valid range: ±256C° | |
int raw = getRegRaw(reg); | |
bool diodeOpen = raw & 0x01; | |
float tempC = (raw >> 3) * 0.0625; | |
if (diodeOpen) | |
tempC = -1024; // invalid reading | |
return tempC; | |
} | |
int getRegRaw(byte reg) { | |
// Send the register address | |
Wire.beginTransmission(ADDR); | |
Wire.write(reg); | |
Wire.endTransmission(); | |
// Request the data | |
Wire.requestFrom(ADDR, 2); | |
byte highbyte = Wire.read(); | |
byte lowbyte = Wire.read(); | |
word raw = word(highbyte,lowbyte); | |
return raw; | |
} | |
float tempCtoF ( float tempC ) { | |
float tempF = (tempC * 9.0) / 5.0 + 32.0; | |
return tempF; | |
} | |
float busVoltageResult ( int bvraw ) { | |
float busVoltage = (bvraw >> 3) * 0.004; | |
return busVoltage; | |
} | |
void loop() | |
{ | |
// get data | |
float ltrTempF = tempCtoF(getTempC(LTR)); | |
float rtr1TempF = tempCtoF(getTempC(RTR1)); | |
float rtr2TempF = tempCtoF(getTempC(RTR2)); | |
float rtr3TempF = tempCtoF(getTempC(RTR3)); | |
int bvrVal = getRegRaw(BVR); | |
float busVoltage = busVoltageResult(bvrVal); | |
int svrVal = getRegRaw(SVR); | |
int pwrVal = getRegRaw(PR) * PR_mW; | |
int curVal = getRegRaw(CR) * CR_mA; | |
Serial.print(F("LTR(F): ")); | |
Serial.print(ltrTempF); | |
Serial.print(F(", RTR1(F): ")); | |
Serial.print(rtr1TempF); | |
Serial.print(F(", RTR2(F): ")); | |
Serial.print(rtr2TempF); | |
Serial.print(F(", RTR3(F): ")); | |
Serial.print(rtr3TempF); | |
Serial.println(); | |
Serial.print(F("SVR: ")); | |
Serial.print(svrVal); | |
Serial.print(F(", BVR: ")); | |
Serial.print(bvrVal); | |
Serial.print(F(", BusVoltage(V): ")); | |
Serial.print(busVoltage); | |
Serial.print(F(", PR(mW): ")); | |
Serial.print(pwrVal); | |
Serial.print(F(", CR(mA): ")); | |
Serial.print(curVal); | |
Serial.println(); | |
Serial.println(); | |
delay(2000); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment