Skip to content

Commit

Permalink
firmware: drivers: ds277Xg: Added macros for the values of all of the…
Browse files Browse the repository at this point in the history
… battery configuration registers #157
  • Loading branch information
ramonborba committed Aug 14, 2023
1 parent 8c4b632 commit 54cdcd9
Showing 1 changed file with 82 additions and 16 deletions.
98 changes: 82 additions & 16 deletions firmware/drivers/ds277Xg/ds277Xg.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
* \author Vinicius Pimenta Bernardo <[email protected]>
* \author Ramon de Araujo Borba <[email protected]>
*
* \version 0.2.0
* \version 0.4.0
*
* \date 2021/08/17
*
Expand All @@ -51,6 +51,13 @@

#define DS277XG_MODULE_NAME "DS277X"

/**
* References
* https://datasheets.maximintegrated.com/en/ds/DS2775-DS2778.pdf
* https://www.maximintegrated.com/en/design/technical-documents/app-notes/3/3584.html
* https://www.maximintegrated.com/en/design/technical-documents/app-notes/1/131.html
*/

/**
* @brief DS277XG IC parameters
*/
Expand All @@ -66,27 +73,86 @@
#define DS277XG_CURRENT_REG_RESOLUTION 1.5625 /* Unit: microvolts */
#define DS277XG_TEMPERATURE_REG_RESOLUTION 0.125 /* Unit: degrees Celsius */
#define DS277XG_ACCUMULATED_CURRENT_REG_RESOLUTION 6.25 /* Unit: microvolts */
#define DS277XG_FULL_40_REG_RESOLUTION 6.25 /* Unit: microvolts */
#define DS277XG_ACTIVE_EMPTY_40_REG_RESOLUTION 976.5625 /* Unit: ppm */
#define DS277XG_SEGMENT_SLOPE_REG_RESOLUTION 61 /* Unit: ppm */

/**
* @brief Battery cell parameters
*/
#define CELL_NOMINAL_VOLTAGE 3.78 /* Unit: Volts (ICR18650-30B-Samsung). */
#define CELL_FULLY_CHARGED_VOLTAGE (0.85/*<- Variable part*/ * CELL_NOMINAL_VOLTAGE) /* Unit: Volts */
#define CELL_MINIMUM_CHARGE_CURRENT (0.05 /*<- Variable part*/ * MAX_BATTERY_CHARGE)
#define CELL_INITIAL_AGE_SCALAR 0.95 /* Unit: Dimentionless (percentage) */
#define CELL_ACTIVE_EMPTY_VOLTAGE 3 // REVIEW THIS VALUE /* Unit: Volts */
#define CELL_ACTIVE_EMPTY_CURRENT 360 // REVIEW THIS VALUE /* Unit: miliamperes */

/**
* https://datasheets.maximintegrated.com/en/ds/DS2775-DS2778.pdf
* https://www.maximintegrated.com/en/design/technical-documents/app-notes/3/3584.html
* https://www.maximintegrated.com/en/design/technical-documents/app-notes/1/131.html
#define CELL_NOMINAL_VOLTAGE 3.6 /* Unit: Volts (ICR18650-30B-Samsung). */
#define CELL_FULLY_CHARGED_VOLTAGE (0.98 * CELL_NOMINAL_VOLTAGE) /* Unit: Volts */
#define CELL_MINIMUM_CHARGE_CURRENT (0.05 * MAX_BATTERY_CHARGE) /* Unit: milliamperes */
#define CELL_INITIAL_AGE_SCALAR 1 /* Unit: Dimentionless (percentage) */
#define CELL_ACTIVE_EMPTY_VOLTAGE 2.75 /* Unit: Volts */
#define CELL_ACTIVE_EMPTY_CURRENT 100 /* Unit: miliamperes */
#define CELL_FULL_40_CAPACITY ((uint16_t)(2* MAX_BATTERY_CHARGE * DS277XG_RSENSE_MOHMS))
#define CELL_ACTIVE_EMPTY_40_CAPACITY 0U /* ppm of Full 40 capacity */
#define CELL_FULL_SLOPE_4 0U /* Unit: ppm/C° */
#define CELL_FULL_SLOPE_3 5002U /* Unit: ppm/C° */
#define CELL_FULL_SLOPE_2 15555U /* Unit: ppm/C° */
#define CELL_FULL_SLOPE_1 15555U /* Unit: ppm/C° */
#define CELL_AE_SLOPE_4 0U /* Unit: ppm/C° */
#define CELL_AE_SLOPE_3 8000U /* Unit: ppm/C° */
#define CELL_AE_SLOPE_2 8000U /* Unit: ppm/C° */
#define CELL_AE_SLOPE_1 5002U /* Unit: ppm/C° */
#define CELL_SE_SLOPE_4 0U /* Unit: ppm/C° */
#define CELL_SE_SLOPE_3 4000U /* Unit: ppm/C° */
#define CELL_SE_SLOPE_2 4000U /* Unit: ppm/C° */
#define CELL_SE_SLOPE_1 2501U /* Unit: ppm/C° */
#define CELL_TBP34 25U /* Unit: ppm/C° */
#define CELL_TBP23 5U /* Unit: ppm/C° */
#define CELL_TBP12 0U /* Unit: ppm/C° */

