Browse Source

AP_BattMonitor: added Sum backend type

this is used to combine battery monitors into a single reporting
unit. It operates on all instances beyond itself
mission-4.1.18
Andrew Tridgell 6 years ago
parent
commit
25247433dc
  1. 4
      libraries/AP_BattMonitor/AP_BattMonitor.cpp
  2. 1
      libraries/AP_BattMonitor/AP_BattMonitor.h
  3. 2
      libraries/AP_BattMonitor/AP_BattMonitor_Params.cpp
  4. 3
      libraries/AP_BattMonitor/AP_BattMonitor_Params.h
  5. 54
      libraries/AP_BattMonitor/AP_BattMonitor_Sum.cpp
  6. 27
      libraries/AP_BattMonitor/AP_BattMonitor_Sum.h

4
libraries/AP_BattMonitor/AP_BattMonitor.cpp

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
#include "AP_BattMonitor_SMBus.h"
#include "AP_BattMonitor_Bebop.h"
#include "AP_BattMonitor_BLHeliESC.h"
#include "AP_BattMonitor_Sum.h"
#include <AP_HAL/AP_HAL.h>
@ -133,6 +134,9 @@ AP_BattMonitor::init() @@ -133,6 +134,9 @@ AP_BattMonitor::init()
drivers[instance] = new AP_BattMonitor_BLHeliESC(*this, state[instance], _params[instance]);
#endif
break;
case AP_BattMonitor_Params::BattMonitor_TYPE_Sum:
drivers[instance] = new AP_BattMonitor_Sum(*this, state[instance], _params[instance], instance);
break;
case AP_BattMonitor_Params::BattMonitor_TYPE_NONE:
default:
break;

1
libraries/AP_BattMonitor/AP_BattMonitor.h

@ -35,6 +35,7 @@ class AP_BattMonitor @@ -35,6 +35,7 @@ class AP_BattMonitor
friend class AP_BattMonitor_SMBus_Solo;
friend class AP_BattMonitor_SMBus_Maxell;
friend class AP_BattMonitor_UAVCAN;
friend class AP_BattMonitor_Sum;
public:

2
libraries/AP_BattMonitor/AP_BattMonitor_Params.cpp

@ -13,7 +13,7 @@ const AP_Param::GroupInfo AP_BattMonitor_Params::var_info[] = { @@ -13,7 +13,7 @@ const AP_Param::GroupInfo AP_BattMonitor_Params::var_info[] = {
// @Param: MONITOR
// @DisplayName: Battery monitoring
// @Description: Controls enabling monitoring of the battery's voltage and current
// @Values: 0:Disabled,3:Analog Voltage Only,4:Analog Voltage and Current,5:Solo,6:Bebop,7:SMBus-Maxell,8:UAVCAN-BatteryInfo,9:BLHeli ESC
// @Values: 0:Disabled,3:Analog Voltage Only,4:Analog Voltage and Current,5:Solo,6:Bebop,7:SMBus-Maxell,8:UAVCAN-BatteryInfo,9:BLHeli ESC,10:SumOfFollowing
// @User: Standard
// @RebootRequired: True
AP_GROUPINFO_FLAGS("MONITOR", 1, AP_BattMonitor_Params, _type, BattMonitor_TYPE_NONE, AP_PARAM_FLAG_ENABLE),

3
libraries/AP_BattMonitor/AP_BattMonitor_Params.h

@ -21,7 +21,8 @@ public: @@ -21,7 +21,8 @@ public:
BattMonitor_TYPE_BEBOP = 6,
BattMonitor_TYPE_MAXELL = 7,
BattMonitor_TYPE_UAVCAN_BatteryInfo = 8,
BattMonitor_TYPE_BLHeliESC = 9
BattMonitor_TYPE_BLHeliESC = 9,
BattMonitor_TYPE_Sum = 10,
};
// low voltage sources (used for BATT_LOW_TYPE parameter)

54
libraries/AP_BattMonitor/AP_BattMonitor_Sum.cpp

@ -0,0 +1,54 @@ @@ -0,0 +1,54 @@
#include <AP_HAL/AP_HAL.h>
#include <AP_Common/AP_Common.h>
#include <AP_Math/AP_Math.h>
#include "AP_BattMonitor.h"
#include "AP_BattMonitor_Sum.h"
/*
battery monitor that is the sum of other battery monitors after this one
This can be used to combined other current/voltage sensors into a
single backend
*/
extern const AP_HAL::HAL& hal;
/// Constructor
AP_BattMonitor_Sum::AP_BattMonitor_Sum(AP_BattMonitor &mon,
AP_BattMonitor::BattMonitor_State &mon_state,
AP_BattMonitor_Params &params,
uint8_t instance) :
AP_BattMonitor_Backend(mon, mon_state, params),
_instance(instance)
{
}
// read - read the voltage and current
void
AP_BattMonitor_Sum::read()
{
float voltage_sum = 0;
uint8_t voltage_count = 0;
float current_sum = 0;
uint8_t current_count = 0;
for (uint8_t i=_instance+1; i<_mon.num_instances(); i++) {
if (!_mon.healthy(i)) {
continue;
}
voltage_sum += _mon.voltage(i);
voltage_count++;
if (_mon.has_current(i)) {
current_sum += _mon.current_amps(i);
current_count++;
}
}
if (voltage_count > 0) {
_state.voltage = voltage_sum / voltage_count;
_state.last_time_micros = AP_HAL::micros();
}
if (current_count > 0) {
_state.current_amps = current_sum;
}
_has_current = (current_count > 0);
_state.healthy = (voltage_count > 0);
}

27
libraries/AP_BattMonitor/AP_BattMonitor_Sum.h

@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
#pragma once
#include "AP_BattMonitor.h"
#include "AP_BattMonitor_Backend.h"
class AP_BattMonitor_Sum : public AP_BattMonitor_Backend
{
public:
/// Constructor
AP_BattMonitor_Sum(AP_BattMonitor &mon, AP_BattMonitor::BattMonitor_State &mon_state, AP_BattMonitor_Params &params, uint8_t instance);
/// Read the battery voltage and current. Should be called at 10hz
void read() override;
/// returns true if battery monitor provides consumed energy info
bool has_consumed_energy() const override { return has_current(); }
/// returns true if battery monitor provides current info
bool has_current() const override { return _has_current; }
void init(void) override {}
private:
uint8_t _instance;
bool _has_current;
};
Loading…
Cancel
Save