Está en la página 1de 11

UNIVERSIDAD NACIONAL DEL CALLAO

FACULTAD DE INGENIERA ELCTRICA Y ELECTRNICA ESCUELA PROFESIONAL DE INGENIERA ELECTRNICA

CONTROL DE TEMPERATURA CON PIC 16F877A


CURSO :

ELECTRNICA DE POTENCIA 1

PROFESOR

Ing. RUSEL CORDOVA

ALUMNOS:

BELLAVISTA CALLAO 2009

1 9 6 6

CONTROL DE TEMPERATURA CON PIC 16F877A


o DIAGRAMA DE BLOQUES:

TECLADO (set point)

SENSOR (T0 ext)

ADC

uC

ETAPA DE POTENCIA

VISUALIZACION

SENSOR LM35

Descripcin: El LM35 es un sensor de temperatura con una precisin calibrada de 1C y un rango que abarca desde -55 a +150C. El sensor se presenta en diferentes encapsulados pero el mas comn es el to-92 de igual forma que un tpico transistor con 3 patas, dos de ellas para alimentarlo y la tercera nos entrega un valor de tensin proporcional a la temperatura medida por el dispositivo. Con el LM35 sobre la mesa las patillas hacia nosotros y las letras del encapsulado hacia arriba tenemos que de izquierda a derecha los pines son: VCC Vout - GND. La salida es lineal y equivale a 10mV/C por lo tanto: +1500mV = 150C +250mV = 25C -550mV = -55C

CONVERSIN A/D Y PROCESADO DE SEAL

Resolucin

RES =

Vref Volts Vref = 255 bits 2 8 1

Voltaje de entrada

0.01T

CONVERSOR A/D

Temperatura en bits

0.01T

LUEGO: RESO LU CIO N

=T

0.01T =T Vref 255

Vref = 2.55 Volts

Conversin AD: El uC 16F877A tiene el siguiente mdulo conversor:

El voltaje de referencia de 2.55 V se introducir por RA3 y el canal elegido para la conversin es RA0, el valor de la conversin se almacena en los registros ADRESH y ADRESL siendo por defecto los de ADRESH los de mayor peso.

Para activar la conversin se pone el bit ADON en 1 y para comenzar la conversin se activa el bit GO, ambos bits estan en el registro ADCON0. En el bloque S/H se hace el muestreo de la seal para ser digitalizada en la siguiente etapa. Una vez que se tiene el valor de la temperatura en ADRESH se compara con el valor introducido por el teclado. Si el valor sensado es menor que el rango establecido anteriormente, entonces D1=ON y D2=OFF. Si el valor censado esta dentro del rango establecido anteriormente, entonces D1=OFF y D2=OFF. Si el valor censado es mayor que el rango establecido anteriormente, entonces D1=OFF y D2=ON. Para la visualizacin de la temperatura en LCD se transforma el valor que esta en ADRESH a cdigo ascii a travs de una rutina de conversin. Luego este valor es enviado al LCD por medio del comando EnviaCarLCD que forma parte de una rutina de manejo de LCD la cual ser adjuntada en la ltima parte del trabajo. Para capturar la tecla pulsada se usa una rutina la cual explora el teclado y devuelve el valor de esta en un registro.

DIAGRAMA DE FLUJOS

CONFIGURACION DE REGISTROS

PULSO HELP? NO SI INGRESAR T1 < 150

INGRESAR T2 < 150

ACTIVAR CONVERSOR

TERMINO CONVERSION? NO SI ENVIAR A LCD

NO Text < T1? NO T1 < Text < T2? SI D1 = ON D2 = OFF

SI Text > T2 D1 = OFF D2 = ON D1 = OFF D2 = OFF

o
LIST

LENGUAJE EN ASSEMBLER

