LTC2945 ported

Dependencies:   mbed

Committer:
odtulumbedder
Date:
Wed Sep 20 09:03:56 2017 +0000
Revision:
4:d32eaca53504
Parent:
0:6be57f391716
I decided to remove the C-linkage specifiers, they are really not that necessary.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
odtulumbedder 0:6be57f391716 1 /*!
odtulumbedder 0:6be57f391716 2 LTC2945: 12-Bit Wide Range Power Monitor
odtulumbedder 0:6be57f391716 3
odtulumbedder 0:6be57f391716 4 @verbatim
odtulumbedder 0:6be57f391716 5
odtulumbedder 0:6be57f391716 6 The LTC2945 is a rail-to-rail system monitor that measures current, voltage, and
odtulumbedder 0:6be57f391716 7 power. It features an operating range of 2.7V to 80V and includes a shunt
odtulumbedder 0:6be57f391716 8 regulator for supplies above 80V to allow flexibility in the selection of input
odtulumbedder 0:6be57f391716 9 supply. The current measurement range of 0V to 80V is independent of the input
odtulumbedder 0:6be57f391716 10 supply. An onboard 0.75% accurate 12-bit ADC measures load current, input
odtulumbedder 0:6be57f391716 11 voltage and an auxiliary external voltage. A 24-bit power value is generated by
odtulumbedder 0:6be57f391716 12 digitally multiplying the measured 12-bit load current and input voltage data.
odtulumbedder 0:6be57f391716 13 Minimum and maximum values are stored and an overrange alert with programmable
odtulumbedder 0:6be57f391716 14 thresholds minimizes the need for software polling. Data is reported via a
odtulumbedder 0:6be57f391716 15 standard I2C interface. Shutdown mode reduces power consumption to 20uA.
odtulumbedder 0:6be57f391716 16
odtulumbedder 0:6be57f391716 17 @endverbatim
odtulumbedder 0:6be57f391716 18
odtulumbedder 0:6be57f391716 19 http://www.linear.com/product/LTC2945
odtulumbedder 0:6be57f391716 20
odtulumbedder 0:6be57f391716 21 http://www.linear.com/product/ltc2945#demoboards
odtulumbedder 0:6be57f391716 22
odtulumbedder 0:6be57f391716 23 REVISION HISTORY
odtulumbedder 0:6be57f391716 24 $Revision: 6237 $
odtulumbedder 0:6be57f391716 25 $Date: 2016-12-20 15:09:16 -0800 (Tue, 20 Dec 2016) $
odtulumbedder 0:6be57f391716 26
odtulumbedder 0:6be57f391716 27 Copyright (c) 2013, Linear Technology Corp.(LTC)
odtulumbedder 0:6be57f391716 28 All rights reserved.
odtulumbedder 0:6be57f391716 29
odtulumbedder 0:6be57f391716 30 Redistribution and use in source and binary forms, with or without
odtulumbedder 0:6be57f391716 31 modification, are permitted provided that the following conditions are met:
odtulumbedder 0:6be57f391716 32
odtulumbedder 0:6be57f391716 33 1. Redistributions of source code must retain the above copyright notice, this
odtulumbedder 0:6be57f391716 34 list of conditions and the following disclaimer.
odtulumbedder 0:6be57f391716 35 2. Redistributions in binary form must reproduce the above copyright notice,
odtulumbedder 0:6be57f391716 36 this list of conditions and the following disclaimer in the documentation
odtulumbedder 0:6be57f391716 37 and/or other materials provided with the distribution.
odtulumbedder 0:6be57f391716 38
odtulumbedder 0:6be57f391716 39 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
odtulumbedder 0:6be57f391716 40 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
odtulumbedder 0:6be57f391716 41 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
odtulumbedder 0:6be57f391716 42 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
odtulumbedder 0:6be57f391716 43 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
odtulumbedder 0:6be57f391716 44 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
odtulumbedder 0:6be57f391716 45 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
odtulumbedder 0:6be57f391716 46 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
odtulumbedder 0:6be57f391716 47 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
odtulumbedder 0:6be57f391716 48 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
odtulumbedder 0:6be57f391716 49
odtulumbedder 0:6be57f391716 50 The views and conclusions contained in the software and documentation are those
odtulumbedder 0:6be57f391716 51 of the authors and should not be interpreted as representing official policies,
odtulumbedder 0:6be57f391716 52 either expressed or implied, of Linear Technology Corp.
odtulumbedder 0:6be57f391716 53
odtulumbedder 0:6be57f391716 54 The Linear Technology Linduino is not affiliated with the official Arduino team.
odtulumbedder 0:6be57f391716 55 However, the Linduino is only possible because of the Arduino team's commitment
odtulumbedder 0:6be57f391716 56 to the open-source community. Please, visit http://www.arduino.cc and
odtulumbedder 0:6be57f391716 57 http://store.arduino.cc , and consider a purchase that will help fund their
odtulumbedder 0:6be57f391716 58 ongoing work.
odtulumbedder 0:6be57f391716 59 */
odtulumbedder 0:6be57f391716 60
odtulumbedder 0:6be57f391716 61 //! @ingroup Power_Monitors
odtulumbedder 0:6be57f391716 62 //! @{
odtulumbedder 0:6be57f391716 63 //! @defgroup LTC2945 LTC2945: 12-Bit Wide Range Power Monitor
odtulumbedder 0:6be57f391716 64 //! @}
odtulumbedder 0:6be57f391716 65
odtulumbedder 0:6be57f391716 66 /*! @file
odtulumbedder 0:6be57f391716 67 @ingroup LTC2945
odtulumbedder 0:6be57f391716 68 Library for LTC2945 12-Bit Wide Range Power Monitor
odtulumbedder 0:6be57f391716 69 */
odtulumbedder 0:6be57f391716 70
odtulumbedder 0:6be57f391716 71 #include "LT_I2C.h"
odtulumbedder 0:6be57f391716 72 #include "LTC2945.h"
odtulumbedder 0:6be57f391716 73
odtulumbedder 0:6be57f391716 74 /* compatibility definitions */
odtulumbedder 0:6be57f391716 75
odtulumbedder 0:6be57f391716 76 #define i2c_start lt_i2c_start
odtulumbedder 0:6be57f391716 77 #define i2c_stop lt_i2c_stop
odtulumbedder 0:6be57f391716 78 #define i2c_write lt_i2c_write
odtulumbedder 0:6be57f391716 79 #define i2c_write_byte_data lt_i2c_write_byte_data
odtulumbedder 0:6be57f391716 80 #define i2c_write_word_data lt_i2c_write_word_data
odtulumbedder 0:6be57f391716 81 #define i2c_write_block_data lt_i2c_write_block_data
odtulumbedder 0:6be57f391716 82 #define i2c_read lt_i2c_read
odtulumbedder 0:6be57f391716 83 #define i2c_read_byte_data lt_i2c_read_byte_data
odtulumbedder 0:6be57f391716 84 #define i2c_read_word_data lt_i2c_read_word_data
odtulumbedder 0:6be57f391716 85 #define i2c_read_block_data lt_i2c_read_block_data
odtulumbedder 0:6be57f391716 86
odtulumbedder 0:6be57f391716 87 /* definitions in Linduino.h, that doesn't exist here */
odtulumbedder 0:6be57f391716 88 //! @todo Make a note about whether Arduino/Linduino is Big Endian or Little Endian. Raspberry Pi appears to be the opposite.
odtulumbedder 0:6be57f391716 89 //! This union splits one int32_t (32-bit signed integer) or uint32_t (32-bit unsigned integer)
odtulumbedder 0:6be57f391716 90 //! into four uint8_t's (8-bit unsigned integers) and vice versa.
odtulumbedder 0:6be57f391716 91 union LT_union_int32_4bytes
odtulumbedder 0:6be57f391716 92 {
odtulumbedder 0:6be57f391716 93 int32_t LT_int32; //!< 32-bit signed integer to be converted to four bytes
odtulumbedder 0:6be57f391716 94 uint32_t LT_uint32; //!< 32-bit unsigned integer to be converted to four bytes
odtulumbedder 0:6be57f391716 95 uint8_t LT_byte[4]; //!< 4 bytes (unsigned 8-bit integers) to be converted to a 32-bit signed or unsigned integer
odtulumbedder 0:6be57f391716 96 };
odtulumbedder 0:6be57f391716 97
odtulumbedder 0:6be57f391716 98 // Write an 8-bit code to the LTC2945.
odtulumbedder 0:6be57f391716 99 int8_t LTC2945_write(uint8_t i2c_address, uint8_t adc_command, uint8_t code)
odtulumbedder 0:6be57f391716 100 // The function returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.
odtulumbedder 0:6be57f391716 101 {
odtulumbedder 0:6be57f391716 102 int32_t ack;
odtulumbedder 0:6be57f391716 103
odtulumbedder 0:6be57f391716 104 ack = i2c_write_byte_data(i2c_address, adc_command, code);
odtulumbedder 0:6be57f391716 105
odtulumbedder 0:6be57f391716 106 return ack;
odtulumbedder 0:6be57f391716 107
odtulumbedder 0:6be57f391716 108 }
odtulumbedder 0:6be57f391716 109
odtulumbedder 0:6be57f391716 110 // Write a 16-bit code to the LTC2945.
odtulumbedder 0:6be57f391716 111 int8_t LTC2945_write_16_bits(uint8_t i2c_address, uint8_t adc_command, uint16_t code)
odtulumbedder 0:6be57f391716 112 // The function returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.
odtulumbedder 0:6be57f391716 113 {
odtulumbedder 0:6be57f391716 114 int8_t ack;
odtulumbedder 0:6be57f391716 115
odtulumbedder 0:6be57f391716 116 ack = i2c_write_word_data(i2c_address, adc_command, code);
odtulumbedder 0:6be57f391716 117 return(ack);
odtulumbedder 0:6be57f391716 118 }
odtulumbedder 0:6be57f391716 119
odtulumbedder 0:6be57f391716 120 // Write a 24-bit code to the LTC2945.
odtulumbedder 0:6be57f391716 121 int8_t LTC2945_write_24_bits(uint8_t i2c_address, uint8_t adc_command, int32_t code)
odtulumbedder 0:6be57f391716 122 // The function returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.
odtulumbedder 0:6be57f391716 123 {
odtulumbedder 0:6be57f391716 124 int8_t ack;
odtulumbedder 0:6be57f391716 125
odtulumbedder 0:6be57f391716 126 LT_union_int32_4bytes data;
odtulumbedder 0:6be57f391716 127 data.LT_int32 = code;
odtulumbedder 0:6be57f391716 128
odtulumbedder 0:6be57f391716 129 ack = i2c_write_block_data(i2c_address, adc_command, (uint8_t) 3, data.LT_byte);
odtulumbedder 0:6be57f391716 130
odtulumbedder 0:6be57f391716 131 return(ack);
odtulumbedder 0:6be57f391716 132 }
odtulumbedder 0:6be57f391716 133
odtulumbedder 0:6be57f391716 134 // Reads an 8-bit adc_code from LTC2945
odtulumbedder 0:6be57f391716 135 int8_t LTC2945_read(uint8_t i2c_address, uint8_t adc_command, uint8_t *adc_code)
odtulumbedder 0:6be57f391716 136 // The function returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.
odtulumbedder 0:6be57f391716 137 {
odtulumbedder 0:6be57f391716 138 int32_t ack;
odtulumbedder 0:6be57f391716 139
odtulumbedder 0:6be57f391716 140 ack = i2c_read_byte_data(i2c_address, adc_command, adc_code);
odtulumbedder 0:6be57f391716 141
odtulumbedder 0:6be57f391716 142 return ack;
odtulumbedder 0:6be57f391716 143 }
odtulumbedder 0:6be57f391716 144
odtulumbedder 0:6be57f391716 145 // Reads a 12-bit adc_code from LTC2945
odtulumbedder 0:6be57f391716 146 int8_t LTC2945_read_12_bits(uint8_t i2c_address, uint8_t adc_command, uint16_t *adc_code)
odtulumbedder 0:6be57f391716 147 // The function returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.
odtulumbedder 0:6be57f391716 148 {
odtulumbedder 0:6be57f391716 149 // Use union type defined in Linduino.h to combine two uint8_t's (8-bit unsigned integers) into one uint16_t (unsigned 16-bit integer)
odtulumbedder 0:6be57f391716 150 // Then, shift by 4 bits and return in *adc_code
odtulumbedder 0:6be57f391716 151 int32_t ack;
odtulumbedder 0:6be57f391716 152
odtulumbedder 0:6be57f391716 153 ack = i2c_read_word_data(i2c_address, adc_command, adc_code);
odtulumbedder 0:6be57f391716 154
odtulumbedder 0:6be57f391716 155 *adc_code >>= 4;
odtulumbedder 0:6be57f391716 156 return ack;
odtulumbedder 0:6be57f391716 157 }
odtulumbedder 0:6be57f391716 158
odtulumbedder 0:6be57f391716 159 // Reads a 16-bit adc_code from LTC2945
odtulumbedder 0:6be57f391716 160 int8_t LTC2945_read_16_bits(uint8_t i2c_address, uint8_t adc_command, uint16_t *adc_code)
odtulumbedder 0:6be57f391716 161 // The function returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.
odtulumbedder 0:6be57f391716 162 {
odtulumbedder 0:6be57f391716 163 int32_t ack;
odtulumbedder 0:6be57f391716 164
odtulumbedder 0:6be57f391716 165 ack = i2c_read_word_data(i2c_address, adc_command, adc_code);
odtulumbedder 0:6be57f391716 166
odtulumbedder 0:6be57f391716 167 return ack;
odtulumbedder 0:6be57f391716 168 }
odtulumbedder 0:6be57f391716 169
odtulumbedder 0:6be57f391716 170 // Reads a 24-bit adc_code from LTC2945
odtulumbedder 0:6be57f391716 171 int8_t LTC2945_read_24_bits(uint8_t i2c_address, uint8_t adc_command, int32_t *adc_code)
odtulumbedder 0:6be57f391716 172 // The function returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.
odtulumbedder 0:6be57f391716 173 {
odtulumbedder 0:6be57f391716 174 int8_t ack;
odtulumbedder 0:6be57f391716 175
odtulumbedder 0:6be57f391716 176 LT_union_int32_4bytes data;
odtulumbedder 0:6be57f391716 177
odtulumbedder 0:6be57f391716 178 ack = i2c_read_block_data(i2c_address, adc_command, (uint8_t)3, data.LT_byte);
odtulumbedder 0:6be57f391716 179
odtulumbedder 0:6be57f391716 180 *adc_code = 0x0FFFFFF & data.LT_int32;
odtulumbedder 0:6be57f391716 181 return(ack);
odtulumbedder 0:6be57f391716 182 }
odtulumbedder 0:6be57f391716 183
odtulumbedder 0:6be57f391716 184 // Calculate the LTC2945 VIN voltage
odtulumbedder 0:6be57f391716 185 float LTC2945_VIN_code_to_voltage(uint16_t adc_code, float LTC2945_VIN_lsb)
odtulumbedder 0:6be57f391716 186 // Returns the VIN Voltage in Volts
odtulumbedder 0:6be57f391716 187 {
odtulumbedder 0:6be57f391716 188 float voltage;
odtulumbedder 0:6be57f391716 189 voltage = (float)adc_code*LTC2945_VIN_lsb; //! 1) Calculate voltage from code and lsb
odtulumbedder 0:6be57f391716 190 return(voltage);
odtulumbedder 0:6be57f391716 191 }
odtulumbedder 0:6be57f391716 192
odtulumbedder 0:6be57f391716 193 // Calculate the LTC2945 ADIN voltage
odtulumbedder 0:6be57f391716 194 float LTC2945_ADIN_code_to_voltage(uint16_t adc_code, float LTC2945_ADIN_lsb)
odtulumbedder 0:6be57f391716 195 // Returns the ADIN Voltage in Volts
odtulumbedder 0:6be57f391716 196 {
odtulumbedder 0:6be57f391716 197 float adc_voltage;
odtulumbedder 0:6be57f391716 198 adc_voltage = (float)adc_code*LTC2945_ADIN_lsb; //! 1) Calculate voltage from code and ADIN lsb
odtulumbedder 0:6be57f391716 199 return(adc_voltage);
odtulumbedder 0:6be57f391716 200 }
odtulumbedder 0:6be57f391716 201
odtulumbedder 0:6be57f391716 202 // Calculate the LTC2945 current with a sense resistor
odtulumbedder 0:6be57f391716 203 float LTC2945_code_to_current(uint16_t adc_code, float resistor, float LTC2945_DELTA_SENSE_lsb)
odtulumbedder 0:6be57f391716 204 // Returns the LTC2945 current
odtulumbedder 0:6be57f391716 205 {
odtulumbedder 0:6be57f391716 206 float voltage, current;
odtulumbedder 0:6be57f391716 207 voltage = (float)adc_code*LTC2945_DELTA_SENSE_lsb; //! 1) Calculate voltage from ADC code and delta sense lsb
odtulumbedder 0:6be57f391716 208 current = voltage/resistor; //! 2) Calculate current, I = V/R
odtulumbedder 0:6be57f391716 209 return(current);
odtulumbedder 0:6be57f391716 210 }
odtulumbedder 0:6be57f391716 211
odtulumbedder 0:6be57f391716 212 // Calculate the LTC2945 power
odtulumbedder 0:6be57f391716 213 float LTC2945_code_to_power(int32_t adc_code, float resistor, float LTC2945_Power_lsb)
odtulumbedder 0:6be57f391716 214 // Returns The LTC2945 power
odtulumbedder 0:6be57f391716 215 {
odtulumbedder 0:6be57f391716 216 float voltage, power;
odtulumbedder 0:6be57f391716 217 voltage = (float)adc_code*LTC2945_Power_lsb; //! 1) Calculate V^2 from ADC code and power lsb
odtulumbedder 0:6be57f391716 218 power = voltage/resistor; //! 2) Calculate Power, P = V^2/R
odtulumbedder 0:6be57f391716 219 return(power);
odtulumbedder 0:6be57f391716 220 }
odtulumbedder 0:6be57f391716 221
odtulumbedder 0:6be57f391716 222 // Calculate the LTC2945 power with the ADIN
odtulumbedder 0:6be57f391716 223 float LTC2945_code_to_ADIN_power(int32_t adc_code, float resistor, float LTC2945_ADIN_DELTA_SENSE_lsb)
odtulumbedder 0:6be57f391716 224 // Returns the LTC2945 power with the ADIN
odtulumbedder 0:6be57f391716 225 {
odtulumbedder 0:6be57f391716 226 float voltage, power;
odtulumbedder 0:6be57f391716 227 voltage=(float)adc_code*LTC2945_ADIN_DELTA_SENSE_lsb; //! 1) Calculate V^2 from ADC code and ADIN delta sense lsb
odtulumbedder 0:6be57f391716 228 power = voltage/resistor; //! 2) Calculate Power, P = V^2/R
odtulumbedder 0:6be57f391716 229 return(power);
odtulumbedder 0:6be57f391716 230 }