No se tus conocimientos de electrónica pero lo habitual es poner un comparador con circuito integrado. Con el podrás tener precisión y con la salida hacer lo que quieras.
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
;El módulo convertidor ADC. Termómetro digital
;
;Este ejemplo visualiza sobre la pantalla LCD la temperatura ambiente captada por el sensor LM35DZ
;conectado con la entrada RA0/AN0 y cuya precisión es de 10mV/ºC. La resolución del convertidor
;ADC, con una tensión de referencia de 5V, es de 0.00488. En estas condiciones cada ºC supone
;dos incrementos en la salida del convertidor (0.00976V=10mV) aproximadamente. Es por ello que
;al resultado de la conversión se le divide entre 2.
;
;Se emplea el Timer 1 que provoca una interrupción cada 0.1 seg. Cuando se produzcan n interrupciones
;se procede a tomar una muestra de la tempreatura. En este ejemplo se toman cada 1 segundo.
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración
Tiempo equ .10 ;Nº de interrupciones de 0.1 seg. para tomar una muestra (p.e. 1 segundo)
cblock 0x20 ;Inicio de variables de la aplicación
Byte_L ;Parte baja del byte a convertir
Byte_H ;Parte alta del byte a convertir
BCD_2 ;Byte 2 de conversión a BCD
BCD_1 ;Byte 1 de conversión a BCD
BCD_0 ;Byte 0 de conversión a BCD
Contador ;Variable de contaje
Int_Cont ;Contador de interrupciones
Temporal
Temporal_1
Temporal_2 ;Variables temporales
endc
Lcd_var equ 0x70 ;Variables de las rutinas LCD
org 0x00
goto Inicio ;Vector de reset
org 0x04
goto Inter ;Vector de interrupción
org 0x05
;******************************************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter a visualizar
Tabla_Mensajes movwf PCL ;Calcula el desplazamiento sobre la tabla
;***********************************************************************************
;La directiva DT genera tantas intsrucciones RETLW como bytes o caracteres contenga
Mens_0 equ $ ;Mens_0 apunta al primer carácter del mensaje 0
dt " Temp.= ",0xdf,"C",0x00
include "LCD4bitsPIC16.inc" ;Incluye rutinas de manejo del LCD
;*************************************************************************************
;Mensaje: Esta rutina envía a la pantalla LCD el mensaje cuyo inicio está indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00
Mensaje movwf Temporal_1 ;Salva posición de la tabla
Mensaje_1 movf Temporal_1,W ;Recupera posición de la tabla
call Tabla_Mensajes ;Busca caracter de salida
movwf Temporal_2 ;Guarda el caracter
movf Temporal_2,F
btfss STATUS,Z ;Mira si es el último
goto Mensaje_2
return
Mensaje_2 call LCD_DATO ;Visualiza en el LCD
incf Temporal_1,F ;Siguiente caracter
goto Mensaje_1
;****************************************************************************************************
;Visualizar: Visualiza sobre la pantalla LCD, en la posición actual del cursor, los dos
;dígitos situados en la variable BCD_2
Visualizar swapf BCD_2,W
andlw 0x0f
iorlw 0x30 ;Convierte a ASCII el nible de más peso
call LCD_DATO ;Lo visualiza
movf BCD_2,W
andlw 0x0f
iorlw 0x30 ;Convierte a ASCII el nible de menos peso
call LCD_DATO ;Lo visualiza
return
;***************************************************************************************************
;16Bits_BCD: Esta rutina convierte un número binario de 16 bits situado en Cont_H y
;Cont_L y, lo convierte en 5 dígitos BCD que se depositan en las variables BCD_0, BCD_1
;y BCD_2, siendo esta última la de menos peso.
;Está presentada en la nota de aplicación AN544 de MICROCHIP y adaptada por MSE
Bits16_BCD bcf STATUS,C
clrf Contador
bsf Contador,4 ;Carga el contador con 16
clrf BCD_0
clrf BCD_1
clrf BCD_2 ;Puesta a 0 inicial
Loop_16 rlf Byte_L,F
rlf Byte_H,F
rlf BCD_2,F
rlf BCD_1,F
rlf BCD_0,F ;Desplaza a izda. (multiplica por 2)
decfsz Contador,F
goto Ajuste
return
Ajuste movlw BCD_2
movwf FSR ;Inicia el índice
call Ajuste_BCD ;Ajusta el primer byte
incf FSR,F
call Ajuste_BCD ;Ajusta el segundo byte
incf FSR,F
call Ajuste_BCD
goto Loop_16
Ajuste_BCD movf INDF,W
addlw 0x03
movwf Temporal
btfsc Temporal,3 ;Mayor de 7 el nibble de menos peso ??
movwf INDF ;Si, lo acumula
movf INDF,W
addlw 0x30
movwf Temporal
btfsc Temporal,7 ;Mayor de 7 el nibble de menos peso ??
movwf INDF ;Si, lo acumula
return
;***************************************************************************************
;Inter: Tratamiento de la interrupción que provoca el Timer 1 cada 0.1 seg. Espera a que
;se produzcan tantas interrupciones como se indique en "Tiempo" para conseguir una temporización
;total determinada. Inicia una conversión del canal seleccionado, realiza los cálculos
;apropiados y visualiza sobre el LCD
Inter: decfsz Int_Cont,F ;Han pasado n interrupciones ??
goto Inter_Fin ;No, fin de tratamiento
;Inicia la conversión
bsf ADCON0,GO_DONE ;Inicia la conversión ADC
Inter_1 btfss PIR1,ADIF ;Fin de conversión ??
goto Inter_1 ;No, esperar
bcf PIR1,ADIF ;Si, reponer el flag
;Lee el resultado
movf ADRESH,W
movwf Byte_H ;Lee y salva la parte alta de la conversión
bsf STATUS,RP0 ;Banco 1
rrf ADRESL,W ;Divide entre 2 la parte baja de la conversión
bcf STATUS,RP0 ;Banco 0
movwf Byte_L ;Lee y salva la parte baja/2 de la conversión
;Convierte y visualiza
call Bits16_BCD ;Convierte a BCD
movlw 0x89
call LCD_REG ;Coloca el cursor
call Visualizar ;Visualiza sobre el LCD
;Fin del tratamiento
movlw Tiempo
movwf Int_Cont ;Repone el contador para otras 10 interrupciones (1 seg)
Inter_Fin movlw low ~.12500
movwf TMR1L ;Carga la parte de menos peso de 12500 en TMR1L
movlw high ~.12500
movwf TMR1H ;Repone el TMR1 con el valor 12500.
bcf PIR1,TMR1IF ;Desconecta el flag del TMR1
retfie
;*****************************************************************************************
;Programa principal
Inicio clrf PORTA
clrf PORTB ;Borra salidas
bsf STATUS,RP0
bsf STATUS,RP1 ;Banco 3
movlw b'00000001'
movwf ANSEL ;RA0/AN0/C12IN0- entrada analógica, resto digitales
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;Banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b'11110001'
movwf TRISA ;RA3:RA1 salidas
bcf STATUS,RP0 ;Selecciona banco 0
movlw Tiempo
movwf Int_Cont ;Nº de interrupciones (10) para que transcurra 1 seg.
;Inicio de la pantalla LCD y visualiza mensaje inicial
call UP_LCD ;Configura E/S para el LCD
call LCD_INI ;Secuencia de inicio del LCD
movlw b'00001100'
call LCD_REG ;LCD On, cursor y blink Off
movlw Mens_0
call Mensaje ;Visualiza "Temp. ºC"
;Se activa el ADC y se selecciona el canal RA0/AN0. Frec. de conversión = Fosc/32.
bsf STATUS,RP0 ;Selecciona página 1
movlw b'10000000'
movwf ADCON1 ;Alineación dcha. Vref= VDD
bcf STATUS,RP0 ;Selecciona página 0
movlw b'10000001'
movwf ADCON0 ;ADC en On, seleciona canal RA0/AN0 y Fosc/32
;El TMR1 trabaja con oscilador interno y un preescaler de 1:8. Si se trabaja a una frecuencia
;de 4 MHz, el TMR1 deberá ser cargado con 12500 para que provoque interrupción al de 0.1s
;(12500 * 8 * 1 =100000uS=0.1")
bcf PIR1,TMR1IF ;Restaura el flag del Timer 1
bsf STATUS,RP0 ;Selecciona página 1
bsf PIE1,TMR1IE ;habilita interrupción del TMR1
bcf STATUS,RP0 ;Selecciona página 0
movlw low ~.12500
movwf TMR1L
movlw high ~.12500
movwf TMR1H ;Carga el TMR1 con el valor 12500.
movlw b'00110001' ;Selecciona reloj interno y preescaler de 8
movwf T1CON ;Habilita el TMR1
movlw b'11000000'
movwf INTCON ;Habilitación global de interrupciones
;Bucle principal
Loop nop
goto Loop ;Repetir la lectura
end ;Fin del programa fuente
/*El módulo convertidor ADC. Termómetro digital
Este ejemplo visualiza sobre la pantalla LCD la temperatura ambiente captada por el sensor LM35DZ
conectado con la entrada RA0/AN0 y cuya precisión es de 10mV/ºC. La resolución del convertidor
ADC, con una tensión de referencia de 5V, es de 0.00488. En estas condiciones cada ºC supone
dos incrementos en la salida del convertidor (0.00976V=10mV) aproximadamente. Es por ello que
al resultado de la conversión se le divide entre 2.
Se emplea el Timer 1 que provoca una interrupción cada 0.1 seg. Cunado se produzcan n interrupciones
se procede a tomar una muestra de la tempreatura. En este ejemplo se toman cada 1 segundo.
En este caso visualizamos en centígrados (ºC) y en Fahrenheit (ºF), donde (ºF = ºC*1.8+32)*/
#include <16f886.h>
/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */
#fuses NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT //Palabra 1 de configuración
#fuses NOWRT,BORV40 //Palabra 2 de configuración
/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */
#device ADC=10 //Conversor ADC/ de 10 bits de resolución
#use fast_io (A)
#use fast_io (B)
#use delay(clock=4000000) //Frecuencia de trabajo
#include <lcd4bitsPIC16.h> //Incluye funciones de manejo del LCD
#define Tiempo 10 //Nº de interrupciones de 0.1 seg. para tomar una muestra (p.e. 1 segundo)
int Int_Cont; //Contador de interrupciones
int16 Temperatura; //Variable con la temperatura medida
int Centigrados; //Variable con la medida en ºC
float Fahrenheit; //Variable con la medida en ºFahrenheit
/****************************************************************************************
Tratamiento de la interrupción que provoca el Timer 1 cada 0.1 seg. Espera a que se produzcan
tantas interrupciones como se indique en "Tiempo" para conseguir una temporización total determinada.
Inicia una conversión del canal seleccionado, realiza los cálculos apropiados y visualiza sobre el LCD*/
#int_timer1
tratamiento()
{
Int_Cont--;
if(Int_Cont==0) //Han pasado n interrupciones
{
lcd_gotoxy(10,1); //Coloca el cursor
Temperatura=read_adc(); //Inicia la conversión y lee el resultado (temperatura)
Centigrados=Temperatura/2; //Calcula los grados centígrados
Fahrenheit=Centigrados*1.8+32; //Calcula los grados Fahrenheit
printf(lcd_putc,"%2u",Centigrados); //Visualiza en grados centígrados
lcd_gotoxy(8,2); //Coloca el cursor
printf(lcd_putc,"%3.1f",Fahrenheit); //Visualiza en grados Fahrenheit
Int_Cont=Tiempo+1; //Repone el contador para otras 10 interrupciones (1 seg)
}
set_timer1(~12500); //Repone TMR1 con 12500
}
main()
{
delay_ms(50);
lcd_init(); //Inicia la pantalla LCD
printf(lcd_putc,"Temp.= %cC",0xdf); //Visualiza "Temp. ºC"
lcd_gotoxy(13,2);
printf(lcd_putc,"%cF",0xdf); //Visualiza "ºF"
Int_Cont=Tiempo+1; //Nº de interrupciones (10) para que transcurra 1 seg.
//Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
setup_adc(adc_clock_div_32); //Ajusta frecuencia de muestreo del ADC
setup_adc_ports(sAN0); //RA0 entrada analógica
set_adc_channel(0); //Selección del canal RA0/AN0
/*El TMR1 trabaja con oscilador interno y un preescaler de 1:8. Si se trabaja a una frecuencia
de 4 MHz, el TMR1 deberá ser cargado con 12500 para que provoque interrupción al de 0.1s
(12500 * 8 * 1 =100000uS=0.1")*/
set_timer1(~12500); //Carga TMR1 con 12500
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); //TMR1 ON y 1:8
enable_interrupts(int_timer1); //Activa interrupción del Timer1
enable_interrupts(global); //Habilita interrupciones
while(1)
{
}
}
hola que tal, existe algun sensor como el LM35 pero que llegue hasta los 240°C ? con el LM35 solo llega hasta 150°C y me queda corto, es que no quiero caer en la PT100 donde se complica demasiado el circuito, gracias !
Lo normal es por ejemplo a 25ºC = 250mV
¿Es posible aumentar el voltaje de referencia?
Quisiera poder tener voltajes de salida más altos..
He pensado en colocar uno o dos diodos entre pin3 y GND de tal forma de obtener un voltaje de salida como Vref+250mV cuando la temperatura es 25ºC
La primera opción que intente la obtuve desde el datasheet pag16, fig 26
http://www.ti.com/lit/ds/symlink/lm35.pdf pero sin suerte
Solo cambie 7V por 5V, ¿Será necesario mantener +7V?
gracias