INA2xx: Debounce battery connection state (#25786)

To prevent critical low battery messages on a single I2C issue.
This commit is contained in:
Niklas Hauser
2025-10-31 13:19:10 +01:00
committed by GitHub
parent f9595319b8
commit 6ec106a0ed
7 changed files with 100 additions and 45 deletions
+31 -15
View File
@@ -98,11 +98,10 @@ INA228::INA228(const I2CSPIDriverConfig &config, int battery_index) :
_power_lsb = 3.2f * _current_lsb;
// We need to publish immediately, to guarantee that the first instance of the driver publishes to uORB instance 0
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateTemperature(0.f);
setConnected(false);
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
I2C::_retries = 5;
}
INA228::~INA228()
@@ -322,15 +321,12 @@ INA228::collect()
//success = success && (read(INA228_REG_VSHUNT, _shunt) == PX4_OK);
success = success && (read(INA228_REG_DIETEMP, _temperature) == PX4_OK);
if (!success) {
PX4_DEBUG("error reading from sensor");
_bus_voltage = _power = _current = _shunt = 0;
if (setConnected(success)) {
_battery.updateVoltage(static_cast<float>(_bus_voltage * INA228_VSCALE));
_battery.updateCurrent(static_cast<float>(_current * _current_lsb));
_battery.updateTemperature(static_cast<float>(_temperature * INA228_TSCALE));
}
_battery.setConnected(success);
_battery.updateVoltage(static_cast<float>(_bus_voltage * INA228_VSCALE));
_battery.updateCurrent(static_cast<float>(_current * _current_lsb));
_battery.updateTemperature(static_cast<float>(_temperature * INA228_TSCALE));
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
perf_end(_sample_perf);
@@ -394,10 +390,7 @@ INA228::RunImpl()
ScheduleDelayed(INA228_CONVERSION_INTERVAL);
} else {
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateTemperature(0.f);
setConnected(false);
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
if (init() != PX4_OK) {
@@ -406,6 +399,29 @@ INA228::RunImpl()
}
}
bool INA228::setConnected(bool state)
{
// Filter out brief I2C failures for 2s
if (state) {
_connected = INA228_SAMPLE_FREQUENCY_HZ * 2;
} else if (_connected > 0) {
_connected--;
}
if (_connected > 0) {
_battery.setConnected(true);
} else {
_battery.setConnected(false);
_battery.updateVoltage(0);
_battery.updateCurrent(0);
_battery.updateTemperature(0);
}
return state;
}
void
INA228::print_status()
{