El circuito integrado MAX6675 de Maxim/Dallas Semiconductor es un convertidor analógico a digital para termopares tipo K. Bueno, la verdad es que este circuito tras su apariencia inocente con un encapsulado SOIC de 8 pines, esconde mucho más que un ADC y nos ahorrará bastante espacio al momento de diseñar un circuito impreso.

MAX6675 junto a otros componentes

MAX6675 junto a otros componentes

Dentro de este pequeño circuito se encuentra la electrónica necesaria para amplificar, compensar y convertir a digital el voltaje generado por el termopar, lo que hace muy sencilla la tarea de conectar un termopar a un microcontrolador. El único “pero” es que este circuito solo se consigue en encapsulado SOIC, por lo que no es tan fácil usarlo en el protoboard y hará falta adquirir o fabricar un adaptador para poder experimentar.

Existen muchos sensores de temperatura en el mercado, sin embargo las soluciones basadas en silicio, como el LM35 por citar un ejemplo que sea familiar, están normalmente limitados a un rango  de temperatura por debajo de los 150 grados centígrados. Lo que los deja fuera de consideración cuando debemos monitorear algún proceso con temperaturas superiores, afortunadamente los termopares vienen a salvar el día, permitiéndonos  mediciones en un rango más amplio, usualmente  de varias centenas de grados centígrados y sin un costo excesivo.

Características del MAX6675.

Hay algunas características importantes que se deben tomar en cuenta antes de usar este circuito, a continuación las más importantes:

  • Interfaz compatible con SPI solo de lectura.
  • Resolución de 12 bits, 0.25 grados centígrados.
  • Medición hasta 1024 grados centígrados.
  • Alimentación de 3.3 a 5 volts.
  • Frecuencia de reloj SPI máxima Fscl 4.3 Mhz.
  • Tiempo de conversión 0.17 s máximo 0.22 segundos.
  • Consumo máximo de 1.5 mA.

Existen más, pero creo que aquí esta lo más importante, para más detalles habrá que consultar la hoja de datos que proporciona el fabricante.

Estructura del MAX6675, tomado de la hoja de datos

Estructura del MAX6675, tomado de la hoja de datos

Formato de Salida.

El MAX6675 se conecta con un microcontrolador mediante una interfaz de 3 lineas compatible con el estándar SPI. El formato en el que el MAX6675 envía datos al microcontrolador es el siguiente.

max6675_spi

Como se puede observar, además de la palabra digital correspondiente a la temperatura tenemos un bit que nos indica si el termopar esta abierto (desconectado o roto, por ejemplo) que podemos usar para tomar acciones correctivas o informativas en el software, como disparar una alarma o mostrar un aviso. También hay una buena cantidad de bits que no tienen significado.

Software de ejemplo.

Para este ejemplo estaré usando un microcontrolador PIC24, ya que he venido trabajando los últimos meses con estos microcontroladores. Usaremos el módulo SPI con interrupciones del microcontrolador para comunicarnos con el MAX6675. El software que escribí, usa colas (queues) de FreeRTOS para gestionar la entrada de datos por el módulo SPI al que esta conectado el MAX6675 (I/O de datos por interrupcion), sin embargo las funciones de colas e incluso las funciones asociadas a la interrupción pueden descartarse y simplemente usar la técnica de bit polling para esperar hasta que el módulo SPI termine la transferencia, por lo tanto puede usarse este código como base para usar el MAX6675 con cualquier otro microcontrolador sin importar nuestras preferencias o requisitos de programación.

El modulo SPI queda configurado para funcionar como lo especifica la hoja de datos del MAX6675

Inicializar módulo SPI: Afortunadamente el MAX6675 no requiere de ninguna inicialización, por lo tanto lo único que hace esta función es cargar los valores iniciales en los registros del módulo SPI del PIC y también se lleva a cabo la inicialización de la cola de FreeRTOS con la que se comunicará el MAX con la aplicación. Esta cola actúa mas bien como un semáforo, por que solo tiene capacidad para almacenar un elemento. Cuando la ISR del módulo SPI recoge el valor leído y lo coloca en la cola, la tarea (task) que estaba esperando el dato puede continuar con su ejecución.

