Skip to content

Commit

Permalink
batt_smbus add complementary filter and small fixes (#9080)
Browse files Browse the repository at this point in the history
* Batt_smbus. Added complementary filter to remaining capacity, reversed warning state checks, and added remaining/discharged out of range checks to handle bad battery calibrations

* Changed errx to PX4_ERR

* Added PX4_ERR returns
  • Loading branch information
AlexKlimaj authored and dagar committed Mar 15, 2018
1 parent 7776789 commit 08a53a9
Showing 1 changed file with 30 additions and 18 deletions.
48 changes: 30 additions & 18 deletions src/drivers/batt_smbus/batt_smbus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -541,38 +541,50 @@ BATT_SMBUS::cycle()
}

// read remaining capacity
if (_batt_capacity > 0) {
if (read_reg(BATT_SMBUS_REMAINING_CAPACITY, tmp) == OK) {
if (read_reg(BATT_SMBUS_REMAINING_CAPACITY, tmp) == OK) {

if (tmp > _batt_capacity) {
PX4_WARN("Remaining Cap greater than total: Cap:%hu RemainingCap:%hu", (uint16_t)_batt_capacity, (uint16_t)tmp);
_batt_capacity = (uint16_t)tmp;
}
if (tmp > _batt_capacity) {
PX4_WARN("Remaining Cap greater than total: Cap:%hu RemainingCap:%hu", (uint16_t)_batt_capacity, (uint16_t)tmp);
_batt_capacity = (uint16_t)tmp;
}

new_report.remaining = (float)(1.000f - (((float)_batt_capacity - (float)tmp) / (float)_batt_capacity));
// Calculate remaining capacity percent with complementary filter
new_report.remaining = (float)(_last_report.remaining * 0.8f) + (float)(0.2f * (float)(1.000f - (((
float)_batt_capacity - (float)tmp) / (float)_batt_capacity)));

// calculate total discharged amount
new_report.discharged_mah = (float)((float)_batt_startup_capacity - (float)tmp);
}
// calculate total discharged amount
new_report.discharged_mah = (float)((float)_batt_startup_capacity - (float)tmp);
}

// read battery temperature and covert to Celsius
if (read_reg(BATT_SMBUS_TEMP, tmp) == OK) {
new_report.temperature = (float)(((float)tmp / 10.0f) - 273.15f);
}

// propagate warning state only if the state
if (new_report.remaining < _emergency_thr) {
//Check if remaining % is out of range
if ((new_report.remaining > 1.00f) || (new_report.remaining <= 0.00f)) {
new_report.warning = battery_status_s::BATTERY_WARNING_EMERGENCY;
}

//Check if discharged amount is greater than the starting capacity
else if (new_report.discharged_mah > (float)_batt_startup_capacity) {
new_report.warning = battery_status_s::BATTERY_WARNING_EMERGENCY;
}

} else if (new_report.remaining < _crit_thr) {
new_report.warning = battery_status_s::BATTERY_WARNING_CRITICAL;
// propagate warning state
else {
if (new_report.remaining > _low_thr) {
new_report.warning = battery_status_s::BATTERY_WARNING_NONE;

} else if (new_report.remaining < _low_thr) {
new_report.warning = battery_status_s::BATTERY_WARNING_LOW;
} else if (new_report.remaining > _crit_thr) {
new_report.warning = battery_status_s::BATTERY_WARNING_LOW;

} else {
new_report.warning = battery_status_s::BATTERY_WARNING_NONE;
} else if (new_report.remaining > _emergency_thr) {
new_report.warning = battery_status_s::BATTERY_WARNING_CRITICAL;

} else {
new_report.warning = battery_status_s::BATTERY_WARNING_EMERGENCY;
}
}

new_report.capacity = _batt_capacity;
Expand Down

0 comments on commit 08a53a9

Please sign in to comment.