FUNDAMENTOS DE ELECTRICIDAD Y MAGNETISMO Proyecto final Sensor de temperatura Diego Andres Camacho Torres 201249 Hector Dario Diaz Ortiz 245001 Edna Rocio Forero Delgado 153597 Olga Rosa Lozano Lozada 201128 Ian Potdevin Afanador 153661 Javier Rivera Acosta 274144 Cesar Duvan Torres Hernandez 201072 Profesor Jaime Villalobos Ph.D Universidad Nacional de Colombia Sede Bogotà 2012 - I SENSOR DE TEMPERATURA 1. MARCO TEÓRICO Un termistor es un sensor resistivo de temperatura. Su funcionamiento se basa en la variación de la resistividad que presenta un semiconductor con la temperatura. El término termistor proviene de Thermally Sensitive Resistor. Existen dos tipos de termistor: NTC (Negative Temperature Coefficient) – coeficiente de temperatura negativo PTC (Positive Temperature Coefficient) – coeficiente de temperatura positivo Son elementos PTC los que la resistencia aumenta cuando aumenta la temperatura, y elementos NTC los que la resistencia disminuye cuando aumenta la temperatura. Su funcionamiento se basa en la variación de la resistencia de un semiconductor con la temperatura, debido a la variación de la concentración de portadores. Para los termistores NTC, al aumentar la temperatura, aumentará también la concentración de portadores, por lo que la resistencia será menor, de ahí que el coeficiente sea negativo. Para los termistores PTC, en el caso de un semiconductor con un dopado muy intenso, éste adquirirá propiedades metálicas, tomando un coeficiente positivo en un margen de temperatura limitado. Usualmente, los termistores se fabrican a partir de óxidos semiconductores, tales como el óxido férrico, el óxido de níquel, o el óxido de cobalto. Sin embargo, a diferencia de los sensores RTD, la variación de la resistencia con la temperatura es no lineal. Para un termistor NTC, la característica es hiperbólica. Para pequeños incrementos de temperatura, se darán grandes incrementos de resistencia. Por ejemplo, el siguiente modelo caracteriza la relación entre la temperatura y la resistencia mediante dos parámetros: con donde: es la resistencia del termistor NTC a la temperatura T (K) es la resistencia del termistor NTC a la temperatura de referencia (K) B es la temperatura característica del material, entre 2000 K y 5000 K. Por analogía a los sensores RTD, podría definirse un coeficiente de temperatura equivalente , que para el modelo de dos parámetros quedaría: Puede observarse como el valor de este coeficiente varía con la temperatura. Por ejemplo, para un termistor NTC con B = 4000 K y T = 25 °C, se tendrá un coeficiente equivalente = -0.045 , que será diez veces superior a la sensibilidad de un sensor Pt100 con = 0.00385 . El error de este modelo en el margen de 0 a 50 °C es del orden de ±0.5 °C. Existen modelos más sofisticados con más parámetros que dan un error de aproximación aún menor. En la siguiente figura se muestra la relación tensión – corriente de un termistor NTC, en la que aparecen los efectos del autocalentamiento. A partir del punto A, los efectos del autocalentamiento se hacen más evidentes. Un aumento de la corriente implicará una mayor potencia disipada en el termistor, aumentando la temperatura de éste y disminuyendo su resistencia, dejando de aumentar la tensión que cae en el termistor. A partir del punto B, la pendiente pasa a ser negativa. Características Las termorresistencias más comunes se fabrican de alambres finos soportados por un material aislante y encapsulado. El elemento encapsulado se inserta dentro de una vaina o tubo metálico cerrado en un extremo que se llena con un polvo aislante y se sella con cemento para impedir que absorba humedad. Diagrama esquemático de una resistencia termométrica, o resistencia detectora de temperatura (RTD). 2. MATERIALES 1 x Arduino Uno 1 x Protoboard 1 x NTC 10KΩ 1 x Potenciómetro 10kΩ 5 x Diodos LED 5 x Resistencias 220Ω 1 x Resistencia 1KΩ El sensor utilizado es una resistencia NTC de 10 KΩ. Marca General Electric. P.N. RL0503-5820-97-MS Resistencia a 25°C= 10.000 Ω Beta= 3900 de 0°C a 50°C. Estos datos fueron tomados del Datasheet ofrecido por el fabricante (Ver Anexo). 3. DISEÑO DEL HARDWARE El circuito se estructura en tres partes: Entrada de temperatura ambiente. Entrada de ajuste mínimo de temperatura. Salidas. Entrada de temperatura ambiente. La manera de conectar la NTC a nuestro circuito va a ser formando un divisor de tensión con su salida a una entrada analógica, en el que nuestra NTC será la resistencia inferior, En cuanto a la otra resistencia que formará el divisor de tensión, utilizaremos una de 1KΩ, esto es así para aprovechar el rango de muestreo que nos proporciona Arduino con un consumo de corriente limitado. Veremos que si la resistencia máxima de nuestra NTC va a ser 10KΩ, y la fija de 1KΩ, tendremos una variación de tensión entre 0v y 4,55v. Entrada de ajuste mínimo de temperatura. Para tener un mando sobre el que ajustar la temperatura mínima, simplemente colocaremos un potenciómetro dispuesto como divisor de tensión, a una de las entradas analógicas y utilizaremos su muestreo para mapearlo a nuestro antojo como veremos en la sección de programación. Salidas. Para las salidas utilizaremos la ya conocida configuración de LED más resistencia. De manera que el esquema eléctrico global nos quedaría así: 4. PROGRAMACIÓN: /* SENSOR DE TEMPERATURA NTC */ //Añadimos la librería math.h #include <math.h> //Pines para los LED int pinLed1 = 8; int pinLed2 = 9; int pinLed3 = 10; int pinLed4 = 11; int pinLed5 = 12; int i=0; //Pines para las entradas analógicas int analogPin1 = 0; int analogPin2 = 1; //Escala de Avisos int escala = 2; //Variable para la temperatura de disparo double tempMin = 0.0; //Datos para las ecuaciones float Vin = 5.0; // [V] Tensión alimentación del divisor float Rfija = 1000; // [ohm] Resistencia fija del divisor float R25 = 10000; // [ohm] Valor de NTC a 25ºC float Beta = 3900.0; // [K] Parámetro Beta de NTC float T0 = 298.15; // [K] Temperatura de referencia en Kelvin float Vout = 0.0; // [V] Variable para almacenar Vout float Rntc = 0.0; // [ohm] Variable para NTC en ohmnios float TempK = 0.0; // [K] Temperatura salida en Kelvin float TempC = 0.0; // [ºC] Temperatura salida en Celsius void setup() { //Comenzamos la comunicación puerto serie Serial.begin(9600); void config_Stamplot(); //Declaramos pines de salida pinMode(pinLed1, OUTPUT); pinMode(pinLed2, OUTPUT); pinMode(pinLed3, OUTPUT); pinMode(pinLed4, OUTPUT); pinMode(pinLed5, OUTPUT); //Y los pines de entrada pinMode(analogPin1, INPUT); pinMode(analogPin2, INPUT); } void config_StampPlot() { //CONFIGURACION STAMP PLOT LITE // Stamp Plot Software // http://www.parallax.com/ProductInfo/Microcontrollers/BASICStampSoftware/StampPlotSoftware/tabid/481/Default.aspx //---------------------------------------------------------//Titulo de la ventana (FORM) Serial.print("!TITL proyecto !"); Serial.write(13); //Titulo de usuario (STATUS) Serial.print("!USRS Sensor de temperatura"); Serial.write(13); //Valor maximo del eje Y Serial.print("!AMAX 50"); Serial.write(13); //Valor minimo del eje Y Serial.print("!AMIN 0"); Serial.write(13); //Valor maximo de tiempo Serial.print("!TMAX 100"); Serial.write(13); //Configuro el numero de puntos Serial.print("!PNTS 500"); Serial.write(13); //Añadir Tiempo en la lista de mensajes Serial.print("!TSMP ON"); Serial.write(13); //Plot ON Serial.print("!PLOT ON"); Serial.write(13); //Borra el valor Max y Min almacenado despues del RESET Serial.print("!CLMM"); Serial.write(13); //Limpio la lista de mensajes Serial.print("!CLRM"); Serial.write(13); //Borro el fichero stampdat.txt Serial.print("!DELD"); Serial.write(13); //Borro el fichero stampmsg.txt Serial.print("!DELM"); Serial.write(13); //Salvar datos Analogicos y digitales en proyecto.txt Serial.print("!SAVD ON"); Serial.write(13); //Salvar Mensajes en proyecto.txt Serial.print("proyecto.txt"); Serial.write(13); //RESET DEL GRAFICO PARA COMENZAR A PLOTEAR Serial.print("!RSET"); Serial.write(13); //---------------------------------------------------------} void loop() { i=i+1; //Primero leemos el pootenciómetro tempMin = analogRead(analogPin2); //Lo mapeamos a valores de O a 40 grados) tempMin = map (tempMin, 0, 1023, 0, 400000); //Y lo dividimos entre 10000 para darle 4 decimales tempMin = tempMin/10000; //Y lanzamos el ajuste establecido via serie Serial.println("-----------------------------------------------"); Serial.println(); Serial.print("AJUSTE DE TEMPERATURA MINIMA A "); Serial.print(tempMin,4); Serial.print(" GRADOS CELSIUS"); Serial.println(); Serial.println("-----------------------------------------------"); //Y ahora calculamos la Temperatura //Primero la Vout del divisor Vout=(Vin/1024)*(analogRead(analogPin1)); //Ahora la resistencia de la NTC Rntc=(Vout*Rfija)/(Vin-Vout); //Y por último la temperatura en Kelvin TempK = Beta/(log(Rntc/R25)+(Beta/T0)); //Y ahora la pasamos a celsius TempC = TempK-273.1500; Serial.print(TempC); Serial.write(13); //Envio de cualquier cadena a mostrar Serial.print("toma numero: "); Serial.print(i); Serial.write(13); //Y lo mostramos por puerto serie Serial.println(); Serial.print("LA TEMPERATURA DE LA NTC ES DE "); Serial.print(TempC,4); Serial.print(" GRADOS CELSIUS"); Serial.println(); //Ahora las comparaciones para las salidas if(TempC < tempMin) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, LOW); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if (((TempC <= (tempMin + escala)) & (TempC > tempMin))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if (((TempC<=(tempMin+(escala*2)))&(TempC>tempMin+escala))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if ((TempC<=(tempMin+(escala*3)))&(TempC>tempMin+(escala*2))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, LOW); } else if (TempC > (tempMin + (escala*4))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, HIGH); } //Un pequeño delay para no volver loco al puerto serie delay(1000); } CÁLCULO DE TEMPERATURA A PARTIR DE LA MEDIDA ANALÓGICA. Teniendo en cuenta que el fabricante nos da el valor resistivo para una temperatura en concreto (en nuestro caso 10000Ω para 25º) y la Beta (3900 entre 0°C y 50°C) podemos utilizar la ecuación que relaciona la resistencia de la NTC y la temperatura para calcular esta última, primero veamos la ecuación: Siendo: Rt = Resistencia a temperatura T en grados Kelvin (k = ºC + 273,15) Ro = Resistencia de referencia a una temperatura To en Kelvin. B = Valor Beta de nuestra NTC. To = Temperatura de referencia en Kelvin. T = Temperatura a medir. Observamos que, si calculamos Rt, tendremos todos los datos para hallar la temperatura en un valor de resistencia determinado despejando T, veamos la ecuación despejada que utilizaremos en nuestro programa: Bien, ya tenemos la ecuación para hallar la temperatura, pero nos faltaría saber cual es la resistencia de la NTC, para esto primero calcularemos cual es la tensión de entrada de nuestra entrada analógica, es decir, la Vout de nuestro divisor de tensión: Con esto hallamos cuanto vale cada bit de la conversión analógico-digital y lo multiplicamos por la cantidad de bit que nos lee la entrada analógica, con lo que tenemos la tensión que le está llegando a la entrada analógica. Una vez tenemos esto, si recordamos la fórmula del divisor de tensión: Vemos que tenemos todos los datos a excepción de Rinferior, que es justo la resistencia de la NTC que necesitamos para calcular la temperatura, por lo que despejando nos queda: 5. BIBLIOGRAFÍA http://mx.mouser.com/ProductDetail/GE-Sensing/RL0503-5820-97MS/?qs=Vo7DmvLbx%2f%2firrHChPQeLw%3d%3d RL0503-5820-97-MS http://www.thermometrics.com/assets/images/ms.pdf NTC THERMISTORS: TYPE MS http://www.thermometrics.com/assets/images/d9_7a.pdf MATERIAL TYPE: D9.7A http://www.arduteka.com/ Arduino Uno