Skip to content

Commit

Permalink
firmware: drivers: ds277Xg: Added more #defined parameter to avoid 'm…
Browse files Browse the repository at this point in the history
…agic numbers' #157
  • Loading branch information
ramonborba committed Jun 17, 2022
1 parent 9caf508 commit 279111d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 17 deletions.
32 changes: 16 additions & 16 deletions firmware/drivers/ds277Xg/ds277Xg.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,28 +73,28 @@ int ds277Xg_init(ds277Xg_config_t *config)
}

if (ds277Xg_read_data(config, DS277XG_SENSE_RESISTOR_PRIME_REGISTER, rd_buf, 1) != 0) {return -1;}
else if (rd_buf[0] != (uint8_t)(1/DS277XG_RSENSE))
else if (rd_buf[0] != (uint8_t)(DS277XG_RSENSE_CONDUCTANCE))
{
wr_buf[0] = DS277XG_SENSE_RESISTOR_PRIME_REGISTER;
wr_buf[1] = (uint8_t)(1/DS277XG_RSENSE);
wr_buf[1] = (uint8_t)(DS277XG_RSENSE_CONDUCTANCE);
if (ds277Xg_write_data(config, wr_buf, 2) != 0) {return -1;}
if (copy_to_eeprom_flag != true) {copy_to_eeprom_flag = true;}
}

if (ds277Xg_read_data(config, DS277XG_CHARGE_VOLTAGE_REGISTER, rd_buf, 1) != 0) {return -1;}
else if (rd_buf[0] != (uint8_t)((0.85/*<- Variable part*/ * CELL_NOMINAL_VOLTAGE) / 0.0195))
else if (rd_buf[0] != (uint8_t)(CELL_FULLY_CHARGED_VOLTAGE / DS277XG_CHARGE_VOLTAGE_REG_RESOLUTION))
{
wr_buf[0] = DS277XG_CHARGE_VOLTAGE_REGISTER;
wr_buf[1] = (uint8_t)((0.85/*<- Variable part*/ * CELL_NOMINAL_VOLTAGE) / 0.0195);
wr_buf[1] = (uint8_t)(CELL_FULLY_CHARGED_VOLTAGE / DS277XG_CHARGE_VOLTAGE_REG_RESOLUTION);
if (ds277Xg_write_data(config, wr_buf, 2) != 0) {return -1;}
if (copy_to_eeprom_flag != true) {copy_to_eeprom_flag = true;}
}

if (ds277Xg_read_data(config, DS277XG_MINIMUM_CHARGE_CURRENT_REGISTER, rd_buf, 1) != 0) {return -1;}
else if (rd_buf[0] != (uint8_t)((0.05 /*<- Variable part*/ * MAX_BATTERY_CHARGE * DS277XG_RSENSE * 1000) / 50))
else if (rd_buf[0] != (uint8_t)((CELL_MINIMUM_CHARGE_CURRENT * DS277XG_RSENSE_MOHMS) / DS277XG_MINIMUM_CHARGE_CURRENT_REG_RESOLUTION))
{
wr_buf[0] = DS277XG_MINIMUM_CHARGE_CURRENT_REGISTER;
wr_buf[1] = (uint8_t)((0.05 /*<- Variable part*/ * MAX_BATTERY_CHARGE * DS277XG_RSENSE * 1000) / 50);
wr_buf[1] = (uint8_t)((CELL_MINIMUM_CHARGE_CURRENT * DS277XG_RSENSE_MOHMS) / DS277XG_MINIMUM_CHARGE_CURRENT_REG_RESOLUTION);
if (ds277Xg_write_data(config, wr_buf, 2) != 0) {return -1;}
if (copy_to_eeprom_flag != true) {copy_to_eeprom_flag = true;}
}
Expand Down Expand Up @@ -137,19 +137,19 @@ int ds277Xg_set_battery_to_initial_state(ds277Xg_config_t *config)

/* Set Aging Capacity register to maximum battery capacity */
wr_buf[0] = DS277XG_AGING_CAPACITY_REGISTER_MSB;
wr_buf[1] = (uint8_t)((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE * 1000) >> 8);
wr_buf[2] = (uint8_t)((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE * 1000));
wr_buf[1] = (uint8_t)((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE_MOHMS) >> 8);
wr_buf[2] = (uint8_t)((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE_MOHMS));
if (ds277Xg_write_data(config, wr_buf, 3) != 0) {return -1;}

/* Set Age Scalar to 95% (recomended on datasheet) */
wr_buf[0] = DS277XG_AGE_SCALAR_REGISTER;
wr_buf[1] = (uint8_t)(0.95/0.0078125);
wr_buf[1] = (uint8_t)(CELL_INITIAL_AGE_SCALAR/DS277XG_AGE_SCALAR_REG_RESOLUTION);
if (ds277Xg_write_data(config, wr_buf, 2) != 0) {return -1;}

