viernes, 15 de julio de 2016

Sensor de temperatura - Termistor - PSoC5LP

¿Qué es?

Algunas veces para alguna aplicación o proyecto se hace necesario saber la temperatura de algo, desde la de tu cuarto para una aplicación de domótica hasta la temperatura de un liquido para poder hacerle algún tipo de control. Hay muchos sensores que permiten poder conocer la temperatura, los más conocidos son los LM35, termistor, termocupla y los RTD. Aprovechando una de las características de PSoC hoy es el turno del termistor!.


Termistor

Los Termistores, en pocas palabras, son resistores térmicamente sensibles, el cual basa su funcionamiento en la variación de su resistencia debido a cambios de temperatura. De estos existen dos tipos:

NTC (Negative Temperature Coefficient) (Coeficiente de Temperatura Negativo) : a medida que la temperatura aumenta la resistencia disminuye


PTC (Positive Temperature Coefficient) (Coeficiente de Temperatura Positivo)  También llamados Positor: A medida que la temperatura aumenta la resistencia aumenta.

En el mercado los más conocidos y vendidos son los tipo NTC que es el que vamos a utilizar hoy.
La curva característica de temperatura vs resistencia de los termistores no es lineal, por lo cual se tienen que tener en cuenta una serie de ecuaciones que se tendrán que utilizar, pero es aquí donde PSoC brilla al tener un bloque especial para los termistores el cual nos ayuda mucho evitando los cálculos y a través del API nos entrega los valores de resistencia y temperatura de nuestro termistor.

Hay que tener en cuenta que al momento de conseguir el termistor se debe buscar uno de calidad media – alta y verificar también que se encuentre la correspondiente hoja de datos por que de ahí vamos a necesitar dos datos fundamentales que son:  La constante Beta (B) que corresponde a una relación entre dos temperaturas, por ejemplo, 30/50=3890 y la resistencia a 25 grados; con estos dos datos se puede utilizar para identificar la curva de nuestro termistor y así poder hacer funcionar nuestro proyecto.


Materiales

  • Protoboard
  • CY8CKIT-059 PSoC5 Prototyping Kit
  • Modulo KY-013 (Sensor de temperatura basado en termistor)
  • LCD 20x4
  • Cables de protoboard

Hardware

Lo que primero debemos conocer es que la manera correcta de leer un termistor es con un divisor de voltaje con otra resistencia conocida y con un valor de tolerancia de 1% o menos.
El modulo KY-013 ya tiene implementado este divisor de voltaje con una resistencia de 10K por lo cual no voy a necesitar poner otra resistencia en la protoboard, pero es importante tener en cuenta que si ustedes consiguen un termistor diferente, sepan que este lo deben conectar en serie a una resistencia (yo recomiendo resistencia de 10K al 1%) como lo muestra el siguiente diagrama:



Como vemos el divisor de voltaje lo vamos a alimentar con 1 volt que vamos a obtener del PSoC y por el otro lado lo vamos a conectar a tierra, de esta manera tendremos 3 terminales que llamaremos VHig, Vtermistor, Vlow. Estos tres terminales tienen que ir conectados al PSoC tal cual muestra la imagen.
Recordar que el pin VLow tiene que tener un puente a tierra!!.

Por otro lado tenemos que conectar la LCD, es bastante sencillo y se ha hecho muchas veces, sin embargo, aquí les dejo un diagrama de conexiones con el PSoC:



Estas son todas la conexiones que hay que realizar, tener especial cuidado en la parte del termistor.




Software

Lo principal en el diagrama esquemático del PSoC es saber que se van a leer los voltajes tanto del termistor como el de la resistencia de referencia de manera diferencial, al ser dos canales diferentes de voltaje tenemos que utilizar un multiplexor análogo de dos canales en modo diferencial: 





Se va a utilizar un voltaje de referencia a 1 voltio junto con un operacional configurado en modo seguidor para alimentar el divisor de voltaje.
Tendremos que usar entonces un ADC (Analog to digital converter) para poder leer los dos voltajes, el cambio de canales lo vamos a hacer a través de código , por ahora solo tendremos que configurar el ADC de la siguiente manera: 


