From 5e12e742baa0fa5d300c8fc724099ff5d35039eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Ple=C3=9F?= Date: Fri, 13 Jun 2014 21:04:19 +0200 Subject: [PATCH] first release of working firmware --- schaltungen/powerboard_v3/pb_mainboard_v3.pdf | Bin 0 -> 30220 bytes schaltungen/powerboard_v3/software/src/adc.c | 33 ++--- schaltungen/powerboard_v3/software/src/main.c | 134 ++++++++++++++---- schaltungen/powerboard_v3/software/src/main.h | 20 +-- .../powerboard_v3/software/src/utils.h | 2 +- 5 files changed, 129 insertions(+), 60 deletions(-) create mode 100644 schaltungen/powerboard_v3/pb_mainboard_v3.pdf diff --git a/schaltungen/powerboard_v3/pb_mainboard_v3.pdf b/schaltungen/powerboard_v3/pb_mainboard_v3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4336e9242116b39a3702ce07c219670b06a6490c GIT binary patch literal 30220 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 @?XXU4J*!EeO* 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 N9t;Ks8C6+~{}12Gqfh_< literal 0 HcmV?d00001 diff --git a/schaltungen/powerboard_v3/software/src/adc.c b/schaltungen/powerboard_v3/software/src/adc.c index 8ad8969..da650a4 100644 --- a/schaltungen/powerboard_v3/software/src/adc.c +++ b/schaltungen/powerboard_v3/software/src/adc.c @@ -6,8 +6,8 @@ void adc_init(void) { // AVCC with external capacitor at AREF pin ADMUX = _BV(REFS0); - // set frequency prescaler to 8 - ADCSRA = _BV(ADPS1) | _BV(ADPS0); + // set frequency prescaler to 64 + ADCSRA = _BV(ADPS2) | _BV(ADPS1); // enable ADC ADCSRA |= _BV(ADEN); @@ -22,21 +22,22 @@ void adc_init(void) { } -uint16_t adc_read_single(uint8_t channel) { - ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); - ADCSRA |= _BV(ADSC); - while (ADCSRA & (1<= UR_MAX)) { next = EX_OFF; @@ -83,45 +88,91 @@ static void statemachine_k2_k3() { } #ifdef DEBUG - uart_puts_P("state: "); - uart_print_uint8 + if(current_state_k2k3 != next) uart_puts_P("new state: "); #endif + switch(next) { default: case Q_OFF: - BAT_OFF; + //BAT_OFF; + BAT_ON; LOAD_OFF; #ifdef DEBUG - uart_puts_P("Q_OFF\r\n"); + if(current_state_k2k3 != next) uart_puts_P("Q_OFF\r\n"); #endif break; case Q_ON: - BAT_OFF; + //BAT_OFF; + BAT_ON; LOAD_ON; #ifdef DEBUG - uart_puts_P("Q_ON\r\n"); + if(current_state_k2k3 != next) uart_puts_P("Q_ON\r\n"); #endif break; case EX_OFF: BAT_ON; LOAD_OFF; #ifdef DEBUG - uart_puts_P("EX_OFF\r\n"); + if(current_state_k2k3 != next) uart_puts_P("EX_OFF\r\n"); #endif break; case EX_ON: BAT_ON; LOAD_ON; #ifdef DEBUG - uart_puts_P("EX_ON\r\n"); + if(current_state_k2k3 != next) uart_puts_P("EX_ON\r\n"); #endif break; } - current_state = next; + current_state_k2k3 = next; } +static void statemachine_k1() { + enum states_k1 next; + + switch(current_state_k1) { + default: + case G_OFF: + if(u_g > UG_MIN && u_g < UG_MAX) { + next = G_ON; + } else { + next = G_OFF; + } + break; + case G_ON: + if(u_g <= UG_MIN || u_g > UG_MAX) { + next = G_OFF; + } else { + next = G_ON; + } + break; + } + +#ifdef DEBUG + if(current_state_k1 != next) uart_puts_P("new state k1: "); +#endif + + switch(next) { + default: + case G_OFF: + GEN_OFF; +#ifdef DEBUG + if(current_state_k1 != next) uart_puts_P("G_OFF\r\n"); +#endif + break; + case G_ON: + GEN_ON; +#ifdef DEBUG + if(current_state_k1 != next) uart_puts_P("G_ON\r\n"); +#endif + break; + } + + current_state_k1 = next; + +} static void timer_init(void) { // clock is 8MHz @@ -148,20 +199,50 @@ static void ports_init(void) { void measure(void) { static int16_t temp; + static uint32_t vtemp; - u_r = adc_read_avg(AD_V_REG, 4); - u_r *= VOLTAGE_PER_TICK; - u_r += 790; + // Regulator Voltage has a Voltage-Divider R1 = 56k, R2 = 27k + // U2 = U * ( R2 / (R1+R2) ) + // U = U2 / ( R2 / (R1+R2) ) + // U = 5V / ( 27k / 83k ) = 15.37V -> Umax + // 27k / 83k = 0.3253 + // ADC = (Ur * 0.325 * 1024) / 5V + // ADC = Ur * 66,56 + // ADC = ( Ur * 10 * 1000 ) / 665 -> Ur in mV + + vtemp = adc_read_avg(AD_V_REG, 20); + vtemp = vtemp * 10 * 1000; + u_r = vtemp / (665 - 1); // -1 to calibrate the resistors + u_r = u_r + 143; // 143 resistor offset - u_g = adc_read_avg(AD_V_GEN, 4); - u_g *= VOLTAGE_PER_TICK; + + // Generator Voltage has a Voltage-Divider R1 = 68k, R2 = 10k + // U2 = U * ( R2 / (R1+R2) ) + // U = U2 / ( R2 / (R1+R2) ) + // U = 5V / ( 10k / 78k ) = 39V -> Umax + // 10k / 78k = 0.128 + // ADC = (Ur * 0.128 * 1024) / 5V + // ADC = Ur * 131,1 / 5V + // ADC = Ur * 26,2 + // ADC = ( Ur * 10 * 1000 ) / 262 -> Ur in mV + vtemp = adc_read_avg(AD_V_GEN, 20); + vtemp = vtemp * 10 * 1000; + u_g = vtemp / (262 - 3); // -3 to calibrate the resistors + u_g = u_g + 85; // 85 resistor offset - temp = adc_read_avg(AD_I_GEN, 4); - temp -= CURRENT_OFFSET; + + temp = adc_read_avg(AD_I_GEN, 20); + temp -= 511; // substract Sensor offset (2,5V) if(temp < 0) temp = 0; - i_g = temp * CURRENT_PER_TICK; + //i_g = (temp * 151510) / 2048; + i_g = temp * (74 - 2); + if(i_g > 210) { + i_g = i_g - 210; + } else { + i_g = 0; + } - mode = (PIN_TP & TP1) ? EXHAUST : QUICK; + mode = (PIN_TP & _BV(TP1)) ? QUICK : EXHAUST; } uint16_t get_power(uint16_t voltage, int16_t currents) { @@ -184,11 +265,11 @@ void pretty_print_all_values(void) { uart_puts_P("W\r\n"); uart_puts_P("l,g,b: "); - uart_putc(48 + (IS_LOAD_ON >> LOADSW)); + uart_putc(48 + IS_LOAD_ON); uart_putc(','); - uart_putc(48 + (IS_GEN_ON >> GENSW)); + uart_putc(48 + IS_GEN_ON); uart_putc(','); - uart_putc(48 + (IS_BAT_ON >> BATSW)); + uart_putc(48 + IS_BAT_ON); uart_puts_P("\r\n"); } @@ -228,7 +309,8 @@ int main(void) { //pretty_print_all_values(); - statemachine_k2_k3(); + statemachine_k1(); + statemachine_k2_k3(); } } diff --git a/schaltungen/powerboard_v3/software/src/main.h b/schaltungen/powerboard_v3/software/src/main.h index bb5c88a..1e64c7c 100644 --- a/schaltungen/powerboard_v3/software/src/main.h +++ b/schaltungen/powerboard_v3/software/src/main.h @@ -26,24 +26,10 @@ #define BAT_ON PORT_SW |= _BV(BATSW) #define BAT_OFF PORT_SW &= ~_BV(BATSW) - #define IS_LOAD_ON (PIN_SW & _BV(LOADSW)) >> LOADSW - #define IS_GEN_ON (PIN_SW & _BV(GENSW)) >> GENSW - #define IS_BAT_ON (PIN_SW & _BV(BATSW)) >> BATSW + #define IS_LOAD_ON ( (PIN_SW & _BV(LOADSW)) >> LOADSW ) + #define IS_GEN_ON ( (PIN_SW & _BV(GENSW)) >> GENSW ) + #define IS_BAT_ON ( (PIN_SW & _BV(BATSW)) >> BATSW ) - #define GENERATOR 13000 - #define GENERATOR_TIMEOUT 3 - #define GENERATOR_OFF_TIMEOUT 1 - - #define UNDERVOLTAGE 11200 - #define OVERVOLTAGE 15000 - #define OVERVOLTAGE_TIMEOUT 5 - #define OVERVOLTAGEOFF_TIMEOUT 3 - #define UNDERVOLTAGE_TIMEOUT 5 - #define UNDERVOLTAGEOFF_TIMEOUT 3 - - #define CURRENT_OFFSET 511 - #define CURRENT_PER_TICK 72 - #define VOLTAGE_PER_TICK 15 #endif diff --git a/schaltungen/powerboard_v3/software/src/utils.h b/schaltungen/powerboard_v3/software/src/utils.h index 2573b6a..9ede58e 100644 --- a/schaltungen/powerboard_v3/software/src/utils.h +++ b/schaltungen/powerboard_v3/software/src/utils.h @@ -3,7 +3,7 @@ extern void wait(uint8_t count); extern void uart_print_voltage(uint16_t); - extern void uart_print_uint8_t(uint8_t); + extern void uart_print_uint8(uint8_t); extern void uart_print_uint16(uint16_t); #endif