P=16F877A INCLUDE <P16F877A.INC> INCLUDE <MACROPIC.INC> __CONFIG _XT_OSC &_LVP_OFF &_WDT_OFF CBLOCK 0x20 ENDC T_1 EQU 0x22 T_2 EQU 0x23 INDICADOR EQU 0x24 AUX EQU 0x25 AUX2 EQU 0x26 REG1 EQU 0x27 REG2 EQU 0x28 REG3 EQU 0x29 TEMPER EQU 0x2A ASCII_H EQU 0x2B ASCII_M EQU 0x2C ASCII_L EQU 0x2D HEXADECIMAL EQU 0x2E Key_var equ 0x2F ORG 00H goto EMPEZAR org 0x05 include <TECLADO2.INC> EMPEZAR BSF STATUS,RP0 ;banco 1 BSF TRISA,0 ;entrada de sensor BSF TRISA,3 ;voltaje Ref=5.1 CLRF TRISB MOVLW B'11111100' MOVWF TRISC ;salidas para LEDs CLRF TRISD BSF ADCON1,0 ;para permitir ingreso de Vref=5.1V bcf OPTION_REG,7 ;resistencias Pull Up activada BCF STATUS,RP0 ;banco_0 ;;;configuracion de conversor AD MOVLW B'11000001' ;RA0=entrada de sensor MOVWF ADCON0 CLRF PORTC ;iniciar el trabajo CALL inicio_LCD ;inicio de LCD MOVLW 'P' call EnviaCarLCD MOVLW 'U' call EnviaCarLCD MOVLW 'L' call EnviaCarLCD MOVLW 'S' call EnviaCarLCD MOVLW 'E' call EnviaCarLCD MOVLW ' ' call EnviaCarLCD MOVLW 'M' call EnviaCarLCD MOVLW 'E' call EnviaCarLCD MOVLW 'N' call EnviaCarLCD MOVLW 'U' call EnviaCarLCD MOVLW DISP_ON_NOCURSOR call EnviaCmdLCD menu CLRF INDICADOR call Key_Scan ;Explora el teclado movlw 0x80

subwf Tecla,W btfsc STATUS,Z goto menu movlw 0x0F subwf Tecla,0 btfss STATUS,Z goto menu ;pedir_temperatura_1 CALL inicio_LCD MOVLW 'T' call EnviaCarLCD MOVLW 'E' call EnviaCarLCD MOVLW 'M' call EnviaCarLCD MOVLW 'P' call EnviaCarLCD MOVLW '1' call EnviaCarLCD MOVLW '=' call EnviaCarLCD call cap_tecla movf TEMPER,0 movwf T_1 MOVLW DISP_ON_NOCURSOR call EnviaCmdLCD btfss INDICADOR,0 GOTO $+2 GOTO MAL pedir_temperatura_2 CALL inicio_LCD MOVLW 'T' call EnviaCarLCD MOVLW 'E' call EnviaCarLCD MOVLW 'M' call EnviaCarLCD MOVLW 'P' call EnviaCarLCD MOVLW '2' call EnviaCarLCD MOVLW '=' call EnviaCarLCD call cap_tecla movf TEMPER,0 movwf T_2 btfss INDICADOR,0 GOTO $+2 GOTO MAL movf T_2,0 subwf T_1,0 btfsc STATUS,C GOTO MAL decf T_1,1 GOTO INICIO ;;;; MAL CLRF INDICADOR CALL inicio_LCD MOVLW 'E' call EnviaCarLCD MOVLW 'R' call EnviaCarLCD MOVLW 'R' call EnviaCarLCD MOVLW 'O' call EnviaCarLCD MOVLW 'R' call EnviaCarLCD MOVLW DISP_LINEA2 CALL EnviaCmdLCD

;Hay alguna pulsada ?? ;no ;si-->verificar si es Menu ;NO ES MENU ;inicio de LCD

;inicio de LCD

;w=T_1 - W(T_2);T_2>T_1 ;no ;para efectos de comparacion

;inicio de LCD

MOVLW call MOVLW call MOVLW call MOVLW call MOVLW call MOVLW call MOVLW call MOVLW call MOVLW call MOVLW call MOVLW call goto ;;;; INICIO

