From 3aa04c7f0ae362c4494d272ecf249d862e3aec01 Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Mon, 12 Nov 2012 23:47:06 +0100 Subject: [PATCH] battery voltage sensor --- firmware/Makefile | 2 +- firmware/adc.c | 3 ++- firmware/battery.c | 25 +++++++++++++++++++++++++ firmware/lights.h | 4 ++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 firmware/battery.c diff --git a/firmware/Makefile b/firmware/Makefile index 6f2a946..70c2c32 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,7 +1,7 @@ PROGRAM=lights SRC=main.c logging.c adc.c pwm.c tmr.c pwmled.c gpio.c ambient.c pattern.c \ - buttons.c + buttons.c battery.c OBJ=$(SRC:.c=.o) diff --git a/firmware/adc.c b/firmware/adc.c index 3fdbe32..8ec62e2 100644 --- a/firmware/adc.c +++ b/firmware/adc.c @@ -99,7 +99,8 @@ ISR(ADC_vect) { // IRQ handler pwmled_adc(current_adc, adcval); if (current_adc == AMBIENT_ADC) ambient_adc(adcval); - // TODO battery sense, etc. + if (current_adc == BATTERY_ADC) + battery_adc(adcval); start_next_adc(); } diff --git a/firmware/battery.c b/firmware/battery.c new file mode 100644 index 0000000..472c1c4 --- /dev/null +++ b/firmware/battery.c @@ -0,0 +1,25 @@ +#include + +#include "lights.h" + +#define RESISTOR_HI 1500 // kOhm +#define RESISTOR_LO 150 // kOhm + +volatile unsigned char battery_100mv; + +void battery_adc(uint16_t adcval) +{ + /* + * This is tricky: we need to maintain precision, so we first + * multiply adcval by as big number as possible to fit uint16_t, + * then divide to get the final value, + * and finally type-cast it to unsigned char. + * We don't do running average, as the required precision + * is coarse (0.1 V). + */ + battery_100mv = (unsigned char) + ((adcval * 11 // 1.1V + * (RESISTOR_HI+RESISTOR_LO)/RESISTOR_LO // resistor ratio + / 4) >> 8); // divide by 1024 +} + diff --git a/firmware/lights.h b/firmware/lights.h index c866349..243700f 100644 --- a/firmware/lights.h +++ b/firmware/lights.h @@ -65,6 +65,10 @@ void led_set_status(unsigned char status); void init_buttons(); void timer_check_buttons(); +/* battery.c */ +extern volatile unsigned char battery_100mv; +void battery_adc(); + /* main.c */ void hw_setup(); void hw_suspend(); -- 2.39.3