Está en la página 1de 19

DEPARTAMENTO DE ELECTRICA Y ELECTRONICA

ÁREA DE SISTEMAS DIGITALES

ASIGNATURA: MICROCONTROLADORES NRC: 3220

Proyecto del tercer parcial

Tema: Control de planta de temperatura

Docente: Ing. Carlos Ponce

Equipo #:7 Integrantes: 1.Saúl Obando


2. Raham Castillo

Base Aspectos de evaluación Calificación


0.25 Fundamento teórico
0.25 Diagrama de bloques
0.50 Tabla de asignación de variables
3.5 Informe 1.00 Diagrama de flujo
1.00 Programa
0.25 Conclusiones
0.25 Diagrama electrónico
1.00 Presentación del circuito, condiciones
4.5 Funcionamiento 1.00 Funciones (Inicio - Paro)
2.50 Indicador tensión LCD
2.0 Defensa

10 Total

Sangolquí – 07 de febrero de 2019


DEPARTAMENTO DE ELECTRICA Y ELECTRONICA

UNIDAD Nº3

1. Tema: Control de planta de temperatura

2. Objetivos:

 Desarrollar una simulación de un control de una planta de temperatura mediante el


diseño de un programa en Java y en el microcontrolador que permita medir la
temperatura de un sensor LM35 controlar y el encendido y el apagado de un foco
 Implementar una comunicación serial entre el microcontrolador y el CPU que permita
graficar la temperatura en tiempo real al calentar y enfriar el foco.

3. Materiales

- Microcontrolador PIC 16F877A.


- LCD 16x2
- Microcontrolador PIC 16F62X
- Teclado matricial 4x4.
- Fuente de alimentación.
- Protoboard
- Multímetro
- Cristal 4Mhz
- Capacitores, resistencias, dipswitch, leds. Cables.
- Computador
- Grabador de PICs

4. Procedimiento

En base al Pic 16F877A, diseñar un voltímetro digital, en donde la variación de tensión que ingresa
por el canal 0, se podrá observar en un LCD con dos décimas de resolución. Adicionalmente el
voltímetro digital funcionará un minuto cada vez que se ha presionado la tecla inicio.

El voltímetro digital requiere de dos funciones ingresadas por teclado, que podrán ser ejecutadas en
cualquier momento:

1. INICIO: Permite iniciar el funcionamiento del voltímetro.


2. PAUSA : Permite pausar el funcionamiento si aún no ha transcurrido un minuto de
funcionamiento. Para reiniciar el funcionamiento deberá presionarse nuevamente
INICIO.
NOTA:
Se presenta los siguientes requerimientos para la implementación:
- La programación será en lenguaje ensamblador.
- Se deberán utilizar las siguientes interrupciones:
Teclado (INT)
Timer (0, 1 o 2)
- Conversor análogo digital

5. Contenido

5.1. Fundamento Teórico

a. Comunicación Serial

La comunicación serial sólo utiliza tres líneas, una para recibir los datos Rx, otra para
trasmitir los datos Tx y la línea común GND. En nuestro caso específico para el PIC 16F887
las lineas TX y RX corresponden a los pines 25 y 26 (Puerto RC6 y RC7 respectivamente)
como puede ser observado en la siguiente figura. Para cualquier otro PIC, solo basta con
buscar donde están ubicados estos pines con ayuda del datasheet.

Comunicación Serial Sincrónica

En esta comunicación además de una línea sobre la que se transfieren los datos, se necesita
otra que contenga pulsos de reloj que indiquen que el dato es válido; la duración del bit está
determinada por la duración del pulso de sincronismo.

Comunicación Serie Asincrónica

En esta comunicación los pulsos de reloj no son necesarios y se utilizan otros mecanismos
para realizar la transferencia de datos. La duración de cada bit está determinada por la
velocidad con la cual se realiza la trasferencia de datos, por ejemplo si se transmite a 1200
bits por segundo (baudios), la duración de cada bit es de 833 microsegundos. Las velocidades
de transmisión más comunes son 300, 600,1200, 2400, 9600, 14400 y 28800 baudios.

Pasos para trabajar con comunicación serial

1. En el encabezado del programa incluir la directiva

#USE RS232(BAUD=BAUDIOS, XMIT=PIN, RCV=PIN)

Baud: Velocidad en baudios (bits por segundo).


Xmit: Bit que transmite (Tx)
RCV: Bit que recibe (Rx)

2. En el programa principal enviar o recibir un carácter para recibir un carácter se usa la