'P' EnviaCarLCD 'U' EnviaCarLCD 'L' EnviaCarLCD 'S' EnviaCarLCD 'E' EnviaCarLCD '' EnviaCarLCD 'M' EnviaCarLCD 'E' EnviaCarLCD 'N' EnviaCarLCD 'U' EnviaCarLCD DISP_ON_NOCURSOR EnviaCmdLCD menu ;INICIAR CONVERSION

BSF ADCON0,GO BTFSC ADCON0,GO GOTO $-1 ;;;;MOSTRAR EN LCD;;;;;;;;;;;;;;;; MOVF ADRESH,0 CALL inicio_LCD MOVF ADRESH,0 CALL Hex_Ascii MOVLW 'T' call EnviaCarLCD MOVLW 'E' call EnviaCarLCD MOVLW 'M' call EnviaCarLCD MOVLW 'P' call EnviaCarLCD MOVLW '=' call EnviaCarLCD MOVLW ' ' call EnviaCarLCD movf ASCII_H,0 call EnviaCarLCD movf ASCII_M,0 call EnviaCarLCD movf ASCII_L,0 call EnviaCarLCD MOVLW 0xDF call EnviaCarLCD MOVLW 'C' call EnviaCarLCD MOVLW DISP_ON_NOCURSOR;es CALL EnviaCmdLCD CALL COMPARAR CALL RETARDO call Key_Scan movlw 0x80 subwf Tecla,W btfsc STATUS,Z goto INICIO movlw 0x0F subwf Tecla,0 btfss STATUS,Z goto INICIO goto menu ;******************** RETARDO ;20ms

;W=Temperatura ;inicio de LCD ;para convertir de HEXADECIMAL a ASCII

;envia las centenas de temperatura ;envia las decenas de temperatura ;envia las unidades de temperatura ;envia el simbolo de grados celsius

para apagar el cursor del LCD ;chequea en que rango de temperatura se esta ;retardo de 20ms necesario para el ADC ;Explora el teclado ;Hay alguna pulsada ?? ;no ;si-->verificar si es Menu ;NO ES MENU

LAZO

MOVLW .10 MOVWF 20H

DECFSZ 20H,1 GOTO LAZO RETURN ;********************* COMPARAR MOVF ADRESH,0 ;W=TEMPERATURA ACTUAL SUBWF T_1,0 ;W=T_1-TEMPERATURA BTFSC STATUS,C ;C=0? (TEMP>T_1) GOTO LED_1 ;NO GOTO SIGUIENTE ;SI LED_1 MOVLW B'00000001' MOVWF PORTC RETURN SIGUIENTE MOVF ADRESH,0 ;W=TEMPERATURA ACTUAL SUBWF T_2,0 ;W=T_2-TEMPERATURA BTFSC STATUS,C ;C=0? (TEMP>T_2) GOTO LED_2 ;NO GOTO LED_3 ;SI LED_2 MOVLW B'00000000' MOVWF PORTC RETURN LED_3 MOVLW B'00000010' MOVWF PORTC RETURN ;*********************************************** ;RUTINA PARA CONVERTIR DE HEXADECIMAL A ASCII Hex_Ascii ;cargar en W el dato hex. ; movwf HEXADECIMAL clrf ASCII_H ;Para BCD D'0' clrf ASCII_M ;Para BCD D'0' clrf ASCII_L ;Para BCD D'0' Centenas movlw D'100' ;D'100' --> W subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W btfss STATUS,C ; HEXADECIMAL es menor que D'100' ? goto Decenas ;Si movwf HEXADECIMAL ;Salva el resto incf ASCII_H,F ;Incrementa el contador de centenas BCD goto Centenas ;Vuelve por otros D'100' Decenas movlw D'10' ;D'10' --> W subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W btfss STATUS,C ; HEXADECIMAL es menor que D'10' ? goto Unidades ;Si movwf HEXADECIMAL ;Salva el resto incf ASCII_M,F ;Incrementa el contador de decenas BCD goto Decenas ;Vuelve por otros D'10' Unidades movf HEXADECIMAL,W ;El resto pertenece movwf ASCII_L ;a las unidades BCD clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL Bcd_A_Ascii movlw H'30' ;H'30' --> W iorwf ASCII_L,F ;Convierte de BCD a ASCII iorwf ASCII_M,F ;Convierte de BCD a ASCII ; movf ASCII_H,F ;ASCII_H --> F btfsc STATUS,Z ;? ASCII_H es D'00' ? goto Espacio ;Si movlw H'30' ;H'30' --> W iorwf ASCII_H,F ;Convierte de BCD a ASCII return ;Retorna ;

