LTC2945 ported

Dependencies:   mbed

Committer:
odtulumbedder
Date:
Fri Aug 25 07:46:48 2017 +0000
Revision:
2:7e390bcce297
Parent:
0:6be57f391716
Child:
3:2ab78e7e8518
Now, it's working.; The problems were:; 1- I forgot ack = 0 in the main loop.; 2- Adding other calls between I2C calls causes latency, which interrupts I2C communication.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
odtulumbedder 0:6be57f391716 1 #include "mbed.h"
odtulumbedder 0:6be57f391716 2 #include <I2C.h>
odtulumbedder 0:6be57f391716 3 #include "LT_I2C.h"
odtulumbedder 0:6be57f391716 4 #include "LTC2945.h"
odtulumbedder 0:6be57f391716 5
odtulumbedder 2:7e390bcce297 6 I2C i2c(p9, p10);
odtulumbedder 0:6be57f391716 7 // sda, scl
odtulumbedder 0:6be57f391716 8
odtulumbedder 2:7e390bcce297 9 extern I2C* i2c_object;
odtulumbedder 2:7e390bcce297 10
odtulumbedder 0:6be57f391716 11 Serial pc(USBTX, USBRX);
odtulumbedder 0:6be57f391716 12
odtulumbedder 2:7e390bcce297 13 const int ltc2945_addr = 0xDE>>1;
odtulumbedder 0:6be57f391716 14
odtulumbedder 2:7e390bcce297 15 int test_write(int byte) {
odtulumbedder 2:7e390bcce297 16 return i2c_object->write(byte);
odtulumbedder 2:7e390bcce297 17 }
odtulumbedder 2:7e390bcce297 18
odtulumbedder 2:7e390bcce297 19 #define ASSERT(x) if (! (x)) { printf("%s:%d %s failed!\n", __FILE__, __LINE__, #x); }
odtulumbedder 2:7e390bcce297 20 #define DEBUG_LINE printf("DEBUG: %s:%d\n", __FILE__, __LINE__);
odtulumbedder 0:6be57f391716 21
odtulumbedder 0:6be57f391716 22 int main() {
odtulumbedder 2:7e390bcce297 23 ASSERT(lt_i2c_init_attach(&i2c) == LT_I2C_INIT_FINE);
odtulumbedder 2:7e390bcce297 24 i2c.frequency(10000);
odtulumbedder 0:6be57f391716 25
odtulumbedder 0:6be57f391716 26 const float LTC2945_DELTA_SENSE_lsb = 2.5006105E-05; //!< Typical Delta lsb weight in volts
odtulumbedder 0:6be57f391716 27 const float LTC2945_VIN_lsb = 2.5006105E-02; //!< Typical VIN lsb weight in volts
odtulumbedder 0:6be57f391716 28 const float LTC2945_Power_lsb = 6.25305E-07; //!< Typical POWER lsb weight in V^2
odtulumbedder 0:6be57f391716 29
odtulumbedder 0:6be57f391716 30 int32_t power_code;
odtulumbedder 0:6be57f391716 31 uint16_t current_code;
odtulumbedder 0:6be57f391716 32 uint16_t VIN_code;
odtulumbedder 0:6be57f391716 33 uint8_t adc_command;
odtulumbedder 0:6be57f391716 34 int8_t ack;
odtulumbedder 0:6be57f391716 35 float resistor;
odtulumbedder 0:6be57f391716 36 float power;
odtulumbedder 0:6be57f391716 37 float current;
odtulumbedder 0:6be57f391716 38 float VIN;
odtulumbedder 0:6be57f391716 39
odtulumbedder 0:6be57f391716 40 while (true) {
odtulumbedder 2:7e390bcce297 41 ack = 0;
odtulumbedder 0:6be57f391716 42 adc_command = LTC2945_SENSE_MONITOR | LTC2945_CONTINUOUS_MODE; // Builds commands to set LTC2945 to continuous mode
odtulumbedder 2:7e390bcce297 43 ack |= LTC2945_write(ltc2945_addr, LTC2945_CONTROL_REG, adc_command); // Sets the LTC2945 to continuous mode
odtulumbedder 0:6be57f391716 44 ASSERT(ack == 0);
odtulumbedder 2:7e390bcce297 45 resistor = .0182445; // Resistor Value On Demo Board
odtulumbedder 2:7e390bcce297 46
odtulumbedder 2:7e390bcce297 47 ack |= LTC2945_read_24_bits(ltc2945_addr, LTC2945_POWER_MSB2_REG, &power_code); // Reads the ADC registers that contains V^2
odtulumbedder 0:6be57f391716 48 ASSERT(ack == 0);
odtulumbedder 0:6be57f391716 49 power = LTC2945_code_to_power(power_code, resistor, LTC2945_Power_lsb); // Calculates power from power code, resistor value and power lsb
odtulumbedder 2:7e390bcce297 50
odtulumbedder 2:7e390bcce297 51 ack |= LTC2945_read_12_bits(ltc2945_addr, LTC2945_DELTA_SENSE_MSB_REG, &current_code); // Reads the voltage code across sense resistor
odtulumbedder 0:6be57f391716 52 ASSERT(ack == 0);
odtulumbedder 0:6be57f391716 53 current = LTC2945_code_to_current(current_code, resistor, LTC2945_DELTA_SENSE_lsb); // Calculates current from current code, resistor value and current lsb
odtulumbedder 0:6be57f391716 54
odtulumbedder 2:7e390bcce297 55 ack |= LTC2945_read_12_bits(ltc2945_addr, LTC2945_VIN_MSB_REG, &VIN_code); // Reads VIN voltage code
odtulumbedder 0:6be57f391716 56 ASSERT(ack == 0);
odtulumbedder 0:6be57f391716 57 VIN = LTC2945_VIN_code_to_voltage(VIN_code, LTC2945_VIN_lsb); // Calculates VIN voltage from VIN code and lsb
odtulumbedder 2:7e390bcce297 58
odtulumbedder 2:7e390bcce297 59
odtulumbedder 2:7e390bcce297 60 printf("power: %f, current: %f, Vin: %f\n", power, current, VIN);
odtulumbedder 2:7e390bcce297 61 wait_ms(500);
odtulumbedder 0:6be57f391716 62 }
odtulumbedder 0:6be57f391716 63 }