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:
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.
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
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..
Conversión Análogo/Digital (A/D)
Secuencia de Leds con PIC (Instrucciones de Rotación)
Interrupciones PIC
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.
Mi nombre es Sergio Andres Castaño Giraldo, y en este sitio web voy a compartir una de las cosas que mas me gusta en la vida y es sobre la Ingeniería de Control y Automatización. El sitio web estará en constante crecimiento, voy a ir publicando material sobre el asunto desde temas básicos hasta temas un poco más complejos. Suscríbete al sitio web, dale me gusta a la página en Facebook y únete al canal de youtube. Espero de corazón que la información que comparto en este sitio, te pueda ser de utilidad. Y nuevamente te doy las gracias y la bienvenida a control automático educación.