From ffb4982594d98b8d8ecd9efcfe37c17e0f2fc53b Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Wed, 1 May 2013 23:48:11 +0200 Subject: [PATCH] battery gauge --- projects/step-up/Makefile | 3 +- projects/step-up/adc.c | 58 ++++++++++++++++++-------------------- projects/step-up/control.c | 2 +- projects/step-up/main.c | 2 +- 4 files changed, 31 insertions(+), 34 deletions(-) diff --git a/projects/step-up/Makefile b/projects/step-up/Makefile index b6ca436..0e9b728 100644 --- a/projects/step-up/Makefile +++ b/projects/step-up/Makefile @@ -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) diff --git a/projects/step-up/adc.c b/projects/step-up/adc.c index 194b00e..b8c253e 100644 --- a/projects/step-up/adc.c +++ b/projects/step-up/adc.c @@ -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(); diff --git a/projects/step-up/control.c b/projects/step-up/control.c index 99190cc..f627262 100644 --- a/projects/step-up/control.c +++ b/projects/step-up/control.c @@ -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 diff --git a/projects/step-up/main.c b/projects/step-up/main.c index 5b5817a..383aa5e 100644 --- a/projects/step-up/main.c +++ b/projects/step-up/main.c @@ -13,7 +13,7 @@ static void hw_setup() wdt_enable(WDTO_1S); - //init_battery(); + init_battery(); init_pwm(); init_adc(); -- 2.39.3