M5 battery monitor improved (read IP5306 chip)
This commit is contained in:
1 parent
53be14d8a6
commit
2624f7b35b
8 files changed
+128
-26
No files matched your search
+32
-14
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user