From 1e4c11916451b90d008059d96d50c6b45ff1ad54 Mon Sep 17 00:00:00 2001 From: Dennis Gnad Date: Mon, 14 Jan 2013 11:34:26 +0100 Subject: [PATCH] added function to linearize temperature --- firmware/cup.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/firmware/cup.c b/firmware/cup.c index dd530b6..832c37f 100644 --- a/firmware/cup.c +++ b/firmware/cup.c @@ -18,9 +18,11 @@ uint8_t setting_timeout = 0; uint8_t adc_pos = 0; uint16_t adc_sum = 0; -uint16_t temperature = 0; +uint16_t temperature_adc = 0; uint16_t target = 0; +uint16_t temperature = 0; + uint8_t heat_pwm = 0; uint8_t heat_on[2] = {0, 0}; uint8_t heat_off[2] = {0, 0}; @@ -65,6 +67,51 @@ ISR(PCINT0_vect) input_state = new_state; } +// Measure: 5V --- 10k --- --- PTY81-121 -- GND +// | +// uC ADC pin (with 1.11V reference) +uint16_t linearize_temp(uint16_t temp_in) +{ + static const uint16_t one_point_one_volt = 65472; //2^16-2^6 + uint16_t temp_out = ~0; //burning + // made from datasheet by: + // for i in 677 740 807 877 951 1029 1111 1196 1286 1378 1475 1575 1679 1786 1896 2003 2103 2189; do calc 5*$i/9860*65472/1.11; done + static const uint16_t coeffs[] = + { + // in, out + 20250, 0, // -20 celsius + 22134, 0, // -10 celsius + 24138, 0, // 0 celsius + 26232, 100, // 10 celsius + 28445, 200, + 30778, 300, + 33231, 400, // 50 celsius + 35773, 500, // .. + 38465, 600, + 41216, 700, + 44118, 800, + 47109, 900, + 50220, 1000, + 53420, 1100, + 56711, 1200, + 59911, 1300, + 62902, 1400, + 65474, 1500, // 150 celsius + 65535, 1520, // made-up, not from datasheet + }; + uint8_t i=2; + for (; i < (sizeof(coeffs)>>1)-2; i+=2) + { + if ( temp_in < coeffs[i] ) + { + temp_out = (uint16_t) ( coeffs[i-1] + (uint32_t) + ( (uint32_t) (temp_in-coeffs[i-2]) * (coeffs[i+1]-coeffs[i-1]) ) / (coeffs[i]-coeffs[i-2])); + break; + } + } + return temp_out; +} + void io_init(void) { PORTA = (1 << TAST_PIN) | (1 << IMPULS1_PIN) | (1 << IMPULS0_PIN);/* enable pullups on inputs */ @@ -127,14 +174,15 @@ int main(void) adc_sum += ADC; if(++adc_pos == 64) { - temperature = adc_sum; + temperature_adc = adc_sum; adc_sum = 0; adc_pos = 0; + temperature = linearize_temp(temperature_adc); } } if(setting_timeout) {led_set(target);} - else {led_set(temperature);} + else {led_set(temperature);}OB } return 0;