/**
* \brief Parameter EEPROM configuration values
*
*/
#define DS277XG_CONTROL_REG_VALUE 0x0C /* Set undervoltage treshold to 2.60V */
#define DS277XG_ACCUMULATION_BIAS_REG_VALUE 0x00
#define DS277XG_AGING_CAPACITY_REG_VALUE_MSB ((uint8_t)(((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE_MOHMS) >> 8) / DS277XG_ACCUMULATED_CURRENT_REG_RESOLUTION))
#define DS277XG_AGING_CAPACITY_REG_VALUE_LSB ((uint8_t)((uint16_t)((MAX_BATTERY_CHARGE * DS277XG_RSENSE_MOHMS) / DS277XG_ACCUMULATED_CURRENT_REG_RESOLUTION)))
#define DS277XG_CHARGE_VOLTAGE_REG_VALUE ((uint8_t)(CELL_FULLY_CHARGED_VOLTAGE / DS277XG_CHARGE_VOLTAGE_REG_RESOLUTION))
#define DS277XG_MINIMUM_CHARGE_CURRENT_REG_VALUE ((uint8_t)((CELL_MINIMUM_CHARGE_CURRENT * DS277XG_RSENSE_MOHMS) / DS277XG_MINIMUM_CHARGE_CURRENT_REG_RESOLUTION))
#define DS277XG_ACTIVE_EMPTY_VOLTAGE_REG_VALUE ((uint8_t)(CELL_ACTIVE_EMPTY_VOLTAGE / DS277XG_ACTIVE_EMPTY_VOLTAGE_REG_RESOLUTION))
#define DS277XG_ACTIVE_EMPTY_CURRENT_REG_VALUE ((uint8_t)(CELL_ACTIVE_EMPTY_CURRENT*DS277XG_RSENSE_MOHMS / DS277XG_ACTIVE_EMPTY_CURRENT_REG_RESOLUTION))
#define DS277XG_ACTIVE_EMPTY_40_REG_VALUE ((uint8_t)(CELL_ACTIVE_EMPTY_40_CAPACITY / DS277XG_ACTIVE_EMPTY_40_REG_RESOLUTION))
#define DS277XG_SENSE_RESISTOR_PRIME_REG_VALUE ((uint8_t)(DS277XG_RSENSE_CONDUCTANCE))
#define DS277XG_FULL_40_MSB_REG_VALUE ((uint8_t)((uint16_t)((CELL_FULL_40_CAPACITY >> 8) / DS277XG_FULL_40_REG_RESOLUTION)))
#define DS277XG_FULL_40_LSB_REG_VALUE ((uint8_t)((uint16_t)(CELL_FULL_40_CAPACITY / DS277XG_FULL_40_REG_RESOLUTION)))
#define DS277XG_FULL_SEGMENTE_4_SLOPE_REG_VALUE ((uint8_t)(CELL_FULL_SLOPE_4 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_FULL_SEGMENTE_3_SLOPE_REG_VALUE ((uint8_t)(CELL_FULL_SLOPE_3 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_FULL_SEGMENTE_2_SLOPE_REG_VALUE ((uint8_t)(CELL_FULL_SLOPE_2 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_FULL_SEGMENTE_1_SLOPE_REG_VALUE ((uint8_t)(CELL_FULL_SLOPE_1 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_AE_SEGMENTE_4_SLOPE_REG_VALUE ((uint8_t)(CELL_AE_SLOPE_4 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_AE_SEGMENTE_3_SLOPE_REG_VALUE ((uint8_t)(CELL_AE_SLOPE_3 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_AE_SEGMENTE_2_SLOPE_REG_VALUE ((uint8_t)(CELL_AE_SLOPE_2 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_AE_SEGMENTE_1_SLOPE_REG_VALUE ((uint8_t)(CELL_AE_SLOPE_1 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_SE_SEGMENTE_4_SLOPE_REG_VALUE ((uint8_t)(CELL_SE_SLOPE_4 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_SE_SEGMENTE_3_SLOPE_REG_VALUE ((uint8_t)(CELL_SE_SLOPE_3 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_SE_SEGMENTE_2_SLOPE_REG_VALUE ((uint8_t)(CELL_SE_SLOPE_2 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_SE_SEGMENTE_1_SLOPE_REG_VALUE ((uint8_t)(CELL_SE_SLOPE_1 / DS277XG_SEGMENT_SLOPE_REG_RESOLUTION))
#define DS277XG_SENSE_RESISTOR_GAIN_REG_VALUE_MSB 0x64 /* Factory Value */
#define DS277XG_SENSE_RESISTOR_GAIN_REG_VALUE_LSB 0x1B /* Factory Value */
#define DS277XG_SENSE_RESISTOR_TEMPERATURE_COEFFICIENT_REG_VALUE 0x00
#define DS277XG_CURRENT_OFFSET_BIAS_REG_VALUE 0x00
#define DS277XG_TBP34_REG_VALUE (CELL_TBP34)
#define DS277XG_TBP23_REG_VALUE (CELL_TBP23)
#define DS277XG_TBP12_REG_VALUE (CELL_TBP12)
#define DS277XG_PROTECTOR_THRESHOLD_REG_VALUE 0x60 /* Set overvoltage threshold to 4.248V*/
#define DS277XG_TWO_WIRE_SLAVE_ADDRESS_REG_VALUE (DS2777G_DEFAULT_SLAVE_ADDRESS << 1)

