Saltar al contenido

Termopar tipo K con PIC

Hola controleros y controleras en la entrada de el dia de hoy vamos a aprender a leer y programar la temperatura usando una termopar tipo K y el microcontrolador PIC.

Antes que nada te hago la invitación para que veas nuestro Curso de Microcontroldores PIC.

Y que te suscribas al canal de YouTube si deseas seguir aprendiendo sobre programación con microcontroladors.

Termopar tipo K con PIC

Para poder realizar la lectura de temperatura de cualquier proceso utilizando nuestro microcontrolador PIC, utilizaremos un termopar tipo K con el MAX 6675, el cual es representado por la siguiente figura:

Termopar tipo K MAX6675

Como puede ser observado, la termocupla tipo K es conectado al integrado MAX6675 y la información de temperatura se le envia al microcontrolador PIC a través de 3 terminales usando la comunicación SPI.

El Módulo Sensor de Temperatura Max6675 + Termopar Tipo K es un excelente dispositivo capaz de hacer mediciones de temperaturas entre 0 a 800 ° C, bastante usado con diferentes microcontroladores tales como el PIC, Arduino, Raspberry Pi entre otros.

La medición de altas temperaturas es posible debido al blindaje que posee en la punta la termocupla del tipo K, siendo revestida enteramente en acero inoxidable, además de contar con rosca del tipo M8 para fijación en los más diversos lugares, como por ejemplo, hornos.

Como Usar el MAX 6675 con Termopar tipo K

El funcionamiento y circuito recomendado del integrado MAX6675 puede ser encontrado en su datasheet o hoja de datos.

Basicamente al aplicar la comunicación SPI debemos generar las siguientes señales con nuestro microcontrolador PIC.

SPI del MAX6675

Donde la primera linea (CS – Channel Selector) será un PIN del PIC el cual pasará de 1 para 0 para comenzar la comunicación.

Luego se genera un tren de pulsos sincronos con el pin para generar el reloj mostrado en SCK (En el ejemplo visto al final de este post, veremos como generar ese tren de pulsos)

Por ultimo deben almacenarse los 16 bits o 2 bytes que son enviados del MAX6675 al sistema microcontrolado (PIC, ARDUINO, ETC)

Esos 16 bits son representados por la siguiente tabla

max6675 + termopar tipo k

Como vemos el bit 15 es un bit que no se usa, desde el bit 14 hasta el bit 3 están los datos de temperatura que en total suman 12 bits, donde los 10 primeros bits son el valor entero de la temperatura, y los 2 ultimos bits son los decimales de la temperatura. El bit numero 2 indica si la termocupla tipo K esta conectada o no, el bit 1 es el id del dispositivo y el bit 0 son los estados.

Como Calibrar el MAX6675

Para poder calibrar el MAX6675 con el termopar tipo K usando cualquier microcontrolador (PIC, ARDUINO, ETC), puede usarse una regresión lineal para programarla en el microcontrolador.

Para poder hacer esa regresión lineal, vamos a necesitar tener un sensor de temperatura patrón, el cual nos indicará el valor real de temperatura, para eso tomaremos los datos del patrón comparado con los datos leidos del termopar tipo K y colocaremos estos dos datos en dos columnas en un archivo en EXCEL.

Una vez tenemos estos datos, podremos realizar una regresión lineal directamente desde el EXCEL, como fue mostrado en el Video.

Un ejemplo de la tabla en Excel puede ser descargado abajo, donde se muestra el código de implementación de este post..

Termopar tipo K con PIC – Código y Ejemplo

Vamos a realizar la lectura de temperatura usando la termocupla tipo K, realizando el siguiente esquema de conexión.

A continuación te dejo la librería, la tabla en excel y el código de implementación para que los bajes gratuitamente y los puedas implementar en tu computadora, sabes que para tener acceso a esos archivos debes compartir el contenido de este post con cualquiera de los siguientes botones pata que de esa forma ayudes a que más personas aprendan a implementar una termocupla tipo K con microcontrolador PIC y el MAX6675.

  • Para Descargar el Archivo en Excel y calibrar la termocupla tipo K 👉 Click aqui.
  • Descargar el Código Directamente 👉 Click aqui.
  • Para más de una termocupla: 👉 Click aqui. (es solo declarar los pines CS donde irá conectado cada termocupla)

