]> www.fi.muni.cz Git - tinyboard.git/commitdiff
battery gauge
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 1 May 2013 21:48:11 +0000 (23:48 +0200)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 1 May 2013 21:48:11 +0000 (23:48 +0200)
projects/step-up/Makefile
projects/step-up/adc.c
projects/step-up/control.c
projects/step-up/main.c

index b6ca436293d05a834e374cb6e4b72ec6554b47d1..0e9b7284342ecac985eacf5c476a4d396b7a5603 100644 (file)
@@ -1,6 +1,7 @@
 
 PROGRAM=lights
-SRC=main.c logging.c pwm.c adc.c pwmled.c pattern.c buttons.c control.c
+SRC=main.c logging.c pwm.c adc.c pwmled.c pattern.c buttons.c control.c \
+       battery.c
 OBJ=$(SRC:.c=.o)
 
 
index 194b00e0b0de070d3ab0369b287560df8f93f37a..b8c253e24af5f84eba25e4334df7afcbddaec372 100644 (file)
@@ -5,12 +5,13 @@
 
 #include "lights.h"
 
-#define ZERO_ADC    1
+#define ZERO_ADC    2
 
 //#define NUM_ADCS     ZERO_ADC
-#define NUM_ADCS       1
+#define NUM_ADCS       2
 
-volatile static unsigned char current_adc, current_slow_adc;
+volatile static unsigned char current_adc;;
+static unsigned char need_battery_adc;
 static uint16_t adc_sum, read_zero, drop_count, read_count, n_reads_log;
 volatile uint16_t jiffies;
 
@@ -21,6 +22,9 @@ static void setup_mux(unsigned char n)
        case 0: // pwmled 1: 1.1V, ADC3 (PB3), single-ended
                ADMUX = _BV(REFS1) | _BV(MUX1) | _BV(MUX0);
                break;
+       case 1: // battery voltage: 1.1V, ADC1 (PB2), single-ended
+               ADMUX = _BV(REFS1) | _BV(MUX0);
+               break;
        case ZERO_ADC: // zero: 1.1V, GND, single-ended
                ADMUX = _BV(REFS1) | _BV(MUX3) | _BV(MUX2) | _BV(MUX0);
                break;
@@ -29,37 +33,23 @@ static void setup_mux(unsigned char n)
 
 void start_next_adc()
 {
-#if 0
-       if (current_adc == 0) {
-               if (current_slow_adc > N_PWMLEDS) {
-                       // read one of the non-PWMLED ADCs
-                       current_adc = --current_slow_adc;
-               } else {
-                       // no more non-PWMLEDs to do, start with PWMLEDs
-                       current_adc = N_PWMLEDS-1;
-               }
-       } else if (current_adc >= N_PWMLEDS) {
-               // one of the non-PWMLED ADCs just finished, skip to PWMLEDs.
-               current_adc = N_PWMLEDS-1;
+       if (need_battery_adc) {
+               need_battery_adc = 0;
+               current_adc = 1;
+               read_zero = 1;
+               drop_count = 1;
+               read_count = 1;
+               n_reads_log = 0;
        } else {
-               // next PWMLED
-               current_adc--;
-       }
-#else
-       // single ADC for testing only
-       current_adc = 0;
-#endif
+               current_adc = 0;
+               read_zero = 0;
+               drop_count = 1;
+               read_count = 1 << PWMLED_ADC_SHIFT;
+               n_reads_log = PWMLED_ADC_SHIFT;
 
-#if 0
-       log_byte(0x90 + current_adc); // debug ADC switching
-#endif
+       }
 
        adc_sum = 0;
-       read_zero = 0;
-       drop_count = 1;
-
-       read_count = 1 << PWMLED_ADC_SHIFT;
-       n_reads_log = PWMLED_ADC_SHIFT;
 
        // set up mux, start one-shot conversion
        if (read_zero)
@@ -104,7 +94,7 @@ static uint16_t read_adc_sync()
 
 void init_adc()
 {
-       current_slow_adc = NUM_ADCS;
+       need_battery_adc = 0;
        current_adc = 0;
 
        power_adc_enable();
@@ -155,6 +145,9 @@ static void inline adc_based_timer()
        count = 0;
        ++jiffies;
 
+       if ((jiffies & 0x007F) == 1) { // about every 1s
+               need_battery_adc = 1;
+       }
        if ((jiffies & 0x0007) == 0) {
                patterns_next_tick();
        }
@@ -195,6 +188,9 @@ ISR(ADC_vect) { // IRQ handler
                // pwmled_adc(current_adc, adc_sum);
                pwmled_adc(adc_sum);
                break;
+       case 1:
+               battery_adc(adc_sum);
+               break;
        }
 
        start_next_adc();
index 99190cc45f2947e4b382e83cf1197b10b9613375..f6272622ef64f1ced964dfb883465daeed85e210 100644 (file)
@@ -109,7 +109,7 @@ pattern_t *status_led_pattern_select()
        if (e.battery_low)
                return number_pattern(1, 1);
 
-       return number_pattern(light_mode+1, 0);
+       return number_pattern(battery_gauge(), 0);
 }
 
 #if 0
index 5b5817a70c42e7d1ef1fe7cc0b40ac408fde7dda..383aa5eed990ead218315efe687846100b1f3df0 100644 (file)
@@ -13,7 +13,7 @@ static void hw_setup()
 
        wdt_enable(WDTO_1S);
 
-       //init_battery();
+       init_battery();
        init_pwm();
        init_adc();