#define DS277XG_PARAMETER_EEPROM_ADDRESS 0x60
#define DS277XG_PARAMETER_EEPROM_SIZE 33

/**
* \brief DS277XG Commands
*/
#define DS2777G_DEFAULT_SLAVE_ADDRESS 0b1011001
#define DS2775G_SKIP_ADDRESS 0xCC //Address that access any onewire device (used when there's only one device at the onewire bus)
#define DS2775G_WRITE_DATA 0x6C //Command to write a data in the DS2775G+ memory
#define DS2775G_READ_DATA 0x69 //Command to read a data from DS2775G+ memory
#define DS2775G_COPY_DATA 0x48 //Command to copy data of the DS2775G+ EEPROM shadow RAM to EEPROM cells
#define DS2775G_SKIP_ADDRESS 0xCC //Address that access any onewire device (used when there's only one device at the onewire bus)
#define DS2775G_WRITE_DATA 0x6C //Command to write a data in the DS2775G+ memory
#define DS2775G_READ_DATA 0x69 //Command to read a data from DS2775G+ memory
#define DS2775G_COPY_DATA 0x48 //Command to copy data of the DS2775G+ EEPROM shadow RAM to EEPROM cells
/**
* \brief Memory map.
*/
Expand Down

0 comments on commit 54cdcd9

Please sign in to comment.