De esta ventana de configuración lo más importante es resaltar que el modo de entrada del ADC es diferencial. El resto se deja por defecto.


Los cambios que se hicieron aquí y tener cuidado es que el modo de conversión es 2 – Continuos, los valores los vamos a ir obteniendo desde el código. La resolución en bits será 16 que para este caso será más que suficiente.
El rango de entrada para este modo diferencial será de +/- 1.024V, al utilizar el voltaje de referencia en 1V nos aseguramos de que el voltaje no sobrepase los de la configuración del PSoC.
El resto de configuraciones del ADC las podemos dejar por defecto.

El siguiente componente y el más importante que es en donde nos vamos a centrar es el componente Termistor: 



Como se los decía al principio PSoC incorpora un calculador de temperatura basándose en la resistencia para los termistores. Primero se debe configurar los parámetros en el esquemático:



El parámetro Reference resistor hace referencia a la resistencia que tienen de referencia y aquí se debe poner el valor en ohms, para este caso esa resistencia es de 10000ohms (10K).

El modo de implementation será por medio de ecuación, este bloque con darle estos simple parámetros hace todos los cálculos correspondientes a la ecuación que define el comportamiento de los termistores para así darnos los valores de resistencia y temperatura.

También hay que indicarle otros tres parámetros.

Es aquí donde toma importancia la calidad del termistor y la cantidad de información que se consigue sobre el, si el termistor es de buena calidad, la hoja de datos tendrá una tabla correspondiente a los valores de temperatura vs resistencia, de esta tabla vamos a obtener los tres valores por defecto, resistencia en ohm a 100°C de temperatura, resistencia en ohm a 0°C de temperatura y la ultima es la resistencia en ohm a temperatura ambiente que por lo general son 25°C. Una vez tenemos estos tres valores los pondremos en los respectivos campos indicando temperatura y resistencia.

Si les pasa como a mi que compraron el termistor y no encontraron ninguna hoja de datos y tampoco información sobre los valores de temperatura vs resistencia, tendremos que obtener estos valores nosotros mismos, las pruebas que lleve a cabo fueron las siguientes:

Para 100° : Me ayude un poco del agua, sabiendo que su punto de ebullición son los 100° solamente la calenté hasta que empezó a hervir y en ese momento sumergí la cabeza del termistor teniendo cuidado de no sumergir los terminales y en ese punto tome la resistencia con un multímetro el cual me arrojo que a 100° su resistencia es 1083 ohm .

Para 0° : utilice también agua, esta vez puse agua en el congelador estando pendiente al punto en donde empiezan a aparecer cristales en el agua lo que significa que se esta empezando a congelar, este es mi punto de 0 grados, sumergí un poco la cabeza del termistor teniendo cuidado de no sumergir los terminales y tome mi medición obteniendo como resultado que para 0° la resistencia es 13250 ohm.

La ultima temperatura que es la de 25° que es temperatura ambiente se obtiene sabiendo un poco de que manera funcionan los termistores.

Existen, comercialmente, termistores de muchos valores nominales, pero los más comunes son los que a 25° tienen 10Komh de resistencia y los que a 25° tienen 4.7Kohm de resistencia, hay que hallar la manera de lograr obtener 25° o valores cercanos y verificar la resistencia, si esta se acerca a alguno de los dos valores dichos anteriormente puede estar seguro de que ese es el valor correspondiente a temperatura ambiente (25°).  Mi termistor es de 4.7Kohm a 25°.

Lo más recomendable para estos casos es conseguir un termistor que en su hoja de datos diga estas temperaturas, con eso obtenemos mayor precisión en las medidas y evitamos los errores que podamos tener debido a estas pruebas hechas.


Existen dos líneas de código para hacer el trabajo de obtener la temperatura del termistor con este bloque:

Thermistor_GetResistance(vRef,vTherm); - Esta línea permite obtener el valor de la resistencia del termistor, los parámetros que recibe son los voltajes correspondientes a la resistencia de referencia y al termistor, hay que tener en cuenta en que canal se ubica cada uno para tener la certeza de estar dando los valores que son.


Thermistor_GetTemperature(Termresis); - Esta línea nos permite obtener el valor de temperatura una vez conocemos la resistencia, el parámetro que recibe es el valor de resistencia del termistor que obtuvimos anteriormente.