Ejemplo multiples termocuplas:

#define TC_CS           PIN_C1
#define TC_CS2          PIN_C2
do_everything(TC_CS)
do_everything(TC_CS2)

Código del PIC

El siguiente es el código de ejemplo de la termocuplat tipo K implementada en el microcontrolador PIC16F887, que también sirve para un PIC16F877A o otros de la familia 16F

#INCLUDE <16f887.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#define TC_CLK     PIN_C3  
#define TC_CS      PIN_C0
#define TC_DATA    PIN_C4


#include "max6675.c"

void main() 
{ 
   
   char msg[32]; 
   delay_ms(50);      //allow oscillator to stabilise 

   while(1){ 
      delay_ms(1000); 
      //sprintf(msg,"%3.2f%cC\r\n",do_everything(),0xB0); 
      sprintf(msg,"I%3.2fFI%3.2fFI%3.2fF",do_everything(),do_everything(),do_everything()); 
      printf("%s",msg); 
   } 
} 

Familia PIC18F

El siguiente código es para los pics de la familia 18F como por ejemplo el PIC18F4550 para usar la termocupla tipo K.

Básicamente como siempre, es el mismo código del PIC16 con la diferencia de cambiar la librería y colocar la posición de los pines donde se encuentra el SCL, SDA y un tercero que sirva como channel selector, en este caso pines RB1, RB0 y RC0 respectivamente.

Recuerda que si deseas usar algún puerto (A,B,C,D,E) debes colocar las direcciones de memoria (0xF80, 0xF81 , 0xF82 , 0xF83 , 0xF84 )

#INCLUDE <18f4550.h>
#USE DELAY(CLOCK=4000000,crystal)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#define TC_CLK     PIN_B1  
#define TC_CS      PIN_C0
#define TC_DATA    PIN_B0


#include "max6675.c"

void main() 
{ 
   
   char msg[32]; 
   delay_ms(50);      //allow oscillator to stabilise 

   while(1){ 
      delay_ms(1000); 
      //sprintf(msg,"%3.2f%cC\r\n",do_everything(),0xB0); 
      sprintf(msg,"I%3.2fFI%3.2fFI%3.2fF",do_everything(),do_everything(),do_everything()); 
      printf("%s",msg); 
   } 
} 

Librería MAX6675 para PIC usando CCS C Compiler

/************************************************************************************** 
*   max6675.c - communicates with a MAX6675 thermcouple interface chip                * 
*   Copyright Jimbob's Ma 2006                                                        * 
*                                                                                     * 
*   This program is free software; you can redistribute it and/or                     * 
*   modify it under the terms of the GNU General Public License                       * 
*   as published by the Free Software Foundation version 2                            * 
*   of the License.                                                                   * 
*                                                                                     * 
*   This program is distributed in the hope that it will be useful,                   * 
*   but WITHOUT ANY WARRANTY; without even the implied warranty of                    * 
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                     * 
*   GNU General Public License for more details.                                      * 
*                                                                                     * 
*   You should have received a copy of the GNU General Public License                 * 
*   along with this program; if not, write to the Free Software                       * 
*   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.   * 
**************************************************************************************/ 

/* 
This is a diver for the MAX6675 K-type thermocouple interface chip. It implements an SPI 
bus without the need for dedicated hardware (aka a bit-banged interface). The result from 
toFloat_TC() is the temperature in degrees celcius of the thermocouple tip. The rest should 
be self-evident. Have a look at the end of the file for example usage. 
*/ 

#ifndef TC_CLK 
   #define TC_CLK     PIN_C3            //edit these pins as necessary 
#endif 

#ifndef TC_CS 
   #define TC_CS      PIN_C0 
#endif 

#ifndef TC_DATA 
   #define TC_DATA    PIN_C4 
#endif 


int1 thermocouple_error;         //a handy dandy global error flag to tell you if a thermocouple is connected or not 

