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.
This commit is contained in:
parent
7ec64c04ad
commit
29c7dfdf64
|
@ -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){
|
||||
|
|
Loading…
Reference in New Issue