Vous êtes sur la page 1sur 9

D.P.E.

RE: Conexin de un LM35 a un PIC Hola Muchachos, les cuento mi experiencia. 1.- La conexion de un LM35 al PIC se puede realizar de ambas maneras, directamente o a traves de un AO. 2.- Que el sensado sea de 4.8mV/bit o 10mV/bit es irrelevante, pues el LM35 no entrega saltos de tension de 10mV unicamente, sino que tambien de 1mV y menos incluso... 4.- Al usar 10 bit obviamnete aumentamos la sensibilidad del A/D, pero tambien hacemos mas inestable la medicion, pues empiricamente el LM35 no est fijo a una tension determinada. Ademas hay que considerar que el A/D tiene un error de 1 LSB, lo que significa que si eventualmente el LM35 tiene usa salida estable, el conversor siempre va a tener una leve diferencia en la conversion dado el error mencionado. 3.- Lo importante es definir qu es lo que se desea medir. Por ejemplo. Usando 8 bits, y una referencia de 5 Volts, tenemos que la sensibilidad es de 20mV/bit, de modo que habran 1 grado celcius no medido o no reflejado en la conversion. Es por esto que se recomienda amplificar la seal del LM35 en una factor de 2 (usando un AO en modo amplificador no inversor con R2=R1). Otro elemento importante a considerar es el tipo de AO. El LM358 me da un offset de 2.8 mV (medido con V+=V-=0 volts). Ese error tambien influye en la medicion (podria optarse por un AO de instrumentacin). El uso de AO tambien esta dado para efectos de buffer y adaptacion de impedancias, cosa no menor. La entrada del AN0 debe tener 2 diodos, uno con el K a VCC, y el otro con el K a tierra, a fin de protegerlo. Tambien, si se quiere, no se amplifica la seal, pero si se conecta un AO seguidor de tension para adaptar la impedancia. 4.- Tambien es valido usar otras referencias, por ejemplo, si el LM35DZ da 0 volts para 2C, para 100C da Vout=10mV*98 saltos=0,98 volts. Para dicho valor tendriamos un 0xFF si es 8 bits de resolucion. Con esto, la resolucion seria de: 0.98/256= 3.8 mV/bit. No habrianecesidadad de un AO amplificador. Para jugar hay bastante. 5.- Para efectos de estabilidad de la medicion, es recomendable realizar un muestreo cada cierto tiempo, almacenar la medidas en un buffer, para luego sacar la media, y recien ese valor enviarlo al LCD o al RS232. Eso garantiza una representacin ms real de la temperatura medida, pues evitamos los errores producto del 1 LSB, el offset del AO y del LM35. 6.- Yo uso un LM35DZ, con un capacitor de 1 uF en serie con un resistor de 100 ohm, esto a la salida del LM35. 7.- La formula generica de calculo seria: T=Vref*Escala*read_adc()/(2^n-1)

Espero esto contribuya un poco. Saludos cordiales..

Proyecto 8
Este programa tiene como tarea: sensar la temperatura con un LM35 y mostrarla por una LCD. pic a utilizar PIC16F877. Frecuancia de oscilacion 4MHz.

Cada proyecto esta para ser descargado en el menu de "Descargas" elcodigo c comienza aqui #include "16f877.h" // Pic a utilizar #deviceadc=10 // Usa resolucin de 10 bits #use delay(clock=4000000) // Cristal a utilizar #fuses xt,nowdt,noput,nobrownout,nolvp,noprotect // Fusibles #include "lcd.c" // Libreria para utilizar LCD por el puerto D #use standard_io (D) void main (void) { float temper,medicion; lcd_init(); lcd_putc(" Termometro\n"); lcd_putc(" con LM35"); delay_ms(2000); lcd_putc("\f"); lcd_putc("Temperatura\n"); lcd_putc("actual"); delay_ms(1000); lcd_gotoxy(14,2); lcd_putc("oC");

// Inicia LCD // Saca texto // Saca texto // Limpia pantalla // Saca texto // Saca texto // Acomoda cursor LCD

