Sie sind auf Seite 1von 6

El LM35 es un sensor analógico que devuelve la temperatura en forma de

tensión, esta tensión devuelta es proporcional a la temperatura. Su rango


comprende desde -55º hasta 150ºC y el valor devuelto es el equivalente a la
temperatura dividida por 10, entonces en su salida se obtienen valores como
estos.

• 1000 mv = 100ºC
• 240 mv = 24ºC
• -300 mv = -30ºC

En el MCU hay que implementar una regla de tres con el valor analógico leído,
de forma que podamos trabajar con el valor devuelto en formato de
temperatura real, ya sea para hacer un termómetro con avisador o
simplemente para mostrar la lectura en un LCD.
Los ADC en el PIC18F452 devuelven valores con 10bits de resolución, se
entiende que este valor comprende de 0 a 5v, por lo tanto su valor máximo es
1023 y equivale a los 5v. Para el ejemplo que mostramos mas abajo
utilizaremos el sensor LM35 sin realimentacion negativa, con lo cual solo
podemos obtener lecturas de temperatura mayores de 0º.
Para esto utilizaremos esta expresión:
Resolución por paso = Voltaje / Resolución ADC
Donde:
5v/1024 (10 bits) = 0,00488 * 1000 = 4,88
Ahora se multiplica por 10 el valor devuelto para obtener un segundo decimal
del resultado de la conversion ADC/Temperatura, con esto tenemos un valor
que hemos redondeado a 48.
A continuación mostramos un esquema de conexionado de un lector de
temperatura con un LM35 un PIC18F452. La temperatura se muestra en un LCD
Standard de 2x16 caracteres.
Esquema del circuito:
Codigo fuente:
program Adc_LM35
'*******************************************************************************
'Creado y verificado por: Julio Montagut
'Web: http://www.jvmbots.es
'
'Mikrobasic Version 7.0.3 (beta)
'
'-HARDWARE:
' MCU: PIC18F452 - HS - 8Mhz
' 1- LM35 conectado a PORTA.0 (AN0)
' 1- LCD 2x16 conectado en PORTD
'*******************************************************************************

dim temp_res as word


Resultado as word
OutTxt as byte[5]

main:
ADCON1 = %10001110 ' Configuracion Vref y AN0
TRISA = %00000001 ' PORTA.0 como entrada

Lcd_Init(PORTD) ' Inicializamos el LCD en PORTD


Lcd_Cmd(Lcd_CURSOR_OFF) ' Eliminamos el cursor
Lcd_Cmd(Lcd_Clear) ' Limpiamos el LCD
Lcd_Out(1, 1, "Temp:") ' Mostramos "Temp:" en el LCD

while TRUE
temp_res = Adc_Read(0) ' Lectura de la entrada analogica
Resultado=temp_res*48 ' Conversion ADC/Temperatura
wordtostr(Resultado,OutTxt) ' Convertimos la variable Resultado a texto

Lcd_Chr(1, 6, OutTxt[0]) ' Presentamos cada caracter en el LCD


Lcd_Chr(1, 7, OutTxt[1])
Lcd_Chr(1, 8, OutTxt[2])
Lcd_Chr(1, 9, ".")
Lcd_Chr(1, 10, OutTxt[3])
Lcd_Chr(1, 11, OutTxt[4])

delay_ms(1000) ' Delay de un segundo


wend
end.
Este montaje permite obtener la temperatura en grados Celsius con un rango
de 0 a 150, visualizados en 3 displays de 7 segmentos de cátodo común. El
valor de la señal del sensor LM35 se manipula algebraícamente para adaptarla
al rango de 0 a 150 con el ADC de 10bits.
El método de visualización es el de multiplexión o conmutación, en donde los
displays se encienden de forma alternada uno a la vez. Si la velocidad de
conmutación es elevada, se observan los 3 displays como si estuviesen
encendidos al mismo tiempo. (para este caso 1ms)
program Termómetro2
'Programa Termómetro con displays de 7 segmentos
*************************************
'Rutina que permite medir y visualizar con tres displays de 7 segmentos un
rango de
'temperatura entre 0 y 150 grados(C) empleando el conversor ADC del PIC +
sensor LM35.
'Mikrobasic 7.2
'
'Creado y verificado por: Alejandro De Nóbrega
'Web: http://www.jvmbots.es
'
'-HARDWARE:
' MCU: PIC 16F88
' Cristal o resonador: 4Mhz
' 3- Displays cátodo común. (RB0) --> SegA, (RB1) --> SegB, ..... (RB6) -->
SegG.
' 1- Sensor de temperatura LM35 (RA0)
' 7- Resistencias de 220R
' 3- Resistencias de 1K
' 3- Transistores NPN de uso general (2N2222)
' El cátodo del display de la derecha (menos significativo) se conecta a
través
' del transistor, cuya base se conecta en RA1, el segundo display en RA2 y
el
' tercer display en RA3.
'******************************************************************************
******
dim valor, conv, aux as word
const numero as byte[10] = (63, 6, 91, 79, 102, 109, 125, 7, 127, 111)

main:
OPTION_REG = 0
INTCON = 0
ANSEL = %00000001
CMCON = %00000111
TRISA = %00000001
TRISB = %00000000
PORTB = 0
PORTA = 0

while true
valor = ADC_read(0)
aux = valor * 61
aux = aux / 125
valor = aux

conv = Dec2Bcd16(valor)
aux = conv and $000F
PORTB = numero[aux]
PORTA.1 = 1
delay_ms(1)
PORTA.1 = 0

conv = word(conv >> 4)


aux = conv and $000F
PORTB = numero[aux]
PORTA.2 = 1
delay_ms(1)
PORTA.2 = 0

conv = word(conv >> 4)


aux = conv and $000F
PORTB = numero[aux]
PORTA.3 = 1
delay_ms(1)
PORTA.3 = 0
wend
end.

Programa optimizado:

program Termómetro2.1
dim valor, conv, aux as word
dim i as byte
const numero as byte[10] = (63, 6, 91, 79, 102, 109, 125, 7, 127, 111)

main:
OPTION_REG = 0
INTCON = 0
ANSEL = %00000001
CMCON = %00000111
TRISA = %00000001
TRISB = %00000000
PORTB = 0
PORTA = 0

while true

valor = ADC_read(0)
valor = valor * 61
valor = valor / 125
conv = Dec2Bcd16(valor)

for i = 1 to 3
aux = conv and $000F
PORTB = numero[aux]
PORTA.i = 1
delay_ms(1)
PORTA.i = 0
conv = word(conv >> 4)
next i

wend
end.

Das könnte Ihnen auch gefallen