• Aug 20, 2016|
  • Blog |
  • Nicolaj Wyke

En termistor er en termisk modstand - en modstand der ændrer værdi efter temperaturen. Teknisk set er alle modstande thermistorer. Deres værdi ændres en smule ved temperaturændringer, dog så lidt at det ofte ikke kan måles. Thermistorer er designet til at ændre modstanden meget mere efter temperaturen, og værdien er derfor nemmere at måle.

Der er to typer thermistorer, NTC (negativ temperatur coefficient) og PTC (positiv temperatur coefficient). Typisk bruges NTC til temperaturmåling, og PTC til auto-reset sikringer - men PTC kan også sagtens bruges til temperaturmålinger.

Thermistorer har en række fordele i forhold til andre temperatursensorer som de analoge TMP36, digitale sensorer som DS18B20 og thermocouples:

  • Meget billigere end ovenstående typer
  • Nemmere at gøre vandtætte, da det bare er en modstand
  • Virker med alle spændinger (digitale sensorer kræver 3V eller 5V
  • Sammenlignet med en thermocouple, skal du ikke bruge en forstærker til at måle temperaturen. Du kan bruge en microcontroller direkte
  • Kan være meget præcise. Denne 10K ohm 1% thermistor kan måle ned til ±0.25ºC præcision
  • Svær at ødelægge. Simpel og meget pålidelig

På den anden side kræver de lidt mere arbejde i forhold til at beregne målingerne om til en temperatur. Uden en digital-til-analog konverter, vil du også være bedre stillet med en digital sensor.

Forbindelse af føleren

Vores 10K thermistor har ledninger der kan stoppes direkte i et breadboard. Du kan selvfølgelig også lodde dem og klippe dem af i en længde der passer dig. Da det er en modstand, skal du være opmærksom på, at den samlede modstand (der er også modstand i ledningen) ændrer sig når du klipper af ledningen. Denne 10K ohms thermistor har dog så høj en modstand i selve føleren, at den samlede modstand ikke vil ændre sig meget.

For at måle temperaturen skal vi måle modstanden. En microcontroller kan dog ikke måle modstanden direkte, så vi er nød til at sende en spænding gennem modstanden, og måle hvilken spænding vi får retur. Det gør vi ved at forbinde føleren med en fikset modstand, og måle spændingen i midten. Når modstanden ændres, ændres spændingen også.

Hvis den faste modstand er 10K, og vi kalder den variable modstand R, vil udgangsspændingen (Vo) være:

Vo = R / (R + 10K) * Vcc

VCC er forsyningsspændingen (eksempelvis 5V eller 3.3V).

Nu forbinder vi det til en microcontroller. Husk at du får et nummer når du måler en spænding på Arduino'en.

ADC værdi = Vi * 1023 / Vcc

Nu kombinerer vi de to (Vo = Vi) og får:

ADC værdi = R / (R + 10K) * Vcc * 1023 / Vcc

Nu går Vcc lige op, så den fjerner vi fra ligningen:

ADC værdi = R / (R + 10K) * 1023

Det gør ingen forskel hvilken spænding du arbejder under. Smart!

Vi har brug for R (den ukendte modstand), så vi laver lidt mere matematik, og får:

R = 10K / (1023/ADC - 1)

Fobind den ene ende af 10K modstanden til 5V, den anden ende til den ene ledning på termistoren, og den anden ende af termistoren til minus/gnd. Forbind nu Analog 0 til centeret mellem de to modstande.

Kør denne sketch på Arduino boardet:

// the value of the 'other' resistor
#define SERIESRESISTOR 10000
// What pin to connect the sensor to
#define THERMISTORPIN A0
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
float reading;
reading = analogRead(THERMISTORPIN);
Serial.print("Analog reading ");
Serial.println(reading);
// convert the value to resistance
reading = (1023 / reading)  - 1;
reading = SERIESRESISTOR / reading;
Serial.print("Thermistor resistance ");
Serial.println(reading); delay(1000);
}

