mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-09-28 15:51:07 +08:00
feat(battery): add fault flag bitmask helpers and improve computeMaxCellVoltageDelta function
This commit is contained in:
committed by
Claudio Chies
parent
8f83e8e311
commit
adde4b1039
@@ -37,6 +37,19 @@
|
||||
#include <px4_defines.h>
|
||||
#include <px4_platform_common/log.h>
|
||||
|
||||
// Pre-shifted bitmask helpers for battery_status_s fault flags.
|
||||
#define FAULT_DEEP_DISCHARGE_FLAG (1 << battery_status_s::FAULT_DEEP_DISCHARGE)
|
||||
#define FAULT_SPIKES_FLAG (1 << battery_status_s::FAULT_SPIKES)
|
||||
#define FAULT_CELL_FAIL_FLAG (1 << battery_status_s::FAULT_CELL_FAIL)
|
||||
#define FAULT_OVER_CURRENT_FLAG (1 << battery_status_s::FAULT_OVER_CURRENT)
|
||||
#define FAULT_OVER_TEMPERATURE_FLAG (1 << battery_status_s::FAULT_OVER_TEMPERATURE)
|
||||
#define FAULT_UNDER_TEMPERATURE_FLAG (1 << battery_status_s::FAULT_UNDER_TEMPERATURE)
|
||||
#define FAULT_INCOMPATIBLE_VOLTAGE_FLAG (1 << battery_status_s::FAULT_INCOMPATIBLE_VOLTAGE)
|
||||
#define FAULT_INCOMPATIBLE_FIRMWARE_FLAG (1 << battery_status_s::FAULT_INCOMPATIBLE_FIRMWARE)
|
||||
#define FAULT_INCOMPATIBLE_MODEL_FLAG (1 << battery_status_s::FAULT_INCOMPATIBLE_MODEL)
|
||||
#define FAULT_HARDWARE_FAILURE_FLAG (1 << battery_status_s::FAULT_HARDWARE_FAILURE)
|
||||
#define FAULT_FAILED_TO_ARM_FLAG (1 << battery_status_s::FAULT_FAILED_TO_ARM)
|
||||
|
||||
const char *const UavcanBatteryBridge::NAME = "battery";
|
||||
|
||||
void UavcanBatteryBridge::publishBattery(int node_id, uint8_t instance)
|
||||
@@ -315,19 +328,19 @@ void UavcanBatteryBridge::cbat_sub_cb(const uavcan::ReceivedDataStructure<cuav::
|
||||
uint16_t faults = 0;
|
||||
|
||||
if (msg.status_flags & cuav::equipment::power::CBAT::STATUS_FLAG_OVERLOAD) {
|
||||
faults |= (1 << battery_status_s::FAULT_OVER_CURRENT);
|
||||
faults |= FAULT_OVER_CURRENT_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & cuav::equipment::power::CBAT::STATUS_FLAG_BAD_BATTERY) {
|
||||
faults |= (1 << battery_status_s::FAULT_HARDWARE_FAILURE);
|
||||
faults |= FAULT_HARDWARE_FAILURE_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & cuav::equipment::power::CBAT::STATUS_FLAG_TEMP_HOT) {
|
||||
faults |= (1 << battery_status_s::FAULT_OVER_TEMPERATURE);
|
||||
faults |= FAULT_OVER_TEMPERATURE_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & cuav::equipment::power::CBAT::STATUS_FLAG_TEMP_COLD) {
|
||||
faults |= (1 << battery_status_s::FAULT_UNDER_TEMPERATURE);
|
||||
faults |= FAULT_UNDER_TEMPERATURE_FLAG;
|
||||
}
|
||||
|
||||
_battery_status[instance].faults = faults;
|
||||
@@ -393,38 +406,38 @@ UavcanBatteryBridge::battery_continuous_sub_cb(const uavcan::ReceivedDataStructu
|
||||
uint16_t faults = 0;
|
||||
|
||||
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_OVER_CURRENT) {
|
||||
faults |= (1 << battery_status_s::FAULT_OVER_CURRENT);
|
||||
faults |= FAULT_OVER_CURRENT_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_OVER_TEMP) {
|
||||
faults |= (1 << battery_status_s::FAULT_OVER_TEMPERATURE);
|
||||
faults |= FAULT_OVER_TEMPERATURE_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_UNDER_TEMP) {
|
||||
faults |= (1 << battery_status_s::FAULT_UNDER_TEMPERATURE);
|
||||
faults |= FAULT_UNDER_TEMPERATURE_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_INCOMPATIBLE_VOLTAGE) {
|
||||
faults |= (1 << battery_status_s::FAULT_INCOMPATIBLE_VOLTAGE);
|
||||
faults |= FAULT_INCOMPATIBLE_VOLTAGE_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_INCOMPATIBLE_FIRMWARE) {
|
||||
faults |= (1 << battery_status_s::FAULT_INCOMPATIBLE_FIRMWARE);
|
||||
faults |= FAULT_INCOMPATIBLE_FIRMWARE_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_INCOMPATIBLE_CELLS_CONFIGURATION) {
|
||||
faults |= (1 << battery_status_s::FAULT_INCOMPATIBLE_MODEL);
|
||||
faults |= FAULT_INCOMPATIBLE_MODEL_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & (BatteryContinuous::STATUS_FLAG_FAULT_SHORT_CIRCUIT
|
||||
| BatteryContinuous::STATUS_FLAG_FAULT_PROTECTION_SYSTEM
|
||||
| BatteryContinuous::STATUS_FLAG_FAULT_CELL_IMBALANCE
|
||||
| BatteryContinuous::STATUS_FLAG_BAD_BATTERY)) {
|
||||
faults |= (1 << battery_status_s::FAULT_HARDWARE_FAILURE);
|
||||
faults |= FAULT_HARDWARE_FAILURE_FLAG;
|
||||
}
|
||||
|
||||
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_UNDER_VOLT) {
|
||||
faults |= (1 << battery_status_s::FAULT_DEEP_DISCHARGE);
|
||||
faults |= FAULT_DEEP_DISCHARGE_FLAG;
|
||||
}
|
||||
|
||||
_battery_status[instance].faults = faults;
|
||||
|
||||
@@ -389,8 +389,14 @@ void Battery::computeScale()
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the voltage spread across cells: max(cell_v) - min(cell_v).
|
||||
// Only cells with a positive voltage are considered; cells reporting 0 V are
|
||||
// treated as absent.
|
||||
// Returns 0 if fewer than two valid cells are present.
|
||||
float Battery::computeMaxCellVoltageDelta(const float *cells, size_t n)
|
||||
{
|
||||
if (cells == nullptr) { return 0.0; }
|
||||
|
||||
float v_min = FLT_MAX;
|
||||
float v_max = 0.f;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user