while (1) { lcd_gotoxy(8,2); lcd_putc(" "); lcd_gotoxy(8,2);

// Acomoda cursor LCD // Limpia ese sector de pantalla // Acomoda cursor LCD

setup_adc (adc_clock_internal); setup_adc_ports (all_analog); set_adc_channel (0); // Elige canal a medir RA0 delay_us (20); medicion=read_adc (); // Haceconversin AD setup_adc (adc_off); // Apaga ADC temper=medicion*(0.48875); // Pasa binario a C ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // el "0.48875" sale de dividir 5/1023 y el resultado de eso multiplicarlo por 100 // el 5 sale de los 5 voltios aplicado a el voltage de referencia, los 1023 salen // de los 10 bit de resolucion del conversor analogico digital que seleccionamos. // Si utlizaramos la resolucion de 8 bits del conversor analogico digital, la // formula fuera (5/255)*100 ya que con 8 bits el numero maximo posible es de 0-255 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// printf(lcd_putc,"%02.1f",temper); // xxx.x C delay_ms (1000); } }

Codigo'**************************************************************** '* Name : TERMO_ON/OFF.PBP * * * * * * * '* Author : Max Eduardo Reyes Vera Juarez '* '* Date : All Rights Reserved : 04/10/2006

'* Notice : Copyright (c) 2006 Protegido Por leyes de Autor *

'* Version : 1.0 '* Notes : '* :

'**************************************************************** DEFINE LCD_DREG PORTD DEFINE LCD_DBIT 4 DEFINE LCD_EREG PORTC DEFINE LCD_EBIT 5 DEFINE LCD_RSREG PORTC DEFINE LCD_RSBIT 4 DEFINE ADC_CLOCK DEFINE ADC_BITS 10 3

DEFINE ADC_SAMPLEUS 50 ADCON1 = 143 OPTION_REG.7 = 0 TRISA = 255 TRISB = 255 TRISC = 0 TRISD = 0

TERMO VAR PORTA.0 HTEMP VAR PORTB.0 LTEMP VAR PORTB.1 ENTER VAR PORTB.2 EXIT VAR PORTB.3 HEAT VAR PORTC.0 SENSOR VAR WORD

MAXTEMP VAR WORD RANGO VAR WORD REF SL RL TL I VAR WORD VAR WORD VAR BYTE VAR BYTE VAR BYTE

pause 500 high heat pause 500 low heat pause 1000 INICIO: MAXTEMP=0 RANGO=0 PORTC=0 LCDOUT$FE,1," INGRESE " LCDOUT$FE,$C0,"TEMPERATURA" GOSUB PAUSA GOTO INICIO

PAUSA: FOR I=0 TO 20 IF HTEMP=0 OR LTEMP=0 THEN GOTO MAST ENDIF PAUSE 100 NEXT I RETURN MAST: IF EXIT=0 THEN BREAK IF LTEMP=0 THEN GOSUB MENOST

ENDIF IF hTEMP=0 THEN PAUSE 130 IF HTEMP=0 THEN MAXTEMP=MAXTEMP+1 TL = MAXTEMP LCDOUT$FE,1,"TEMPERATURA DE:" LCDOUT$FE,$C0," ENDIF ENDIF IF MAXTEMP>=250 THEN MAXTEMp=0 ENDIF IF ENTER=0 THEN MAXTEMP=(MAXTEMP*2 GOSUB XRANGO ENDIF GOTO MAST MENOST: IF EXIT=0 THEN BREAK IF HTEMP=0THEN GOTO MAST ENDIF IF LTEMP=0 THEN PAUSE 130 IF LTEMP=0 THEN MAXTEMP = MAXTEMP - 1 TL = MAXTEMP LCDOUT$FE,1,"TEMPERATURA DE:" LCDOUT$FE,$C0," ENDIF ENDIF ",DEC TL,"C" IF HTEMP=0 THEN MAST ) ",DEC TL,"C" IF LTEMP=0 THEN MENOST

IF MAXTEMP <=0 THEN MAXTEMP = 250 ENDIF IF ENTER=0 THEN MAXTEMP=(MAXTEMP*2 GOSUB XRANGO ENDIF GOTO MENOST XRANGO: LCDOUT$FE,1,"MARGEN DE ERROR?" GOSUB PAUS2 GOTO XRANGO RANGOTT: IF EXIT=0 THEN BREAK IF LTEMP=0 THEN GOTO RANGOTM ENDIF IF HTEMP=0 THEN PAUSE 130 IF HTEMP=0 THEN RANGO = RANGO+1 RL = RANGO LCDOUT$FE,1,"RANGO DE:" LCDOUT$FE,$C0,"+/- ",DEC RL,"C" IF LTEMP=0 THEN RANGOTM ENDIF ENDIF IF RANGO>255 THEN RANGO=0 ENDIF IF ENTER=0 THEN )

RANGO = (RANGO*2 GOTO CALIENTA ENDIF GOTO RANGOTT RANGOTM:

IF EXIT=0 THEN BREAK IF HTEMP=0 THEN GOTO RANGOTT ENDIF IF LTEMP=0 THEN PAUSE 130 IF LTEMP=0 THEN RANGO = RANGO-1 RL = RANGO LCDOUT$FE,1,"RANGO DE:" LCDOUT$FE,$C0,"+/- ",DEC RL,"C" IF HTEMP=0 THEN RANGOTT ENDIF ENDIF IF RANGO<=0 THEN RANGO=255 ENDIF IF ENTER=0 THEN RANGO = (RANGO*2 GOTO CALIENTA ENDIF GOTO RANGOTM CALIENTA: HIGH HEAT GOSUB SENSA SL=(SENSOR/2) LCDOUT$FE,1,"CALENTANDO A:" LCDOUT$FE,$C0,DEC TL,"C ","+/- ",DEC RL,"C" PAUSE 1500 )

LCDOUT$FE,1,"TEMP DE: ", DEC SL, "C" pause 1500 IF SENSOR>(MAXTEMP+RANGO) THEN lcdout$fe,1 gOTO COOL ENDIF GOTO CALIENTA COOL: LOW HEAT GOSUB SENSA SL=(SENSOR/2) lcdout $fe,$c0, "...ENFRIANDO...." PAUSE 1500 LCDOUT$FE,1,"TEMP DE: ", DEC SL,"C" PAUSE 1500 IF SENSOR<=(MAXTEMP-RANGO) THEN GOTO CALIENTA ENDIF GOTO COOL SENSA: FOR i = 0 TO 50 ADCIN TERMO,SENSOR REF=REF+SENSOR IF EXIT=0 THEN BREAK PAUSE 10 NEXT I SENSOR =REF/50 REF=0 RETURN PAUS2: FOR I=0 TO 10 IF HTEMP=0 OR LTEMP=0 THEN GOTO RANGOTT ENDIF PAUSE 150 NEXT I

RETURN BREAK: PORTC=0 MAXTEMP=0 RANGO=0 GOTO INICIO END

Vous aimerez peut-être aussi