Espacio ;

movlw '0' ;A' ' --> W movwf ASCII_H ;A' ' --> ASCII_H return ;Retorna ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cap_tecla call Key_Scan ;Explora el teclado movlw 0x80 subwf Tecla,W btfsc STATUS,Z ;Hay alguna pulsada ?? goto cap_tecla ;No movf Tecla,W ;Lee el cdigo de la tecla pulsada movwf REG1 ;Tecla-->REG1 call Hex_Ascii movf ASCII_L,0 call EnviaCarLCD pulso1 call Key_Scan ;Explora el teclado movlw 0x80 subwf Tecla,W btfsc STATUS,Z ;Hay alguna pulsada ?? goto pulso1 ;no on1 movlw 0x0D ;si-->verificar si es ON subwf Tecla,0 btfss STATUS,Z ;fue ON?? goto $+2 ;no goto salir1 ;si movf Tecla,W ;Lee el cdigo de la tecla pulsada movwf REG2 ;Tecla-->REG2 call Hex_Ascii movf ASCII_L,0 call EnviaCarLCD pulso2 call Key_Scan ;Explora el teclado movlw 0x80 subwf Tecla,W btfsc STATUS,Z ;Hay alguna pulsada ?? goto pulso2 ;no on2 movlw 0x0D ;si-->verificar si es ON subwf Tecla,0 btfss STATUS,Z ;fue ON?? goto $+2 ;no goto salir2 ;si movf Tecla,W ;Lee el cdigo de la tecla pulsada movwf REG3 ;Tecla-->REG3 call Hex_Ascii movf ASCII_L,0 call EnviaCarLCD pulso_3 call Key_Scan ;Explora el teclado movlw 0x80 subwf Tecla,W btfsc STATUS,Z ;Hay alguna pulsada ?? goto pulso_3 ;no movlw 0x0D ;si-->verificar si es ON subwf Tecla,0 btfss STATUS,Z goto pulso_3 goto salir3 ;;;;;; salir3 ;***** MOVF REG1,0 SUBLW .1 BTFSC STATUS,C GOTO CONTINUA MOVF REG1,0 SUBLW .2

BTFSS GOTO MOVF SUBLW BTFSC GOTO GOTO ;***** MALO BSF RETURN

STATUS,Z MALO REG2,0 .4 STATUS,C CONTINUA MALO INDICADOR,0

;***** CONTINUA BCF INDICADOR,0 movlw .9 movwf AUX movf REG2,0 movwf AUX2 ;AUX2=REG2 inicial follow3 movf AUX2,0 addwf REG2,1 ;REG2=REG2+REG2 decfsz AUX goto follow3 movf REG2,0 addwf REG3,1 ;REG3=10*REG2+REG3 falta movlw .99 movwf AUX movf REG1,0 movwf AUX2 ;AUX2=REG1 inicial otro movf AUX2,0 ADDWF REG1,1 DECFSZ AUX GOTO otro movf REG1,0 ADDWF REG3,0 MOVWF TEMPER RETURN ;;;;;;;;;;, salir1 movf REG1,0 movwf TEMPER ;TEMP<--REG1 RETURN ;;;;;;;;;; salir2 movlw .9 movwf AUX movf REG1,0 movwf AUX2 ;AUX2=REG1 inicial follow2 movf AUX2,0 ;w=aux2 addwf REG1,1 ;REG1=REG1+aux2 decfsz AUX goto follow2 movf REG1,0 addwf REG2,0 ;w=REG1+REG2 movwf TEMPER RETURN INCLUDE <LCD.ASM> INCLUDE <RETARDO.ASM> END

También podría gustarte