Skip to content

Commit 39de8c5

Browse files
Merge pull request iNavFlight#3166 from shellixyz/add_vbat_cell_detect_voltage
Replace vbat_max_cell_voltage by the new vbat_cell_detect_voltage setting for detecting number of battery cells
2 parents 05a9be3 + 49b3444 commit 39de8c5

File tree

4 files changed

+18
-7
lines changed

4 files changed

+18
-7
lines changed

src/main/fc/fc_msp.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,7 @@ static bool mspFcProcessOutCommand(uint16_t cmdMSP, sbuf_t *dst, mspPostProcessF
700700
sbufWriteU16(dst, compassConfig()->mag_declination / 10);
701701

702702
sbufWriteU16(dst, batteryConfig()->voltage.scale);
703+
sbufWriteU16(dst, batteryConfig()->voltage.cellDetect);
703704
sbufWriteU16(dst, batteryConfig()->voltage.cellMin);
704705
sbufWriteU16(dst, batteryConfig()->voltage.cellMax);
705706
sbufWriteU16(dst, batteryConfig()->voltage.cellWarning);
@@ -712,6 +713,7 @@ static bool mspFcProcessOutCommand(uint16_t cmdMSP, sbuf_t *dst, mspPostProcessF
712713

713714
case MSP2_INAV_BATTERY_CONFIG:
714715
sbufWriteU16(dst, batteryConfig()->voltage.scale);
716+
sbufWriteU16(dst, batteryConfig()->voltage.cellDetect);
715717
sbufWriteU16(dst, batteryConfig()->voltage.cellMin);
716718
sbufWriteU16(dst, batteryConfig()->voltage.cellMax);
717719
sbufWriteU16(dst, batteryConfig()->voltage.cellWarning);
@@ -1613,7 +1615,7 @@ static mspResult_e mspFcProcessInCommand(uint16_t cmdMSP, sbuf_t *src)
16131615
break;
16141616

16151617
case MSP2_INAV_SET_MISC:
1616-
if (dataSize == 37) {
1618+
if (dataSize == 39) {
16171619
rxConfigMutable()->midrc = constrain(sbufReadU16(src), MIDRC_MIN, MIDRC_MAX);
16181620

16191621
motorConfigMutable()->minthrottle = constrain(sbufReadU16(src), PWM_RANGE_MIN, PWM_RANGE_MAX);
@@ -1643,6 +1645,7 @@ static mspResult_e mspFcProcessInCommand(uint16_t cmdMSP, sbuf_t *src)
16431645
#endif
16441646

16451647
batteryConfigMutable()->voltage.scale = sbufReadU16(src);
1648+
batteryConfigMutable()->voltage.cellDetect = sbufReadU16(src);
16461649
batteryConfigMutable()->voltage.cellMin = sbufReadU16(src);
16471650
batteryConfigMutable()->voltage.cellMax = sbufReadU16(src);
16481651
batteryConfigMutable()->voltage.cellWarning = sbufReadU16(src);
@@ -1660,8 +1663,9 @@ static mspResult_e mspFcProcessInCommand(uint16_t cmdMSP, sbuf_t *src)
16601663
break;
16611664

16621665
case MSP2_INAV_SET_BATTERY_CONFIG:
1663-
if (dataSize == 25) {
1666+
if (dataSize == 27) {
16641667
batteryConfigMutable()->voltage.scale = sbufReadU16(src);
1668+
batteryConfigMutable()->voltage.cellDetect = sbufReadU16(src);
16651669
batteryConfigMutable()->voltage.cellMin = sbufReadU16(src);
16661670
batteryConfigMutable()->voltage.cellMax = sbufReadU16(src);
16671671
batteryConfigMutable()->voltage.cellWarning = sbufReadU16(src);

src/main/fc/settings.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,11 @@ groups:
501501
condition: USE_ADC
502502
min: VBAT_SCALE_MIN
503503
max: VBAT_SCALE_MAX
504+
- name: vbat_cell_detect_voltage
505+
field: voltage.cellDetect
506+
condition: USE_ADC
507+
min: 100
508+
max: 500
504509
- name: vbat_max_cell_voltage
505510
field: voltage.cellMax
506511
condition: USE_ADC

src/main/sensors/battery.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
#define ADCVREF 3300 // in mV (3300 = 3.3V)
4747

48-
#define VBATT_CELL_FULL_MAX_DIFF 14 // Max difference with cell max voltage for the battery to be considered full (10mV steps)
48+
#define VBATT_CELL_FULL_MAX_DIFF 10 // Max difference with cell max voltage for the battery to be considered full (10mV steps)
4949
#define VBATT_PRESENT_THRESHOLD 100 // Minimum voltage to consider battery present
5050
#define VBATT_STABLE_DELAY 40 // Delay after connecting battery to begin monitoring
5151
#define VBATT_HYSTERESIS 10 // Batt Hysteresis of +/-100mV for changing battery state
@@ -73,13 +73,14 @@ static int32_t mWhDrawn = 0; // energy (milliWatt hours) drawn fro
7373

7474
batteryState_e batteryState;
7575

76-
PG_REGISTER_WITH_RESET_TEMPLATE(batteryConfig_t, batteryConfig, PG_BATTERY_CONFIG, 1);
76+
PG_REGISTER_WITH_RESET_TEMPLATE(batteryConfig_t, batteryConfig, PG_BATTERY_CONFIG, 2);
7777

7878
PG_RESET_TEMPLATE(batteryConfig_t, batteryConfig,
7979

8080
.voltage = {
8181
.scale = VBAT_SCALE_DEFAULT,
82-
.cellMax = 424,
82+
.cellDetect = 430,
83+
.cellMax = 420,
8384
.cellMin = 330,
8485
.cellWarning = 350
8586
},
@@ -148,7 +149,7 @@ void batteryUpdate(uint32_t vbatTimeDelta)
148149
delay(VBATT_STABLE_DELAY);
149150
updateBatteryVoltage(vbatTimeDelta);
150151

151-
unsigned cells = (batteryAdcToVoltage(vbatLatestADC) / batteryConfig()->voltage.cellMax) + 1;
152+
unsigned cells = (batteryAdcToVoltage(vbatLatestADC) / batteryConfig()->voltage.cellDetect) + 1;
152153
if (cells > 8) cells = 8; // something is wrong, we expect 8 cells maximum (and autodetection will be problematic at 6+ cells)
153154

154155
batteryCellCount = cells;

src/main/sensors/battery.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ typedef struct batteryConfig_s {
4949

5050
struct {
5151
uint16_t scale; // adjust this to match battery voltage to reported value
52-
uint16_t cellMax; // maximum voltage per cell, used for auto-detecting battery voltage in 0.01V units, default is 421 (4.21V)
52+
uint16_t cellDetect; // maximum voltage per cell, used for auto-detecting battery cell count in 0.01V units, default is 430 (4.3V)
53+
uint16_t cellMax; // maximum voltage per cell, used for full battery detection and battery gauge voltage in 0.01V units, default is 424 (4.24V)
5354
uint16_t cellMin; // minimum voltage per cell, this triggers battery critical alarm, in 0.01V units, default is 330 (3.3V)
5455
uint16_t cellWarning; // warning voltage per cell, this triggers battery warning alarm, in 0.01V units, default is 350 (3.5V)
5556
} voltage;

0 commit comments

Comments
 (0)