added function to linearize temperature

master
Dennis Gnad 13 years ago
parent 8ca5d8df66
commit 1e4c119164

@ -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;

Loading…
Cancel
Save