Du skulle meget gerne modtage den målte modstand i konsollen.

Konverter til temperatur

Den målte modstand skal vi nu have lavet om til en temperatur. Hvis du bare skal bruge temperaturen til at gøre noget bestemt ved en fikset temperatur, kan du bare bruge modstands værdien.
Du vil sandsynligvis have den aktuelle temperatur, og til det skal vi bruge Steinhart-Hart ligningen, som giver os en god indikation når vi skal konvertere modstandsværdien til en temperatur. Den er ikke så præcis som hvis vi bruger en termistor tabel, men rimelig god i det spektre som vores NTC føler måler i. Ligningen er dog ret kompleks, og kræver vi kender en masse variabler vi ikke har for denne føler, så vi bruger en forenklet ligning.
For denne ligning skal vi bare vide To (rum temperaturen, 25ºC = 298.15K) B (i dette tilfælde 3950, termistorens coefficient), og Ro (modstanden ved rumtemperatur, i dette tilfælde 10Kohm). Vi indsætter R (den målte modstand), og får T ud (temperatur i Kelvin) som er nem at konvertere til ºC.

Denne sketch vil beregne temperaturen i ºC for dig

 

// which analog pin to connect
#define THERMISTORPIN A0
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25
// how many samples to take and average, more takes longer
// but is more 'smooth' #define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000 int samples[NUMSAMPLES];
void setup(void) { Serial.begin(9600);
analogReference(EXTERNAL);
}
void loop(void) {
uint8_t i;
float average;
// take N samples in a row, with a slight delay
for (i=0; i< NUMSAMPLES; i++) {
samples[i] = analogRead(THERMISTORPIN);
delay(10);
}
// average all the samples out average = 0;
for (i=0; i< NUMSAMPLES; i++) {
average += samples[i];
}
average /= NUMSAMPLES;
Serial.print("Average analog reading ");
Serial.println(average);
// convert the value to resistance average = 1023 / average - 1;
average = SERIESRESISTOR / average;
Serial.print("Thermistor resistance ");
Serial.println(average);
float steinhart;
steinhart = average / THERMISTORNOMINAL;
// (R/Ro)
steinhart = log(steinhart);
// ln(R/Ro)
steinhart /= BCOEFFICIENT;
// 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15);
// + (1/To)
steinhart = 1.0 / steinhart;
// Invert
steinhart -= 273.15;
// convert to C Serial.print("Temperature ");
Serial.print(steinhart);
Serial.println(" *C");
delay(1000);
}
For en mere præcis måling, anbefaler vi du måler den præcise modstand. For en "10K NTC modstand" skal værdien gerne være næsten præcis 10K, men hvis du kan måle modstanden mere præcist vil det give mere præcise målinger.

Hvor præcis er målingen?

You may notice that above, the temperature reading is 28.16°C - does that mean we have 0.01°C precision? Unfortunately no! The thermistor has error and the analog reading circuitry has error.

We can approximate the expected error by first taking into account the thermistor resistance error. The thermistor is correct to 1%, which means that at 25°C it can read 10,100 to 9900 ohms. At around 25°C a difference of 450 ohms represents 1°C so 1% error means about +-0.25°C (you may be able to calibrate this away by determining the resistance of the thermistor in a 0°C ice bath and removing any offset). You can also spring for a 0.1% thermistor which will reduce the possible resistance error down to +-0.03°C

Then there is the error of the ADC, for every bit that it is wrong the resistance (around 25°C) can be off by about 50 ohms. This isn't too bad, and is a smaller error than the thermistor error itself +-(0.1°C) but there is no way to calibrate it 'away' - a higher precision ADC (12-16 bits instead of 10) will give you more precise readings

In general, we think thermistors are higher precision than thermocouples, or most low cost digital sensors, but you will not get better than +-0.1°C accuracy on an Arduino with a 1% thermistor and we would suggest assuming no better than +-0.5°C.