Hola controleros y controleras, en esta entrada aprenderemos a realizar un monitoreo de temperatura, para un horno calefactor por resistencia utilizando una interfaz gráfica en MATLAB mostrado la evolución y el comportamiento dinámico de la variable temperatura en el computador. Adicionalmente, la comunicación entre el computador y el microcontrolador PIC se hará a través de una comunicación inalámbrica por radiofrecuencia utilizando dos módulos XBEE.
Antes de comenzar con la explicación detallada y antes de mostrarte los códigos Gratuitos, te invito a que ves el 👉 curso de microcontroladores PIC Gratuito del sitio web.
Horno Eléctrico
Para el proceso de este proyecto, vamos a utilizar un horno electrico de 110VAC, de esos comerciales que podemos encontrar en nuestro hogar.
Este tipo de hornos funciona con una resistencia calefactora, la idea entonces será colocar un relé de estado sólido en serie con la fase para poder regular la corriente que circula por la resistencia y de esa forma regular la temperatura.
Lectura de la Temperatura con Termocupla tipo K y PIC
El sensor de temperatura empleado en esta aplicación será un termopar tipo K, el cual estará conectado al PIC por medio de un integrado MAX6675.
Por lo tanto, la lectura de mV del sensor termopar tipo K sera interpretada por el MAX6675 y esta será enviada al microcontrolador PIC utilizando la comunicación SPI.
Si deseas conocer cómo realizar esta integración y como realizar la lectura de temperatura con el PIC, dale un vistazo a la entrada anterior:
👉
Etapa de Potencia
Para poder controlar la potencia del horno utilizando un microcontrolador PIC, se empleará un Relé de Estado Sólido.
Este relé de estado sólido tendrá que tener una entrada que acepte los 5VDC del microcontrolador PIC, por lo tanto, puede ser una entrada de 3-32VDC y una salida que acepte el voltaje alterno del horno de temperatura, que para esta práctica, se tiene un horno de 110VAC, por lo tanto la salida del relé puede ser entre 24-380VAC.
Por lo tanto, el Relé de Estado sólido, recibirá en la entrada, la señal de PWM del PIC, con lo cual el relé actuará como un SWITCHE de alta velocidad abriendo y cerrando rápidamente.
Este switcheo de alta velocidad, conseguirá regular la corriente que circula por la resistencia y por lo tanto, la energía calorífica entregada por la misma.
Comunicación inalámbrica con PIC y XBEE
Para podernos comunicar con el computador, el microcontrolador PIC hará uso de la comunicación Serial RS232, sin embargo, en lugar de realizar una comunicación por cable, haremos la comunicación por radiofrecuencia.
Para esto sustituimos el cable, por dos módulos de radiofrecuencia XBEE, logrando así una comunicación inalámbrica entre el PIC y el computador, para poder mandar los datos de temperatura y poderlos mostrar en la interfaz gráfica de MATLAB.
Puedes ver aquí como configurar los módulos XBEE.
Interfaz Gráfica con MATLAB
La comunicación entre el PIC y Matlab, será la esencia de este proyecto donde podremos monitorear la temperatura al interior de un horno.
Por lo tanto, en MATLAB vamos a desarrollar una interfaz gráfica capaz de mostrar tanto numéricamente cuanto gráficamente el comportamiento dinámico de la temperatura a lo largo de todo el experimento.
Dicha interfaz graficará en tiempo real la evolución de la temperatura al interior del horno, los cuales están siendo sensados por el microcontrolador PIC, para esto haremos uso de la interfaz gráfica de usuario GUIDE.
Puedes ver aquí como programar la interfaz gráfica con MATLAB animada.
Esquema del Circuito de Monitoreo de Temperatura con PIC
Código de Implementación
A continuación tienes el código de implementación para que lo descargues gratuitamente, solo debes compartir el contenido de este post con cualquiera de los siguientes tres botones, de esa manera ayudas a que más personas aprendan a hacer estos proyectos.
[sociallocker id=948]
Código en PIC C Compiler CCS C
Para descargar la librería del MAX6675 deberás hacerlo desde el post anterior: 👉
Código en PIC usando CCS C
#include <18F4550.h> #device ADC=16 #FUSES NOWDT //No Watch Dog Timer #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode) #FUSES HS #use delay(crystal=20000000) #use rs232(baud=9600,parity=N,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" #include <stdlib.h> #include <string.h> long deg=0; short timeout_error; char car[10]; char timed_getc() { long timeout; timeout_error=FALSE; timeout=0; while(!kbhit()&&(++timeout<50000)) // 1/2 second delay_ms(100); if(kbhit()) return(getc()); else { timeout_error=TRUE; return(0); } } //Define la interrupción por recepción Serial #int_RDA void RDA_isr() { int i=0,ini=0,fin=0; char dat[5]; char degC[5]; long duty; // Almacena 10 datos leidos del serial for(i=0;i<5;i++){ dat[i]=getc(); putc(dat[i]); } //Busco el valor del escalon en los datos recibidos for(i=0;i<5;i++){ if(dat[i]=='S'){ ini=i+1; i=10; } } for(i=ini;i<5;i++){ if(dat[i]==' ){ fin=i-1; i=10; } } if(ini!=0 && fin!=0){ // salvo en degC el caracter con el escalon for(i=ini;i<=fin;i++){ degC[i-ini]=dat[i]; } deg = atol(degC); //Convierte el String en un valor numerico // valida que el escalón esté ente 0 y 300 grados celcius if(deg>600) deg=600; if(deg<0) deg=0; duty=deg*10/6; set_pwm1_duty(duty); // set PWM del PIC } } //! void main() { char msg[32]; delay_ms(50); //allow oscillator to stabilise setup_timer_2(t2_div_by_4,249,1); //Configuracion de Timer 2 para establecer frec. PWM a 1kHz setup_ccp1(ccp_pwm); //Configurar modulo CCP1 en modo PWM set_pwm1_duty(0); //Dejo en cero la salida PWM enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); 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); } }
Código en MATLAB
%% Ejemplo Monitoreo de señales en tiempo Real function varargout=monitoreo(varargin) parar=false; fclose('all') global y fig(1)=figure('name','Monitor','menubar','none','position',[200 200 800 700],'color',[0.9 0.6 0.3]) movegui(fig(1),'center'); axe(1)=axes('parent',fig(1),'units','pixels','position',[60 80 600 550],'xlim',[0 40],'ylim',[0 200],'xgrid','on','ygrid','on') set(get(axe(1),'XLabel'),'String','Tiempo (Seg)') set(get(axe(1),'YLabel'),'String','Temperatura (°C)') lin(1)=line('parent',axe(1),'xdata',[],'ydata',[],'Color','r','LineWidth',2.5); lin(2)=line('parent',axe(1),'xdata',[],'ydata',[],'Color','k','LineWidth',2); bot=uicontrol('parent',fig(1),'style','pushbutton','string','Detener','position',[680 50 100 50],'callback',@stop,'fontsize',11) txbx=uicontrol('parent',fig(1),'style','pushbutton','string','Temp','position',[680 150 100 50],'callback',@texto,'fontsize',11) %% Funcion Pare function varargout=stop(hObject,evendata) parar=true; fclose(SerialP); delete(SerialP); clear SerialP; end %% funcion Graficar % function varargout=grafique(hObject,evendata) tiempo=[0]; salida=[0]; dt=1; limx=[0 40]; set(axe(1),'xlim',limx); %% Configura el Puerto Serial SerialP=serial('COM8'); set(SerialP,'Baudrate',9600); % se configura la velocidad a 9600 Baudios set(SerialP,'StopBits',1); % se configura bit de parada a uno set(SerialP,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8 set(SerialP,'Parity','none'); % se configura sin paridad fopen(SerialP); %% Grafico k=5;nit = 800; while(~parar) % Lectura del Dato por Puerto Serial variable= (fread(SerialP,20,'uchar')); ini=find(variable==73); %Busca el retorno de carro (Primer dato) ini=ini(1)+1; fin=find(variable==70); %Busca operador grados (ultimo dato) fin= fin(find(fin>ini))-1; fin=fin(1); tempC=char(variable(ini:fin))'; temp=str2num(tempC); set(txbx,'string',tempC); %Actualiza las variables del grafico tiempo=[tiempo tiempo(end)+dt]; salida=[salida temp]; set(lin(1),'xdata',tiempo,'ydata',salida); pause(dt); %% espera 0.1 seg para cada interación if tiempo(end)>=limx % actualizo grafica cuando llega a su limite en tiempo real limx=[0 limx(2)+40] set(axe(1),'xlim',limx) end k=k+1; if(k==nit) parar=true; end end parar=false; end
[/sociallocker]
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.