Estas dos líneas son las que tenemos que implementar más adelante para poder leer de manera correcta el termistor.


Por ultimo tendremos que añadir el bloque de LCD para poder visualizar los valores de resistencia y temperatura.




Cabe recordar que este es un bloque custom y que no viene incluido en PSoC creator, este debe ser incluido manualmente y se los dejare junto a los archivos del proyecto.

La implementación del código es la siguiente, todo comentado para entender bien



Por ultimo antes de compilar el proyecto tenemos que hacer una serie de modificaciones en el compilador para que funcione de manera correcta el bloque termistor y la función sprintf:


Vamos a clic derecho en el nombre del proyecto y luego build settings



Y en esta ventana tendremos que irnos al apartado linker y en la parte de additional libraries poner la letra m , esto para el fin de añadir la librería matemática necesaria para el funcionamiento del bloque termistor



Seguido vamos a linker y luego command line y allí ponemos la instrucción -u_printf_float, necesaria para imprimir los valores mediante sprintf.

Por ultimo vamos a la ventana de configuración de pines en la pestaña system y allí ubicamos el parámetro Heap Size que debemos cambiar a 0x200


Necesario también para el funcionamiento del sprintf.

Por ultimo lo que queda por hacer es asignar pines, compilar y programar.

Resultado final 

El comportamiento del termistor es estable en las mediciones, también es bastante sensible a cambios de temperatura, los valores son bastante coherentes.


Podemos comparar las mediciones dadas por el termistor con un termómetro de pared



Podemos apreciar un desfase de almenos 4 grados y esto puede tener varias razones, la primera es que debido a que no se encontró ninguna información acerca del termistor tuvimos que hacer las pruebas nosotros y pudimos haber introducido un error de medición de temperatura de las pruebas, también puede que el termómetro que estamos usando como patrón no este bien calibrado.

De cualquier manera los resultados son satisfactorios por que podemos obtener un valor confiable de la temperatura y la podemos usar en este instante para tener en tiempo real la temperatura de nuestro cuarto!.


Por ultimo como no puede faltar, su respectivo video tutorial:



6 comentarios:

  1. Excelente
    Mira una pregunta si tengo una PT100 tengo q hacer muchos cambios o como es resistencias seria igual.
    y lo voy hacer en psoc 4.

    gracias por tu ayuda.

    ResponderEliminar
    Respuestas
    1. Hola Cristian, el sensor PT100 es un RTD, funciona totalmente diferente al termistor, ademas PSoC creator tiene un componente diferente para los RTD, se ubica en el mismo apartado, te recomiendo busques la hoja de datos del componente de PSoC creator para que puedas tener una guía de como funciona. Por otro lado esta guía solo funciona para termistores NTC y por el momento solo lo he probado en un PSoC5LP. Saludo!

      Eliminar
  2. Ok. Gracias.
    Adicional al programa que tienes le puedo agregar que cuando llegue a cierta temperatura me Active un relevo,para apagar una resistencia que me está calentando agua.

    Gracias por tu ayuda.

    ResponderEliminar
  3. buena noche puedo usar un termistor de 2 patas.
    podrias explicar a que entrada lo tienes conectado.
    y tienes un pin a vcc.

    ResponderEliminar
    Respuestas
    1. Hola cristian, claro que puedes usar un termistor de 2 terminales, lo que pasa es que como dice el articulo la manera correcta de leerlo es en un divisor de voltaje con una resistencia de referencia con tolerancia al 0.1%, en el esquematico se ve claramente cual es la conexión que se debe realizar, ademas de que la alimentación la proporciona directamente el microcontrolador y no VCC

      Eliminar
  4. Buenos días Brayan, tengo una duda en cuanto al ADC, tengo que medir 3 sensores de temperatura al tiempo, entre ellos un termistor y una termocupla tipo k, el problema se encuentra en que el ADC de la termocupla, es de 20 bits, y si mido con 20 bits en el termistor, ya no lee bien, que me recomiendas, hago dos configuraciones en el ADC, o saco otro ADC...
    Espero puedas ayudarme y muchas gracias por el video, me ayudo bastante.

    ResponderEliminar