From 2f37b902748b3fc3d0f14fe8ba4937d84ea2517e Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sat, 30 Jun 2007 18:29:45 +0000 Subject: [PATCH] Added temperature conversion loop and Celsius display. --- Makefile | 2 +- kokare.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 81 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 03e831b..906c8f1 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ program: kokare.hex # avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 $< $@ kokare.elf: kokare.o - avr-gcc $> -o $@ $(MLDFLAGS) + avr-gcc $> -o $@ $(MLDFLAGS) -lm .c.o: avr-gcc -c $(MCFLAGS) $< -o $@ diff --git a/kokare.c b/kokare.c index f63c642..12fbf9a 100644 --- a/kokare.c +++ b/kokare.c @@ -1,6 +1,7 @@ #include #include #include +#include #define SEGA 4 #define SEGB 2 @@ -30,6 +31,7 @@ uint8_t font[16] = { SEGA | SEGE | SEGF | SEGG, }; /* LED */ +#define LCDELAY 1000 uint8_t dsp[2] = {0, 0}; char leda = 0; char ledc = 0; @@ -50,6 +52,9 @@ unsigned long tstart; unsigned long ttime; unsigned long ttimea = 10000; char tavgok = 0; +/* Conversion loop */ +int tempk; +volatile ktok = 0; /* Zero-cross detector*/ volatile char zok = 0; unsigned long ztime; @@ -142,7 +147,7 @@ void ledcycle(void) static uint16_t last = 0; uint8_t c, d, v; - if(TCNT1 - last > 500) { + if(TCNT1 - last > LCDELAY) { last = TCNT1; if(++leda >= 8) { leda = 0; @@ -193,6 +198,49 @@ void calcavg(void) } } +void convcycle(void) +{ + static char state = 0; + static unsigned long last = 0; + static float a, ra, l, t; + + /* + * Theoretically: + * t = RC * ln(2) => R = t / (C * ln(2)) + * R = A * exp(B / T) => T = B / ln(R / A) + * T = B / ln(R / (A * C * ln(2))) + * In the following: + * a = ttimea as float + * C = 1e6 / (A * C * ln(2)) + * ra = a * C + * l = ln(ra) + * t = B / l + * Note, temperature is in Kelvin + */ +#define C 9.792934 +#define B 4020.0 + if(state == 0) { + if((mnow - last > 200000) && tavgok) { + a = (float)ttimea; + state = 1; + tavgok = 0; + } + } else if(state == 1) { + ra = a * C; + state = 2; + } else if(state == 2) { + l = log(ra); + state = 3; + } else if(state == 3) { + t = B / l; + state = 4; + } else if(state == 4) { + tempk = (int)t; + ktok = 1; + state = 0; + } +} + void triaccycle(void) { if(trstate == 0) { @@ -226,6 +274,7 @@ int main(void) ledcycle(); tempcycle(); calcavg(); + convcycle(); triaccycle(); #if 1 @@ -234,21 +283,26 @@ int main(void) */ if(state == 0) { /* Display temperature */ - if(tavgok) { - tavgok = 0; - if(ttimea < 20000) { - display((ttimea / 100) % 100); - dsp[0] |= SEGP; - if(ttimea >= 10000) - dsp[1] |= SEGP; + if(ktok) { + ktok = 0; + if((tempk >= 273) && (tempk <= 372)) { + display(tempk - 273); } else { - display(ttimea / 1000); + dsp[0] = dsp[1] = SEGG; } } if(pval != 0) { state = 1; utime = mnow; } + if(sstate == 2) { + sstate = 0; + if(stime > 10) { + state = 2; + } else { + tron = !tron; + } + } } else if(state == 1) { /* Triac control */ if(pval != 0) { @@ -265,10 +319,23 @@ int main(void) if(mnow - utime > 1000000) { state = 0; } - } - if(sstate == 2) { - tron = !tron; - sstate = 0; + if(sstate == 2) { + tron = !tron; + sstate = 0; + } + } else if(state == 2) { + if(ttimea < 20000) { + display((ttimea / 100) % 100); + dsp[0] |= SEGP; + if(ttimea >= 10000) + dsp[1] |= SEGP; + } else { + display(ttimea / 1000); + } + if(sstate == 2) { + state = 0; + sstate = 0; + } } #endif /* -- 2.11.0