Merge pull request #7447 from mikeller/make_battery_filtering_configurable

Make battery voltage / current filter cutoffs configurable.
This commit is contained in:
Michael Keller 2019-01-24 01:45:56 +13:00 committed by GitHub
commit a4ce8b5600
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 25 additions and 15 deletions

View File

@ -782,8 +782,10 @@ const clivalue_t valueTable[] = {
{ "use_vbat_alerts", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_BATTERY_CONFIG, offsetof(batteryConfig_t, useVBatAlerts) },
{ "use_cbat_alerts", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_BATTERY_CONFIG, offsetof(batteryConfig_t, useConsumptionAlerts) },
{ "cbat_alert_percent", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 100 }, PG_BATTERY_CONFIG, offsetof(batteryConfig_t, consumptionWarningPercentage) },
{ "vbat_cutoff_percent", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 100 }, PG_BATTERY_CONFIG, offsetof(batteryConfig_t, lvcPercentage) },
{ "vbat_cutoff_percent", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 100 }, PG_BATTERY_CONFIG, offsetof(batteryConfig_t, lvcPercentage) },
{ "force_battery_cell_count", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 24 }, PG_BATTERY_CONFIG, offsetof(batteryConfig_t, forceBatteryCellCount) },
{ "vbat_lpf_period", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, UINT8_MAX }, PG_BATTERY_CONFIG, offsetof(batteryConfig_t, vbatLpfPeriod) },
{ "ibat_lpf_period", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, UINT8_MAX }, PG_BATTERY_CONFIG, offsetof(batteryConfig_t, ibatLpfPeriod) },
// PG_VOLTAGE_SENSOR_ADC_CONFIG
{ "vbat_scale", VAR_UINT8 | MASTER_VALUE, .config.minmax = { VBAT_SCALE_MIN, VBAT_SCALE_MAX }, PG_VOLTAGE_SENSOR_ADC_CONFIG, offsetof(voltageSensorADCConfig_t, vbatscale) },

View File

@ -114,7 +114,10 @@ PG_RESET_TEMPLATE(batteryConfig_t, batteryConfig,
.consumptionWarningPercentage = 10,
.vbathysteresis = 1,
.vbatfullcellvoltage = 410
.vbatfullcellvoltage = 410,
.vbatLpfPeriod = 30,
.ibatLpfPeriod = 10,
);
void batteryUpdateVoltage(timeUs_t currentTimeUs)

View File

@ -30,6 +30,8 @@
#define VBAT_CELL_VOTAGE_RANGE_MIN 100
#define VBAT_CELL_VOTAGE_RANGE_MAX 500
#define GET_BATTERY_LPF_FREQUENCY(period) (1.0f / (period / 10))
typedef struct batteryConfig_s {
// voltage
uint16_t vbatmaxcellvoltage; // maximum voltage per cell, used for auto-detecting battery voltage in 0.01V units, default is 430 (4.30V)
@ -51,8 +53,9 @@ typedef struct batteryConfig_s {
uint16_t vbatfullcellvoltage; // Cell voltage at which the battery is deemed to be "full" 0.01V units, default is 410 (4.1V)
uint8_t forceBatteryCellCount; // number of cells in battery, used for overwriting auto-detected cell count if someone has issues with it.
uint8_t forceBatteryCellCount; // Number of cells in battery, used for overwriting auto-detected cell count if someone has issues with it.
uint8_t vbatLpfPeriod; // Period of the cutoff frequency for the Vbat filter (in 0.1 s)
uint8_t ibatLpfPeriod; // Period of the cutoff frequency for the Ibat filter (in 0.1 s)
} batteryConfig_t;
PG_DECLARE(batteryConfig_t, batteryConfig);

View File

@ -23,6 +23,7 @@
#include "string.h"
#include "platform.h"
#include "build/build_config.h"
#include "build/debug.h"
@ -34,12 +35,13 @@
#include "pg/pg.h"
#include "pg/pg_ids.h"
#include "config/config_reset.h"
#include "sensors/adcinternal.h"
#include "sensors/current.h"
#include "sensors/battery.h"
#include "sensors/esc_sensor.h"
#include "current.h"
const char * const currentMeterSourceNames[CURRENT_METER_COUNT] = {
"NONE", "ADC", "VIRTUAL", "ESC", "MSP"
};
@ -86,7 +88,6 @@ void currentMeterReset(currentMeter_t *meter)
// ADC/Virtual shared
//
#define IBAT_LPF_FREQ 2.0f
static biquadFilter_t adciBatFilter;
#ifndef CURRENT_METER_SCALE_DEFAULT
@ -140,7 +141,7 @@ currentMeterADCState_t currentMeterADCState;
void currentMeterADCInit(void)
{
memset(&currentMeterADCState, 0, sizeof(currentMeterADCState_t));
biquadFilterInitLPF(&adciBatFilter, IBAT_LPF_FREQ, HZ_TO_INTERVAL_US(50));
biquadFilterInitLPF(&adciBatFilter, GET_BATTERY_LPF_FREQUENCY(batteryConfig()->ibatLpfPeriod), HZ_TO_INTERVAL_US(50));
}
void currentMeterADCRefresh(int32_t lastUpdateAt)

View File

@ -26,20 +26,23 @@
#include "build/build_config.h"
#include "common/maths.h"
#include "common/filter.h"
#include "common/maths.h"
#include "common/utils.h"
#include "config/config_reset.h"
#include "drivers/adc.h"
#include "pg/pg.h"
#include "pg/pg_ids.h"
#include "config/config_reset.h"
#include "sensors/adcinternal.h"
#include "sensors/voltage.h"
#include "sensors/battery.h"
#include "sensors/esc_sensor.h"
#include "voltage.h"
const char * const voltageMeterSourceNames[VOLTAGE_METER_COUNT] = {
"NONE", "ADC", "ESC"
};
@ -191,7 +194,7 @@ void voltageMeterADCInit(void)
voltageMeterADCState_t *state = &voltageMeterADCStates[i];
memset(state, 0, sizeof(voltageMeterADCState_t));
biquadFilterInitLPF(&state->filter, VBAT_LPF_FREQ, HZ_TO_INTERVAL_US(50));
biquadFilterInitLPF(&state->filter, GET_BATTERY_LPF_FREQUENCY(batteryConfig()->vbatLpfPeriod), HZ_TO_INTERVAL_US(50));
}
}
@ -215,7 +218,7 @@ void voltageMeterESCInit(void)
{
#ifdef USE_ESC_SENSOR
memset(&voltageMeterESCState, 0, sizeof(voltageMeterESCState_t));
biquadFilterInitLPF(&voltageMeterESCState.filter, VBAT_LPF_FREQ, HZ_TO_INTERVAL_US(50));
biquadFilterInitLPF(&voltageMeterESCState.filter, GET_BATTERY_LPF_FREQUENCY(batteryConfig()->vbatLpfPeriod), HZ_TO_INTERVAL_US(50));
#endif
}

View File

@ -67,8 +67,6 @@ typedef enum {
#define VBAT_MULTIPLIER_MIN 1
#define VBAT_MULTIPLIER_MAX 255
#define VBAT_LPF_FREQ 0.5f
#ifndef MAX_VOLTAGE_SENSOR_ADC
#define MAX_VOLTAGE_SENSOR_ADC 1 // VBAT - some boards have external, 12V, 9V and 5V meters.
#endif