From 29c7dfdf6488eb2e7ef5289f49ea9667439e6132 Mon Sep 17 00:00:00 2001 From: schneider Date: Mon, 16 Jan 2012 15:50:48 +0100 Subject: [PATCH] improved accuracy of battery voltage measurement Slowing down the ADC 10x while reading the voltage gives better results due to the very high impedance of the voltage devider. Readings are now about 100mV higher than before. --- firmware/basic/voltage.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/firmware/basic/voltage.c b/firmware/basic/voltage.c index a60bdd2..4996077 100644 --- a/firmware/basic/voltage.c +++ b/firmware/basic/voltage.c @@ -3,21 +3,31 @@ #include "basic/basic.h" #include "funk/nrf24l01p.h" -static uint32_t results=5000; +static uint32_t voltage=5000; static uint8_t chrg=1; void VoltageCheck(void){ chrg=gpioGetValue(RB_PWR_CHRG); + //slow down the adc for our high impedance volatage devider + ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 100000 - 1 ) << 8; + voltage = adcRead(1); + //speed it up again + ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 1000000 - 1 ) << 8; - results = adcRead(1); - results *= 10560; - results /= 1024; - results += 50; - if( results < 3500 ){ + voltage *= 10560; + voltage /= 1024; + + //add the drop over the voltage switch + voltage += 50; + + //battery is assumed empty if the volatge falls bellow 3.5V + if( voltage < 3500 ){ nrf_off(); gpioSetValue (RB_PWR_GOOD, 0); - gpioSetValue (RB_LCD_BL, 0); + gpioSetValue (RB_LCD_BL, 0); + + //put the chip into deep power down SCB_SCR |= SCB_SCR_SLEEPDEEP; PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN; __asm volatile ("WFI"); @@ -25,7 +35,7 @@ void VoltageCheck(void){ }; uint32_t GetVoltage(void){ - return results; + return voltage; }; uint8_t GetChrgStat(void){