instrucción.
PUTC() //Esta instrucción envía un carácter a la patica XMIT del dispositivoRS232.

Hacen lo mismo las instrucciones GETCH() y GETCHAR().Para enviar un carácter se usa la


instrucción

PUTC() //Esta instrucción envía un carácter a la patica XMIT del //dispositivoRS232.

Figura 1.Conector RS232

Y para lograr dicha comunicación con nuestro computador, es necesario utilizar un circuito
integrado adicional llamado MAX232. El MAX232 es un circuito integrado de Maxim que
convierte las señales de un puerto serie RS-232 a señales compatibles con los niveles TTL de
circuitos lógicos. El MAX232 sirve como interfaz de transmisión y recepción para las señales
RX, TX, CTS y RTS.

Figura 2. Diagrama de conexión del MAX 232 con el cable serial DB9

Observación.-Debido a que en las computadoras actuales se fue abolido este tipo de


comunicación por eso en computadores actuales, no vamos a encontrar este tipo de puerto.
Para dar solución a este problema, podemos usar un conversor SERIAL-USB,
Figura 3.Esquema de comunicación del pic con la computadora

b. MODULO PL203
Este módulo convierte un puerto USB en un puerto serial, con niveles de voltaje TTL
compatibles con la mayoría de tarjetas microcontroladoras como es Arduino/Pic , salidas de
voltaje reguladas de ,posee leds indicadores de transmisión y recepción de datos, trabaja con
Windows 7,Windows 8,Visua XP,Linux.

Figura 4.Módulo PL203

c. LM35
El LM35 es un sensor que puede medir temperatura. Su salida es analógica, es decir, entrega
un voltaje proporcional a la temperatura. El sensor tiene un rango desde −55°C a 150°C. Dado
que el sensor LM35 es analógico, basta con medir con un multímetro, el voltaje a salida del
sensor. Para convertir el voltaje a la temperatura, el LM35 proporciona 10mV por cada grado
centígrado. También cabe señalar que ese sensor se puede usar sin offset, es decir que si
medimos 20mV a la salida, estaremos midiendo 2°C.
Explicación de Pines
El sensor presenta 3 pines de conexión, de izquierda a derecha tenemos el pin de alimentación
+Vs, el pin Vout, y el pin de tierra GND (Figura 2).

Figura 5.Sensor LM35

d. TIMER 0

El Timer 0 también llamado RTCC se puede cargar con un valor cualquiera entre 0 y 255 y
puede ser incrementado a través del Reloj interno y dividido por un valor que se puede
escoger entre los que se indican a continuación (Valor de Preescaler):
La interrupción RTCC se produce cada vez que el contador TIMER0 pasa de 255 para 0.
Para entender el funcionamiento del Timer 0, como ejemplo se supone que se
necesita generar una interrupción cada 20 ms. (20.000 microsegundos).
La fórmula para aplicar es la siguiente recordando que primero debemos pasar el tiempo de
temporización a segundos es:

La interrupción solo se genera cuando el timer pasa de 255 a 0, esto quiere decir que
debemos restarle al valor total del timer (256) el valor de carga inicial que tenga el Timer 0.

Timer 0 puede ser dividido (preescaler) por un valor aplicando alguna de las instrucciones
citadas al comienzo del post. Al seleccionar el preescaler o división, se debemos tratar de
obtener un valor entero al dividir el tiempo del retardo sobre el preescaler. Este valor no
puede ser mayor a 256. En caso de ser mayor, significa que antes de cumplir el retardo el
microcontrolador habrá generado más de una interrupción.

e. INTERRUPCIONES

Con las interrupciones en un microcontrolador vamos a poder hacer que el dispositivo pare
de repente la tarea que está realizando para que haga o realice una función con urgencia y
después continúe haciendo su rutina habitual.
Las interrupciones PIC ocurren por sucesos externos como la generación de una interrupción
por flanco PIC, una interrupción externa PIC cambiando el nivel en un PIN del
microcontrolador o eventos internos tales como el desbordamiento de un contador,
terminación del conversor análogo a digital, entre otras.
Figura6.iNTERRUPCIONES

Pasos para atender una interrupción

a) Digitar la función correspondiente a la interrupción. La función debe comenzar con # y la


interrupción correspondiente, por ejemplo para la función de interrupción por RB0 se
digita #int_EXT.
b) En el programa principal, habilitar las interrupciones en forma global, con la instrucción:
enable_interrupts(GLOBAL).
c) En el programa principal, habilitar la interrupción correspondiente, como ejemplo se
muestra como habilitar la interrupción externa por RB0: enable_interrupts(INT_EXT).
5.2. Diagrama de bloques

