M5 battery monitor improved (read IP5306 chip)

This commit is contained in:
Klaus K Wilting committed 2020-04-19 19:51:23 +02:00
1 parent 53be14d8a6
commit 2624f7b35b
8 files changed
+128 -26

No files matched your search

+32 -14
View File
@@ -36,28 +36,40 @@ void AXP192_showstatus(void);
#endif // HAS_PMU
#ifdef HAS_IP5306
void printIP5306Stats(void);
uint8_t IP5306_GetPowerSource(void);
uint8_t IP5306_GetBatteryLevel(void);
uint8_t IP5306_GetBatteryFull(void);
#endif
// The following map functions were taken from
//
// Battery.h - Battery library
// Copyright (c) 2014 Roberto Lo Giacco
// https://github.com/rlogiacco/BatterySense
/**
* Symmetric sigmoidal approximation
* https://www.desmos.com/calculator/7m9lu26vpy
*
* c - c / (1 + k*x/v)^3
*/
static inline uint8_t sigmoidal(uint16_t voltage, uint16_t minVoltage, uint16_t maxVoltage) {
// slow
// uint8_t result = 110 - (110 / (1 + pow(1.468 * (voltage - minVoltage)/(maxVoltage - minVoltage), 6)));
static inline uint8_t sigmoidal(uint16_t voltage, uint16_t minVoltage,
uint16_t maxVoltage) {
// slow
// uint8_t result = 110 - (110 / (1 + pow(1.468 * (voltage -
// minVoltage)/(maxVoltage - minVoltage), 6)));
// steep
// uint8_t result = 102 - (102 / (1 + pow(1.621 * (voltage - minVoltage)/(maxVoltage - minVoltage), 8.1)));
// steep
// uint8_t result = 102 - (102 / (1 + pow(1.621 * (voltage -
// minVoltage)/(maxVoltage - minVoltage), 8.1)));
// normal
uint8_t result = 105 - (105 / (1 + pow(1.724 * (voltage - minVoltage)/(maxVoltage - minVoltage), 5.5)));
return result >= 100 ? 100 : result;
// normal
uint8_t result = 105 - (105 / (1 + pow(1.724 * (voltage - minVoltage) /
(maxVoltage - minVoltage),
5.5)));
return result >= 100 ? 100 : result;
}
/**
@@ -66,9 +78,13 @@ static inline uint8_t sigmoidal(uint16_t voltage, uint16_t minVoltage, uint16_t
*
* c - c / [1 + (k*x/v)^4.5]^3
*/
static inline uint8_t asigmoidal(uint16_t voltage, uint16_t minVoltage, uint16_t maxVoltage) {
uint8_t result = 101 - (101 / pow(1 + pow(1.33 * (voltage - minVoltage)/(maxVoltage - minVoltage) ,4.5), 3));
return result >= 100 ? 100 : result;
static inline uint8_t asigmoidal(uint16_t voltage, uint16_t minVoltage,
uint16_t maxVoltage) {
uint8_t result = 101 - (101 / pow(1 + pow(1.33 * (voltage - minVoltage) /
(maxVoltage - minVoltage),
4.5),
3));
return result >= 100 ? 100 : result;
}
/**
@@ -77,8 +93,10 @@ static inline uint8_t asigmoidal(uint16_t voltage, uint16_t minVoltage, uint16_t
*
* x * 100 / v
*/
static inline uint8_t linear(uint16_t voltage, uint16_t minVoltage, uint16_t maxVoltage) {
return (unsigned long)(voltage - minVoltage) * 100 / (maxVoltage - minVoltage);
static inline uint8_t linear(uint16_t voltage, uint16_t minVoltage,
uint16_t maxVoltage) {
return (unsigned long)(voltage - minVoltage) * 100 /
(maxVoltage - minVoltage);
}
uint8_t read_battlevel(mapFn_t mapFunction = &sigmoidal);