LTC2942 interface with interrupt and battery register calculations
LTC294X.h
- Committer:
- kaushalpkk
- Date:
- 2019-08-08
- Revision:
- 1:547ec53dc37d
- Parent:
- 0:f9e13080204a
File content as of revision 1:547ec53dc37d:
#ifndef LTC294X_H
#define LTC294X_H
#include "mbed.h"
#define LTC_CONSOLE_OUTOUT 1 /* Set this if you need debug messages on the console; */
/* it will have an impact on code-size and power consumption. */
#if LTC_CONSOLE_OUTOUT
//Serial usb(USBTX, USBRX); // tx, rx
extern Serial pc;
#define DEBUG(...) { pc.printf(__VA_ARGS__); }
#else
#define DEBUG(...) /* nothing */
#endif /* #if NEED_CONSOLE_OUTPUT */
//gets a bit position by shifting 1
#define _BV(x) (1 << x)
// sbi sets a particular bit and cbi clears the bit (target byte-word, bit position)
#define sbi(y,x); y|=_BV(x)
#define cbi(y,x); y&=~_BV(x)
//BIT 7-6 ADC MODE SELECTOR
#define ADC_AUTO 0x00
#define ADC_VOLT 0x01
#define ADC_TEMP 0x02
#define ADC_SLEEP 0x03
//BIT 2-1 AL/CC MODE SELECTOR
#define ALCC_ALERT 0x04
#define ALCC_CCOMP 0x05
#define ALCC_OFF 0x06
//STATUS REGISTER.. READ BIT VALUES ONLY
#define CHIP_ID _BV(7)
#define RESERVE _BV(6)
#define CHARGE_OVUV_ALERT _BV(5)
#define TEMPERATURE_ALERT _BV(4)
#define CHARGE_HIGH_ALERT _BV(3)
#define CHARGE_LOW_ALERT _BV(2)
#define VOLT_ALERT _BV(1)
#define UVLO_ALERT _BV(0)
//prescaler options
#define PRESCALE_128 7
#define PRESCALE_64 6
#define PRESCALE_32 5
#define PRESCALE_16 4
#define PRESCALE_8 3
#define PRESCALE_4 2
#define PRESCALE_2 1
#define PRESCALE_1 0
//CONTROL REGISTER.. BIT LOCATIONS
#define ADC_VOLT_MODE 7
#define ADC_TEMP_MODE 6
#define PRESCALER_2 5
#define PRESCALER_1 4
#define PRESCALER_0 3
#define ALCC_ALERT_MODE 2
#define ALCC_CHRGC_MODE 1
#define IC_SHUTDOWN 0
//I2C REGISTER ADDRESSES
#define REG_STATUS 0x00 // 00h A Status R See Below
#define REG_CONTROL 0x01 // 01h B Control R/W 3Ch
#define ACC_MSB 0x02 // 02h C Accumulated Charge MSB R/W 7Fh
#define ACC_LSB 0x03 // 03h D Accumulated Charge LSB R/W FFh
#define CHRG_THH_MSB 0x04 // 04h E Charge Threshold High MSB R/W FFh
#define CHRG_THH_LSB 0x05 // 05h F Charge Threshold High LSB R/W FFh
#define CHRG_THL_MSB 0x06 // 06h G Charge Threshold Low MSB R/W 00h
#define CHRG_THL_LSB 0x07 // 07h H Charge Threshold Low LSB R/W 00h
#define VOLT_MSB 0x08 // 08h I Voltage MSB R XXh
#define VOLT_LSB 0x09 // 09h J Voltage LSB R XXh
#define VOLT_THH 0x0A // 0Ah K Voltage Threshold High R/W FFh
#define VOLT_THL 0x0B // 0Bh L Voltage Threshold Low R/W 00h
#define TEMP_MSB 0x0C // 0Ch M Temperature MSB R XXh
#define TEMP_LSB 0x0D // 0Dh N Temperature LSB R XXh
#define TEMPERATURE_THH 0x0E // 0Eh O Temperature Threshold High R/W FFh
#define TEMPERATURE_THL 0x0F // 0Fh P Temperature Threshold Low R/W 00h
/** LTC29421 class.
* interface LTC29421 coloumb counter on i2c port with interrupt, function name (and battery capacity in Ah Amp-hour).
*
* Example:
* @code
* #include "mbed.h"
* #include "LTC29421.h"
*
* LTC29421 ltc(PTC9, PTC8, PTA4, &interrDOWN, 0.560);
*
* int main() {
* float chLevel = ltc.accumulatedCharge();
* }
* @endcode
*/
class LTC29421{
public:
/** create LTC29421 instance based on I2C, WARNING! use setPrescAndBattCap() to set Battery Capacity
*
* @param pin sda
* @param pin scl
* @param pin al/cc interrupt
*/
LTC29421(PinName, PinName, PinName, void (*interruptFunc)(void));
/** create LTC29421 instance based on I2C,
* this will computer internal M prescale value and set internal max charge level
*
* @param pin sda
* @param pin scl
* @param pin al/cc interrupt
* @param float battery capacity in Ah (Amp-hour)
*/
LTC29421(PinName, PinName, PinName, void (*interruptFunc)(void), float);
/** select an ADC measurement option for voltage / temperature
*
* @param ADC_x
*/
void setADCMode(int);
/** select a prescaler value (not required if object initialized with battery capacity
*
* @param PRESCALE_x
*/
void setPrescaler(int);
/** returns prescale value in integer
*
* @returns int prescale value
*/
int getPrescaler();
/** configure the AL/CC interrupt: TODO works as Alarm only
*
* @param ALCC_x
*/
void configALCC(int);
/** shutsdown the analog section of LTC2942, also used to read accumulated charge registers
*
* @param none
*/
void shutdown();
/** wakes the analog section of LTC2942
*
* @param none
*/
void wake();
/** wakes the analog section of LTC2942
*
* @param none
*/
/** amend the battery capacity, also computers prescaler M and adjusts internal Max battery capacity
*
* @param battery capacity in Ah (Amp-hour)
*/
void setPrescAndBattCap(float);
/** returns the 2 Byte accumulated charge register
*
* @return accumulated charge read as 2 byte hex value
*/
int accumulatedChargeReg();
/** write into the 2 Byte accumulated charge register
*
* @param accumulated charge write as 2 byte hex value
*/
void accumulatedChargeReg(int);
/** reads the accumulated charge register as a percent value computed from max battery capacity
*
* @return accumulated charge read as percent
*/
float accumulatedCharge();
/** writes the accumulated charge register as a percent value computed from max battery capacity
* use this to initialise the battery capacity if known,
* or set it to 50% or set it to 100% if battery capacity reaches max
*
* @param accumulated charge as percent (0-100)
*/
void accumulatedCharge(float);
/** set low battery capacity threshhold
*
* @param float percent remaining value(0-100)
*/
void setChargeThresholdLow(float);
/** set high battery capacity threshhold
*
* @param float percent remaining value(0-100)
*/
void setChargeThresholdHigh(float);
/** obtains battery voltage at (sense-) pin
* if required ADC is set
*
* @return battery level in Volts
*/
float voltage();
/** set low battery level threshhold
*
* @param Voltage level in Volts
*/
void setVoltageThresholdLow(float);
/** set high battery level threshhold
*
* @param Voltage level in Volts
*/
void setVoltageThresholdHigh(float);
/** obtains IC temperature, if required ADC is set
*
* @return temperature in centigrade
*/
float temperature();
/** set IC temperature low threshold
*
* @param temperauture in centigrade
*/
void setTemperatureThresholdLow(float);
/** set IC temperature high threshold
*
* @param temperauture in centigrade
*/
void setTemperatureThresholdHigh(float);
/** reads all LTC2942 register values prints on serial terminal
*
* @param none
*/
void readAll();
/** reads the status register first
* uses the ARA alert response protocol for SMBus to clear AL/CC pin
*
* int resp = ic.alertResponse();
* if((resp & TEMPERATURE_ALERT) == TEMPERATURE_ALERT) { }
*
* @return STATUS register
*/
int alertResponse();
private:
char getStatusReg();
char getControlReg();
void setControlReg(char);
I2C _i2c;
InterruptIn _alcc;
char _addr;
float _battCap;
float _battMax;
float _presc;
};
#endif