void init_TC(void) 
{ 
   output_low(TC_CLK); 
   output_low(TC_DATA); 
   output_high(TC_CS);            //if we idle high, the chip keeps doing conversions. Change this if you like 
} 

int16 read_TC(void)               //It takes 200ms (ish) for the MAX6675 to perform a conversion 
{ 
   int8 i; 
   int16 data; 

   output_low(TC_CS);            //stop any conversion processes 
   delay_ms(1);               //and give it some time to power up (not very much, admittedly) 

   for (i=0;i<16;i++){ 
      shift_left(&data,2,input(TC_DATA));      //reads in 2 bytes to data from the pin TC_DATA 
      output_high(TC_CLK); 
      delay_us(1); //Descomentar si usa crystal mayor a 10MHz
      output_low(TC_CLK); 
      delay_us(1);
   } 

   thermocouple_error=bit_test(data,2);      //this is the thermocouple status bit 
   delay_ms(1);     
   output_high(TC_CS); 
   return(data); 
} 

int16 sortout(int16 raw) 
{ 
    return(0x0FFF & (raw>>3));      //returns only the bits converning temperature 
} 

float toFloat_TC(int16 tmp) 
{ 
   return(((float)tmp-44)/2.021142857); 
   //return((float)tmp);
} 

float do_everything(void) 
{ 
   init_TC(); 
   delay_ms(200);               //200ms is a long time to be doing nothing. use a timer interrupt to avoid wasting time here 
   return(toFloat_TC(sortout(read_TC()))); 
}

Eso es todo por el día de hoy mis queridos controleros y controleras, espero les haya servido esta entrada y hayan aprendido algo nuevo.

Recuerda que si deseas apoyar mi trabajo, puedes invitarme a un café y seguirme ayudando a mantener los servidores de este sitio web, es muy barato el café y contribuyes con el tiempo y esfuerzo invertidos en las clases elaboradas en el canal y pagina web: 👉 Invitar a un Café a Sergio ☕️

Espero que esten muy bien y nos vemos en la próxima.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (29)

Me parece muy integrantes tu trabajo, actualmente estoy haciendo un código c con respecto al pic16f887 en el cual tomo diferentes muestras de temperaturas, y lo hago con el sensor DHT11 pero su librería no me permite tener más de uno o al menos yo no se como colocar más de un sensor dth11 tienes alguna idea de como podría hacerse?

Responder

No se puede usar la libreria I2C para el lcd verdad? ya que ambos ocupan los mismos pines, B0 y B1 para un 4550

Responder

Hola Medina, puedes usar otros Pines para implementar la lectura del termopar. Esta librería realiza la lectura del chip via software, es decir no necesitas emplear un hardware dedicado que en este caso sería los pines SPI propios del pic. Por lo tanto puedes usar cualquier otro pin.

Responder

Muchas gracias master, es lo que habia notado pero se me hacía raro que no me cambiara los pines, despues me di cueta testeando, que era la librería la que no me modificaba los pines, la solucion fue pegarla de forma local (en la misma carpeta del proyecto) y cargar esa, así ya se cambiaba sin problemas (antes la cargaba desde la carpeta general de librerias) por si alguien le pasa lo mismo. Salu2

Responder

Hola, Sergio

Amigo, tengo una consulta, estoy trabajando con 3 termocuplas y siguiendo con el ejemplo mencionado con multiples termocuplas:

#define TC_CS PIN_C1
#define TC_CS2 PIN_C2
do_everything(TC_CS)
do_everything(TC_CS2)

No comprendo si esas nuevas líneas del código se aumentan en la librería o en el código final, porque si bien es cierto en la librería sólo se muestra la implementación con «CS» pero no con «CS2» y en el caso de ser 3 termocuplas, no se debería realizar una ejecución distinta para cada «CS» en la librería?

Responder

Las definiciones del CS las colocas en tu código principal, en la librería no necesitas hacer ninguna modificación. En tu caso puedes colocar las 3 definiciones para manejar las 3 termocuplas.

#define TC_CS PIN_C0
#define TC_CS1 PIN_C1
#define TC_CS2 PIN_C2

Responder