Leyendo el resultado: Si observamos el formato de salida del MAX6675 veremos que los datos transmitidos tienen una buena cantidad de bits de relleno o sin significado, por lo que hay que eliminarlos antes de que el resultado pueda usarse para convertirse a grados centígrados. La función en C que escribí para leer el termopar retorna un unsigned int que corresponde al valor leído desde el MAX6675, NO a la temperatura en grados centígrados.  Existe otra función para leer el termopar que además hacer lo mismo que la siguiente función también puede reportarnos si el termopar esta abierto (ver los archivos de codigo fuente).

Rutina de interrupción: En la rutina de interrupción del modulo SPI se realiza la lectura del registro correspondiente al buffer de recepción y se envía la palabra leída a través de la cola para que sea procesada por el código de la aplicación.

Como se puede ver realizar la medición de temperatura es bastante fácil, ni siquiera hay que preocuparse demasiado de los detalles de la conversión A/D. Lo único que se debe tomar en cuenta es que al MAX6675 le toma alrededor de 220 milisegundos como máximo completar una conversión, por lo que como máximo debemos leer el valor de la temperatura unas 4 o 5 veces por segundo. Esto será más que suficiente para la mayoría de las aplicaciones. Hay que recordar que al llamar a la función iThermocoupleIsOpen() equivale a leer la temperatura y por lo tanto además del bit de termopar abierto, vamos a leer la ultima conversión de temperatura que realizo el integrado con su reloj interno. Voy a citar la hoja de datos del integrado:

Force CS low and apply a clock signal at SCK to read the results at SO. Forcing CS low immediately stops any conversion process. Initiate a new conversion process by forcing CS high.

Por lo tanto, si llamamos a la función iThermocoupleIsOpen() e inmediatamente después llamamos a iThermocoupleRead() cualquier proceso de conversión que el MAX pudiera estar realizando entre las llamadas a dichas funciones se detendrá y las dos funciones leerán el mismo valor de temperatura, que es el correspondiente a la última conversión que se pudo completar (aunque la función iThermocoupleIsOpen no toma en cuenta el valor de temperatura, aún así tiene que leerlo). En resumen… hay que respetar el ciclo de CS para el MAX6675 y permitirle 220 milisegundos entre lecturas, de lo contrario hay que estar consientes de lo que esperamos leer:

Como se puede ver en mi función de diagnostico, se llama a las dos funciones iThermocoupleIsOpen() y iThermocoupleRead() sin ningún retardo entre ellas, por lo tanto, el valor del campo temperature reading será el mismo en ambas lecturas, sin embargo, verán que respeto el tiempo mínimo de conversión cuando espero valores válidos, manteniendo la linea CS en alto por mas de 220 mS (de hecho tiene un retardo de 500 mS). Podría hacerse en definitiva de muchas otras formas, pero esta es la que implemente yo.

Otras consideraciones.

Hay que recordar que el termopar opera con voltajes muy bajos que son amplificados. He notado que las mediciones son bastante sensibles a la interferencia de otros aparatos, por ejemplo, sucede que al acercar el cable de una fuente de poder conmutada de una laptop (que es de dudosa calidad y al parecer mal filtrada) la medición que realiza el MAX6675 muestra valores irreales y me causo un poco de problemas al principio, antes de darme cuenta del problema. En la hoja de datos menciona algunos consejos para mejorar la estabilidad de las mediciones entre las que se encuentran colocar capacitores bypass cerca de los pines de alimentación del MAX6675 y proveer un plano de masa adecuado en el circuito impreso.

Por otra parte quedan pendientes las consideraciones sobre la linealidad del termopar, que requiere más procesamiento de la lectura como la implementación de tablas de búsqueda o solucionar ecuaciones polinomiales de grado superior, consumiendo más recursos del microcontrolador. Afortunadamente el termopar tipo K tiene una respuesta cercana a la lineal y permite una buena aproximación con el programa tal como esta, sin embargo para aplicaciones que requieren mayor precisión o un mayor rango, no podemos saltarnos este paso. Para más información se pueden revisar algunas notas de aplicación de Microchip Technology.

Finalmente agradecer a la gente de Maxim/Dallas Semiconductor por las muestras del MAX6675.

Descarga de los archivos para el termopar.

Aquí tienes los archivos de código fuente en C que contienen todas las funciones necesarias para leer el termopar. Hay que recordar que el ejemplo NO compila directamente ya que depende de FreeRTOS y otros modulos que yo hice. Por otra parte, si ya tienes un proyecto con FreeRTOS deberá ser fácil agregar estos módulos para permitir mediciones de temperatura usando un termopar + PIC24F o dsPIC.

[download id=”6″]