mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-06 01:41:35 +08:00
INA2xx: Debounce battery connection state (#25786)
To prevent critical low battery messages on a single I2C issue.
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user