a. Diagrama de bloques1
SALIDAS

ENTRADAS PORTC

Representación en
PORTD decimal en forma
el LCD de 16x2
Teclado
matricial 4x4 8
uC
6

Microcontrolador

CPU
PORTA 16F877A TX y RX

Sensor LM35

PORTB
6

1
PORTB
INDICADOR
LED
5.3. Valor de los registros de configuración

a. Configuración del PIC16F877A

VARIABLE ESTADO DESCRIPCIÓN


OSC XT Oscilador XT para media frecuencia
WDT OFF Desactiva el temporizador del perro guardián
LVP OFF Pin RB3 es digital I/O
CPD OFF Deshabilita la protección de datos de la memoria
EEPROM

Tabla5.-Configuración de registros

VARIABLE DESCRIPCIÓN
PORTD Puerto Declarado para el teclado matricial 4x4

PORTB Puerto Declarado que va crear la interrupción que recibe del


teclado conectado al Pic 16f628a
PORTC Puerto Declarado como salidas de datos que permite mostrar en
el LCD
PORTA Entrada analógica del sensor

Tabla6.-Configuración de puertos

VARIABLE VALOR DIRECCIÓN


PORTA 0X01 05H
PORTB 0X01 06H
PORTD 0xFF 07H
PORTC 0X00 08H

Tabla 3.-Asignación de variables locales de los puertos

CONFIGURACIÓN DEL PIN DESCRIPCIÓN


LCD

#define lcd_data4 D4 Se define data4 como el pin 4 del puerto D


#define lcd_data5 D5 Se define data5 como el pin 5 del Puerto D
#define lcd_data6 D6 Se define data6 como el pin 6 del Puerto D
#define lcd_data7 D7 Se define data7 como el pin 7 del Puerto D
#define lcd_enable E Se define enable como el pin 0 del Puerto D
#define lcd_rs_pin RS Se define rs como el pin 1 del puerto D
#define lcd_rw_pin RW Llamamos a la librería de la LCD

Tabla 7.-Tabla de configuración del LCD de 16x2


CONFIGURACIÓN MODIFICACIÓN DESCRIPCIÓN
COMUNICACIÓN SERIAL
TX Y RX

baud 9600 Velocidad de transmisión y


recepción
Xmit PIN C6 Bit que transmite TX
RCV PIN C7 Bit que recibe RX

Tabla 7.-Tabla de configuración del LCD de 16x2

VARIABLE TIPO DESCRIPCIÓN


SpU Int Acumulador de unidad para setpoint
SpD Int Acumulador de decena para setpoint
SetP Int Valor del setpoint
c Char Almacena el valor del carácter presionado en teclado
p int Variable de carácter para interrupción por teclado.
Temp1 Int8 Inicialmente no lee nada en el pin del adc
temp Float Diseñado para un segundo por lo tanto, cada ves que
cuenta uno hasta llegar a 60 mi variable inicio se pondra
en 0
uni Char Manejo de unidades
dece Char Manejo de decenas
X char Tecla presionada

Tabla 8.-Caracteristicas de las variables asignadas del pic 16f877a

5.4. Diagrama de flujo

a. Diagrama de flujo PIC16F628A


Diagrama de flujo del desarrollo del programa Principal
Diagrama de flujo de la definición de variables y la lectura del sensor

Interrupciones para la lectura del teclado, pin digital y comunicación serial


5.5. Programa
#use standard_io(c) //Puerto C como salidas
#define LCD_DB4 PIN_C2 //Se cambia el lcd al puerto C
#define LCD_DB5 PIN_C3 //Se cambia el lcd al puerto C
#define LCD_DB6 PIN_C4 //Se cambia el lcd al puerto C
#define LCD_DB7 PIN_C5 //Se cambia el lcd al puerto C
#define LCD_RS PIN_C0 //Se cambia el lcd al puerto C
#define LCD_E PIN_C1 //Se cambia el lcd al puerto C
#define USE_PORTD_KBD //Indica que el teclado se conecta al puerto D
#define KEYHIT_DELAY 200 //Varaible que ayuda el delay
#include <lcd.c> //Libreria del lcd
#include <KBD4x4.c> //Libreria del teclado
#include <math.h> //Libreria para matematicas
#include <string.h> //Libreia para cadena de caracteres
#byte puerto_b = 0x06 //Asigna el puerto B

int Tuni; //Guarda las unidades de la temperatura