Hola Sergio:
Estoy tratando de implementar un control con PIC para un horno co una zonda tipo K y max6675, y se ve que tengo mucho ruido y la temperatura que estoy midiendo fluctua aleatoreamente 2 o tres grados, mostrando valores fluctuantes. Quisiera saber que estoy haciendo mal.

Responder

Gracias por el esfuerzo y aporte que realiza su persona. Muchas gracia…
Una pregunta. Si tengo un sensor tipo k a que me soporta 1200 grados. Con el max 6675 y pic podria monitorear y controlar …???

Responder

Hola Ronald, claro justamente en esta entrada estamos usando una termocupla tipo K con el max6675, de igual forma lo puedes ver en el datasheet del dispositivo.

Responder

Ya combine la programación del lcd pero no me muestra los valores, no se como hacer para que el termopar envíe los datos al lcd, le incluí a su programación del termopar lo siguiente:

#include
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD TRUE

Responder

Suponiendo que usamos como base el código de esta entrada

sprintf(msg,"Temp: %3.2f",do_everything()); 
printf(lcd_putc,"%s",msg);
Responder

Debes llamar primero las definiciones que vas a usar el puertoB antes de llamar la librería.

//Usadas para conectar el LCD en el Puerto B
#DEFINE USE_PORTB_LCD TRUE

//Librerías del LCD 
#INCLUDE<LCD.C>
Responder

Muchísimas gracias Sergio, ahora con esos arreglos me quedo funcional el el código y en Proteus. Gracias por tu ayuda.

Responder

Excelente Adrian, Saludos.

Responder

Hola amigo, ante todo muchas gracias por su cursos, son un gran esfuerzo y lo felicito ante todo, tengo una inquietud, tengo que usar en un proyecto co PIC 18F4550 un teclado 4×4 (ocupo el puerto B), uso una LCD (ocupo el puerto D) y a parte de algunas entradas y salidas tengo que usar un MAX 6675 pero los puertos SPI ya estan ocupados en el Puerto B, puedo hacer la asignacion de los puertos CLK, CS y DATA a otros puertos diferentes? y si se puede con que comando lo puedo asignar? gracias

Responder

Si, en la cabecera colocas en los DEFINE los pines que deseas usar. Si mal no recuerdo, en esta entrada usamos un SPI por software entonces no hay necesidad de usar los pines de hardware. Saludos.

Responder

Y si quisiera mostrar el valor de la temperatura en un LCD?

Responder

Es solo utilizar lo que vimos en la entrada del LCD con PIC. Saludos

Responder

Qué parte del código tendría que poner en print(lcd_putc)?

Responder

Hola Román, va a depender de la lógica de tu programa y de como quieras hacerlo. Si lo vas a hacer igual al ejemplo, es solo reemplazar la parte del printf por:
printf(lcd_putc,»%s»,msg);

Responder

Y como sería la programación en el PIC para configurar los puertos al LCD?

Hay que combinar lo que vimos en la entrada del LCD que le recomendé a Román con lo de esta entrada. En la entrada del LCD se muestra como configurar los puertos del LCD tanto en el puerto B como en el puerto D.

Ya lo combine pero el LCD se enciende y no muestra los datos del termopar, le coloque en el puerto D pero no entiendo como colocar en el programa para que el termopar envíe los datos al lcd.

disculpa la libreria para el max 31856 no la tienes??

Responder

No la tengo Ivan

Responder

Disculpa, cómo configuraria otro CS para que leyera otra termocupla

Responder

Para usar las mismas funciones, sera mejor que pongas el CS como parametro de entrada: init_TC(int CS); int16 read_TC(int CS) ; float do_everything(int CS) y cambies todo lo que dice TS_CS por CS, asi puedes definir al comienzo del código el pin donde irá el respectivo CS, por ejemplo
#define TC_CS PIN_C1
#define TC_CS2 PIN_C2
do_everything(TC_CS)
do_everything(TC_CS2)

Responder

hola, al momento de compilar la librería me aparece un error «A #DEVICE required before this line» ya busque que podría ser y no encuentro, o no debo compilar el programa y solo guardarlo como librería?

Responder

Estas compilando la librería??? debes compilar el programa principal, aquel que llama la librería, de lo contrario te va a salir un error.

Responder