In order to stabilize the battery reading,

I modified the process to make 5 consecutive readings,
as the process is asynchronous,
there is no interference in the main process.
This commit is contained in:
Joaquim
2021-04-16 16:15:38 +01:00
parent c0c37877b5
commit 3c413bdd52
5 changed files with 40 additions and 16 deletions

View File

@@ -23,12 +23,20 @@ void Battery::Update() {
isCharging = !nrf_gpio_pin_read(chargingPin);
isPowerPresent = !nrf_gpio_pin_read(powerPresentPin);
if ( isReading ) return;
// Non blocking read
SaadcInit();
nrfx_saadc_sample();
samples = 0;
isReading = true;
SaadcInit();
nrfx_saadc_sample();
}
void Battery::adcCallbackStatic(nrfx_saadc_evt_t const *event) {
instance->SaadcEventHandler(event);
}
void Battery::SaadcInit() {
nrfx_saadc_config_t adcConfig = NRFX_SAADC_DEFAULT_CONFIG;
APP_ERROR_CHECK(nrfx_saadc_init(&adcConfig, adcCallbackStatic));
@@ -68,10 +76,13 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const * p_event) {
percentRemainingBuffer.insert(percentRemaining);
nrfx_saadc_uninit();
samples++;
if ( samples > percentRemainingSamples ) {
nrfx_saadc_uninit();
isReading = false;
} else {
nrfx_saadc_sample();
}
}
}
void Battery::adcCallbackStatic(nrfx_saadc_evt_t const *event) {
instance->SaadcEventHandler(event);
}

View File

@@ -52,13 +52,13 @@ namespace Pinetime {
float Voltage() const { return voltage; }
bool IsCharging() const { return isCharging; }
bool IsPowerPresent() const { return isPowerPresent; }
bool IsPowerPresent() const { return isPowerPresent; }
private:
static Battery *instance;
nrf_saadc_value_t saadc_value;
static constexpr uint8_t percentRemainingSamples = 10;
static constexpr uint8_t percentRemainingSamples = 5;
CircBuffer<percentRemainingSamples> percentRemainingBuffer {};
static constexpr uint32_t chargingPin = 12;
@@ -74,6 +74,9 @@ namespace Pinetime {
void SaadcEventHandler(nrfx_saadc_evt_t const * p_event);
static void adcCallbackStatic(nrfx_saadc_evt_t const *event);
bool isReading = false;
uint8_t samples = 0;
};
}
}