int Tdec; //Guarda las decenas de la temperatura
int T1; //Temperatura 1
int T2; //Temperatura 2
int8 Valor_Leido; //Valor leido en la conversion
float Valor_salida; //Temperatura mostrada
int Valor_salidaEn; //Temperatura que se envía

/*Funcion para leer el teclado*/


char tecla_time(void) {
char c='\0'; //Inicializa la variable
unsigned int16 timeout; //Variable para tiempo de espera
timeout=0; //Inicializa la varaible
c=kbd_getc(); //Captura valor del teclado
while(c=='\0' && (++timeout< (KEYHIT_DELAY))) //Compurueba el tiempo de espera
{
delay_us(5); //Delay
c=kbd_getc(); //Toma el valor de teclado
}
return(c);
}

char tecla(void)
{
char c; //Variable para la lectura del teclado
do{
c=kbd_getc(); //Toma el valor del teclado
}
while(c=='\0'); //Espera a que presione una tecla
return(c);
}
//INTERRUPCIONES---------------------------------------------------------------------------
#INT_RDA
void interrupcion_Recepcio(){
int recibo; //Guarda el dato recibido
recibo=getc(); //Guarda el valor

if (recibo==90){ //Compara el valor recibido


LCD_PUTC("\f"); //Limpia el LCD
output_low(pin_b2); //Pone en balo el RB2
output_low(pin_b4); //Pone en bajo RB4
delay_us(500); //Tiempo de espera
do{

recibo=getc(); //Toma el dato


}while(recibo==80); //Toma el dato hasta que cambie de estado

output_high(pin_b2); //Pone en alto el pin RB2


enable_interrupts(int_ext); //Habilita kas interrupciones externas
}

}
int comprobar=0; //Inicializa el valor
#int_ext
void interrupcion(){
lcd_putc("\f"); //Limpia el LCD
output_low(pin_b2); //Pone en bajo RB2
output_low(pin_b4); //Pone en balo RB4
delay_us(500); //Tiempo de espera

do{

if(bit_test(puerto_b,0)==1 ){ //Comprueba el estado del RB0


comprobar=0; //Inicializa la variable
}else{
comprobar=1; //CAmbia de valor a la variable
}
}while(comprobar==1); //Mientras esta en 1, regresa

output_high(pin_b2); //Pone en alto RB2


comprobar=0; //Inicializa la variable

}
/*------------------------------FUNCION PRINCIPAL---------------------------*/
void main(){
setup_adc_ports(NO_ANALOGS); //Configura puertos analogos
setup_adc(ADC_OFF); //Deshabilita la conversion
setup_psp(PSP_DISABLED); //
setup_spi(FALSE); //
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //Configura el contador del timer
setup_timer_1(T1_DISABLED); //Deshailita el timer1
setup_timer_2(T2_DISABLED,0,1); //Deshabilita el timer2
setup_comparator(NC_NC_NC_NC); //Activa el comparador
setup_vref(FALSE); //No indica voltaje d referencia
set_tris_a(0xff); // comprobar puertos
enable_interrupts(global); //Habilita las iterrupciones
enable_interrupts(int_RDA); //Habilita las interrupcion RDA
char x; //Guarda el caracter presionado
char p; //Guarda el caracter presionado
char uni; //Guarda las unidades
char dece; //Guarda las decenas
lcd_init(); //inicio lcd
Kbd_init(); //inico teclado
etiqueta:
enable_interrupts(int_ext); //Deshabilita las interrupciones externas
EXT_INT_EDGE(H_to_L); //Indica cambio por flanco descendente

output_low(pin_b4); //Pone en bajo el RB4


output_high(pin_b2); //Pone en alto RB2
/*Setear temperatura maxima T1*/
lcd_gotoxy(1,1); //Ubica el cursor
lcd_putc("Ingrese T1"); //Indica el mensaje
dece =tecla() ; //Lee el valor presionado
Tdec=(dece-'0')*10; //Loconvierte a entero
lcd_gotoxy(6,2); //Ubica el cursor
lcd_putc(dece); //Muetsra el valor
uni =tecla() ; //Lee el valor
Tuni=uni-'0'; //Lo convierte a entero
lcd_gotoxy(7,2); //Ubica el cursor
lcd_putc(uni); //Muestra en el lcd
T1=Tuni+Tdec; //Completa T1
do{
x=tecla(); //Lee el valor por teclado
}while(x!='A'); //Espera a que se presione la A
lcd_putc("\f"); //Limpia el lcd
/*Ingreso Temperatura minima*/
lcd_gotoxy(1,1); //Ubica el cursor
lcd_putc("Ingrese T1"); //Muestra el mensaje
dece =tecla() ; //Lee el valor ingresado
Tdec=(dece-'0')*10; //Convierte a entero
lcd_gotoxy(6,2); //Ubica el cursor
lcd_putc(dece); //Muestra en el lcd
uni =tecla() ; //Pide el para ingresar
Tuni=uni-'0'; //Convierte a entero
lcd_gotoxy(7,2); //Ubica el cursor
lcd_putc(uni); //Muestra el valor
T2=Tdec+Tuni; //Completa T2
do{
x=tecla();
}while(x!='A'); //Espera a que presione la letra A
lcd_putc("\f"); //Limpia en lcd
while(TRUE) {
setup_adc(ADC_CLOCK_INTERNAL); //Indica que se ocupara el reloj interno
Setup_adc_ports(RA0_ANALOG); //PONE PUERTO RA0 ANALOGO
set_adc_channel(0); // INDICA EL PIN A LEER RA0
delay_us(1000); //DELAY
Valor_Leido=read_adc(); //LEE EL VALOR DEL PIN
Valor_salida=(Valor_Leido*0.01960784314*100); //CONVIERTE EL VALOR LEIDO
DE HEXA AL REAL
Valor_salidaEn=Valor_salida; //Se guarda el valor convertido para enviarlo
putc(Valor_salidaEn); //envio Serial
p=tecla_time(); //Espera a que presione la tecla de apgado
if(p=='#'){ //Comprueba si se apaga el sistema
output_low(pin_b4); //Pone en bajo RB4
output_low(pin_b2); //Pone en abjo RB2
LCD_PUTC("\f"); //Limpia el lcd
disable_interrupts(int_ext); //Deshabilita las interrupciones
do{
p=tecla_time(); //Comprueba que tecla se presiona
}while(p!='*');
lcd_gotoxy(1,1); //Ubica el cursor
LCD_PUTC("\f"); //Limpia el lcd
goto etiqueta; //REgresa a etiqueta
}

if(Valor_salida>T1){ //Compara el valor convertido


output_low(pin_b4); //Se pone en bajo RB4
lcd_gotoxy(1,1); //Ubica el cursor

printf(lcd_putc,"T=%d C Max:%d C",Valor_salidaen,T2); //Muestra en el lcd


lcd_gotoxy(1,2); //ubica el cursor
printf(lcd_putc,"Estado: Apagado"); //Indica el estado del foco

} else if(Valor_salida>T2 & Valor_salida<T1){


output_high(pin_b4); //Apaga el foco

lcd_gotoxy(1,1); //Ubica el cursor


printf(lcd_putc,"T=%d C Max:%d C",Valor_salidaen,T2); //Muestra en pantalla
lcd_gotoxy(1,2); //Ubica el cursor
printf(lcd_putc,"Estado: Activado"); //Indica el estado del foco
}
}
}
5.6.Diagrama electrónico

