crashtest-r0ket/firmware/basic/voltage.c
schneider 29c7dfdf64 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.
2012-01-16 15:50:48 +01:00

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;
};