Example of using the DS271 battery monitor on the ESP motor driver board using PC_12 as the OneWire interface (Any other GPIO can be used)
Diff: ds2781.cpp
- Revision:
- 0:de50f9a71c22
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ds2781.cpp Mon Mar 04 14:48:45 2019 +0000 @@ -0,0 +1,346 @@ +#include "ds2781.h" +#include "OneWire_Methods.h" + +/* -------------------------------------------------------------------------- + This file includes the functions needed to access and modify the registers + in a DS2781 using the 1-Wire protocol. The DS2781 is an IC that measures + voltage, current, accumulated current and temperature. It implements + capacity estimation algorithms for rechargeable batteries. However, this + file only includes routines to access the electrical parameters and not + the age-estimation registers. + -------------------------------------------------------------------------- +---------------------- + NOTE_1: The functions that return parameters, do so in the units reported + in the description of each function. The user should implement the scaling + on his/her own. + -------------------------------------------------------------------------- */ + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : ReadVoltage * + * Overview : Returns the voltage measured at the VIN input of the DS2781 * + * in units of 9.76mV * + * Return type : 16-bit unsigned int * + * Parameters : None * + * Time : < 4.3ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +int ReadVoltage (void) +{ + uint16_t result = 0; + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( READ_DATA ); + OneWire_WriteByte( 0x0C ); //Register Address + result = OneWire_ReadByte() << 8; //MSB + result |= OneWire_ReadByte() ; //LSB + } + return (result >> 5); +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : ReadCurrent * + * Overview : Returns the current measured through Rsns external to DS2781 in * + * units of 1.5625uV/Rsns. Positive current indicates discharge * + * Return type : 16-bit unsigned int * + * Parameters : None * + * Time : < 4.3ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +uint16_t ReadCurrent (void) +{ + uint16_t result = 0; + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( READ_DATA ); + OneWire_WriteByte( 0x0E ); //Register Address + result = ((uint16_t)OneWire_ReadByte() ) << 8; //MSB + result |= ((uint16_t)OneWire_ReadByte() ); //LSB + } + return result; +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : ReadAccumulatedCurrent * + * Overview : Returns the accumulated current at the DS2781 in units of * + * 1.526nVhr/Rsns * + * Return type : 32-bit unsigned long * + * Parameters : None * + * Time : < 5.8ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +uint32_t ReadAccumulatedCurrent (void) +{ + unsigned long result = 0; + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( READ_DATA ); + OneWire_WriteByte( 0x10 ); //Register Address + result = ((unsigned long)OneWire_ReadByte() ) << 24; //MSB + result |= ((unsigned long)OneWire_ReadByte() ) << 16; + result |= ((unsigned long)OneWire_ReadByte() ) << 8; + result |= ((unsigned long)OneWire_ReadByte() ); //LSB + } + return (result >> 4); +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : ResetAccumulatedCurrent * + * Overview : Resets the accumulated current register at the DS2781 * + * Return type : Void * + * Parameters : None * + * Time : < 4.2ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +void ResetAccumulatedCurrent (void) +{ + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( WRITE_DATA ); + OneWire_WriteByte( 0x10 ); //Register Address + OneWire_WriteByte( 0x00 ); //MSB + OneWire_WriteByte( 0x00 ); //LSB + } +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : ReadNetAddress * + * Overview : Returns the net address of the DS2781 * + * Return type : 64-bit unsigned long long * + * Parameters : None * + * Time : < 7.3ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +uint32_t ReadNetAddress (void) +{ + uint16_t result = 0; + if( OneWire_Reset() == true) + { + OneWire_WriteByte( READ_NETADDRESS ); + //result = ((Quint16_t)OneWire_ReadByte() ); //MSB + //result |= ((Quint16_t)OneWire_ReadByte() ) << 8; + //result |= ((Quint16_t)OneWire_ReadByte() ) << 16; + //result |= ((Quint16_t)OneWire_ReadByte() ) << 24; + //result |= ((Quint16_t)OneWire_ReadByte() ) << 32; + //result |= ((Quint16_t)OneWire_ReadByte() ) << 40; + //result |= ((Quint16_t)OneWire_ReadByte() ) << 48; + //result |= ((Quint16_t)OneWire_ReadByte() ) <<56; //LSB + } + return result; +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : ReadTemperature * + * Overview : Returns the temperature measured by the DS2781 in units of * + * 0.125°C * + * Return type : 16-bit unsigned int * + * Parameters : None * + * Time : < 4.3ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +uint16_t ReadTemperature (void) +{ + uint16_t result = 0; + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( READ_DATA ); + OneWire_WriteByte( 0x0A ); //Register Address + result = ((uint16_t)OneWire_ReadByte() ) << 8; //MSB + result |= ((uint16_t)OneWire_ReadByte() ); //LSB + } + return (result >> 5); +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : ReadCurrentOffset * + * Overview : Returns the value of the current offset register of the DS2781 * + * in units of 1.56uV/Rsns * + * Return type : 8-bit uint8_t * + * Parameters : None * + * Time : < 3.6ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +uint8_t ReadCurrentOffset (void) +{ + uint8_t result = 0; + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( READ_DATA ); + OneWire_WriteByte( 0x7B ); //Register Address + result = OneWire_ReadByte(); + } + return result; +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : WriteCurrentOffset * + * Overview : Writes to the current offset register of the DS2781 in units of * + * 1.56uV/Rsns * + * Return type : Void * + * Parameters : Byte to be written to the register in 2's complement * + * Time : < 3.6ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +void WriteCurrentOffset (uint8_t offset) +{ + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( WRITE_DATA ); + OneWire_WriteByte( 0x7B ); //Register Address + OneWire_WriteByte( offset ); + } +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : AdjustCurrentOffset * + * Overview : Adjusts the value of the current offset register of the DS2781 * + * by taking into account the offset at no current. Should only * + * be called when the battery is supplying no current * + * Return type : Void * + * Parameters : None * + * Time : < 3.62s * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +void AdjustCurrentOffset (void) +{ + char offset = 0; + + WriteCurrentOffset ( 0x0 ); //Reset Current Offset Register + + //Delay100MSx(36); //Wait 3.6s for current register to update + + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( READ_DATA ); + OneWire_WriteByte( 0x0F ); //Current Register LSB + offset = OneWire_ReadByte(); + } + + offset = 256 - offset; //2's complement Negating + + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( WRITE_DATA ); + OneWire_WriteByte( 0x7B ); //Current Offset Register + OneWire_WriteByte( offset ); + } +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : UpdateControlRegister * + * Overview : Writes to the Control register of the DS2781 using the values * + * supplied as a byte parameter. Writes to EEPROM addresses are * + * ignored for up to 15ms after this function is called. * + * Return type : Void * + * Parameters : None * + * Time : < 6.4ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +void UpdateControlRegister (uint8_t control) +{ + if( OneWire_Reset() == true ) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( WRITE_DATA ); + OneWire_WriteByte( 0x60 ); //Register Address + OneWire_WriteByte( control ); + } + + if( OneWire_Reset() == true ) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( COPY_DATA ); + OneWire_WriteByte( 0x60 ); //Register Address + } +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : ReadRAM * + * Overview : Reads a byte from the shadow RAM of the DS2781 at the given * + * memory address * + * Return type : 8-bit uint8_t * + * Parameters : Address of register to be read * + * Time : < 3.6ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +uint8_t ReadRAM (uint8_t addr) +{ + uint8_t result = 0; + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( READ_DATA ); + OneWire_WriteByte( addr ); //Register Address + result = OneWire_ReadByte(); + } + return result; +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : WriteRAM * + * Overview : Writes the given byte to the shadow RAM of the DS2781 at the * + * given memory address * + * Return type : Void * + * Parameters : Byte to be written, address of register * + * Time : < 3.6ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +void WriteRAM (uint8_t byte, uint8_t addr) +{ + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( WRITE_DATA ); + OneWire_WriteByte( addr ); //Register Address + OneWire_WriteByte( byte ); + } +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : CopyEEPROM * + * Overview : This function copies the contents of the EEPROM shadow RAM to * + * EEPROM cells for the EEPROM block containing thr given address. * + * Writes to EEPROM addresses are ignored for up to 15ms after this * + * function is called. * + * Return type : Void * + * Parameters : Memory address of shadow RAM to be copied * + * Time : < 2.9ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +void CopyEEPROM (uint8_t addr) +{ + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( COPY_DATA ); + OneWire_WriteByte( addr ); + } +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + * Function name : RecallEEPROM * + * Overview : This function copies the contents of the EEPROM cells to the * + * shadow RAM for the EEPROM block containing the given address. * * + * Return type : Void * + * Parameters : Memory address of EEPROM to be copied * + * Time : < 2.9ms * + *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +void RecallEEPROM (uint8_t addr) +{ + if( OneWire_Reset() == true) + { + OneWire_WriteByte( SKIP_NETADDRESS ); + OneWire_WriteByte( RECALL_DATA ); + OneWire_WriteByte( addr ); + } +} +/* EOF */