Figura7.-Diagrama esquemático del circuito

Figura8.-Interfaz en Java
5.7.Simulación

Figura8.-Simulación

6. Conclusiones

 Para efectuar la conversión AD se requiere de al menos 1.6 μs, por ende es necesario
considerar en el modo de conversión un tiempo mayor al establecido para realizar la
conversión. Al emplear un oscilador de 4 Mhz fue necesario utilizar el oscilador RC
interno para frecuencias mayores a 1 Mhz el cual tiene un reloj de 4 μs permitiendo
realizar sin problema la conversión AD empleando la instrucción
setup_adc(adc_clock_internal).
 Para poder efectuar la comunicación es necesario validad el envio y recepción de la
misma.
 Las interrupciones #int_rb y #int_ext permiten configurar las interrupciones externas
del microcontrolador de acuerdo a las teclas del teclado matricial, además permite
controlar la activación del pin digital como el envío de datos por comunicación serial,
es necesario habilitar las resistencias pull up del puerto B para su correcto
funcionamiento.
 Para la utilización del LCD se debe considerar que por defecto se encuentra
configurada para ser utilizada en el puerto D, además se debe definir que pines del
microcontrolador estarán conectados a la misma.
 Se debe instalar todos los driver para la lectura del puerto serial, como la instalación
de librerías en NetBeans para la lectura de los datos con el pic.
7. Referencias

Fernando E. PRIMERA 2007 Español Marcombo


Microcontroladores: fundamentos y Valdés Pérez,
aplicaciones con PIC Ramón Pallás
Areny
Programación de microcontroladores Ibrahim Dogan PRIMERA 2006 Español Marcombo
PIC

También podría gustarte