/* Set accumulated current to maximum battery capacity */
wr_buf[0] = DS277XG_ACCUMULATED_CURRENT_MSB;
wr_buf[1] = (uint8_t)((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE * 1000) >> 8);
wr_buf[2] = (uint8_t)((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE * 1000));
wr_buf[1] = (uint8_t)((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE_MOHMS) >> 8);
wr_buf[2] = (uint8_t)((uint16_t)(MAX_BATTERY_CHARGE * DS277XG_RSENSE_MOHMS));
if (ds277Xg_write_data(config, wr_buf, 3) != 0) {return -1;}

// Copy from shadow RAM to EEPROM.
Expand Down Expand Up @@ -228,7 +228,7 @@ int ds277Xg_read_voltage_raw(ds277Xg_config_t *config, int16_t *voltage_raw, uin

int16_t ds277Xg_voltage_raw_to_mv(int16_t raw)
{
return raw * 4.8828;
return raw * DS277XG_VOLTAGE_REG_RESOLUTION;
}

int ds277Xg_read_voltage_mv(ds277Xg_config_t *config, int16_t *voltage_mv, uint8_t battery_select)
Expand Down Expand Up @@ -258,7 +258,7 @@ int ds277Xg_read_temperature_raw(ds277Xg_config_t *config, int16_t *temp_raw)

uint16_t ds277Xg_temperature_raw_to_kelvin(int16_t raw)
{
return ((raw * 0.125) + 273.15);
return ((raw * DS277XG_TEMPERATURE_REG_RESOLUTION)/* Temperature in Celsius */ + 273.15 /* Celsius to Kelvin conversion */);
}

int ds277Xg_read_temperature_kelvin(ds277Xg_config_t *config, uint16_t *temp_kelvin)
Expand Down Expand Up @@ -295,7 +295,7 @@ int ds277Xg_read_current_raw(ds277Xg_config_t *config, int16_t *current_raw, boo

int16_t ds277Xg_current_raw_to_ma(int16_t raw)
{
return raw * (1.5625 / 1000) / (DS277XG_RSENSE);
return raw * (DS277XG_CURRENT_REG_RESOLUTION / DS277XG_RSENSE) /* current in microamps */ / 1000 /* convert microamps to milliamps */;
}

int ds277Xg_read_current_ma(ds277Xg_config_t *config, int16_t *current_ma, bool read_average)
Expand Down Expand Up @@ -324,7 +324,7 @@ int ds277Xg_write_accumulated_current_raw(ds277Xg_config_t *config, uint16_t acc

uint16_t ds277Xg_accumulated_current_mah_to_raw(uint16_t mah)
{
return mah * (DS277XG_RSENSE) / (6.25 / 1000);
return mah * (DS277XG_RSENSE) / (DS277XG_ACCUMULATED_CURRENT_REG_RESOLUTION / 1000);
}

int ds277Xg_write_accumulated_current_mah(ds277Xg_config_t *config, uint16_t acc_current_mah)
Expand All @@ -347,7 +347,7 @@ int ds277Xg_read_accumulated_current_raw(ds277Xg_config_t *config, uint16_t *acc

uint16_t ds277Xg_accumulated_current_raw_to_mah(uint16_t raw)
{
return raw * (6.25 / 1000) / (DS277XG_RSENSE);
return raw * (DS277XG_ACCUMULATED_CURRENT_REG_RESOLUTION / 1000) / (DS277XG_RSENSE);
}

int ds277Xg_read_accumulated_current_mah(ds277Xg_config_t *config, uint16_t *acc_current_mah)
Expand Down
21 changes: 20 additions & 1 deletion firmware/drivers/ds277Xg/ds277Xg.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,27 @@

#define DS277XG_MODULE_NAME "DS277X"

#define DS277XG_RSENSE 0.01 /* Unit: Ohm. */
/**
* @brief DS277XG IC parameters
*/
#define DS277XG_RSENSE 0.01 /* Unit: Ohm. */
#define DS277XG_RSENSE_MOHMS 10 /* Unit: milliohms. */
#define DS277XG_RSENSE_CONDUCTANCE 100 /* Unit: Siemens. */
#define DS277XG_CHARGE_VOLTAGE_REG_RESOLUTION 0.0195 /* Unit: millivolts */
#define DS277XG_MINIMUM_CHARGE_CURRENT_REG_RESOLUTION 50 /* Unit: microvolts */
#define DS277XG_AGE_SCALAR_REG_RESOLUTION 0.0078125 /* Unit: Dimentionless (percentage) */
#define DS277XG_VOLTAGE_REG_RESOLUTION 4.8828 /* Unit: millivolts */
#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 */

/**
* @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) */

/**
* https://datasheets.maximintegrated.com/en/ds/DS2775-DS2778.pdf
Expand Down

0 comments on commit 279111d

Please sign in to comment.