29c7dfdf64
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.
43 lines
1,002 B
C
43 lines
1,002 B
C
#include <sysinit.h>
|
|
|
|
#include "basic/basic.h"
|
|
#include "funk/nrf24l01p.h"
|
|
|
|
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;
|
|
|
|
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);
|
|
|
|
//put the chip into deep power down
|
|
SCB_SCR |= SCB_SCR_SLEEPDEEP;
|
|
PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN;
|
|
__asm volatile ("WFI");
|
|
};
|
|
};
|
|
|
|
uint32_t GetVoltage(void){
|
|
return voltage;
|
|
};
|
|
|
|
uint8_t GetChrgStat(void){
|
|
return !chrg;
|
|
};
|