Canberk Sönmez
/
LTC2945_Monitor
LTC2945 ported
main.cpp@2:7e390bcce297, 2017-08-25 (annotated)
- 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?
User | Revision | Line number | New 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, ¤t_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 | } |