Página 1 de 2
Sensor LM35 Lento

Enviado:
16 Mar 2009 20:25
por antonio
Pessoal tudo bem!!
Pessoal fiz um programa para o sensor LM35 em C ,depois de varias ajudas sempre funciona,embora não seja 100% o negocio eh seguinte !
Quando foi para fazer os testes ,fiz em varios locais de temperatura e notei que se o sensor era lento na atualização da temperatura, ou seja;
se eu estou num local que tem uma temperatura de 10graus celsios, e depois vou para outro local onde a temperatura eh 22graus celsios demora 15 minutos na atualização ,ou seja a passar dos 10graus para os 22graus , isto è normal para este sensor ,ou tem algumacoisa errado ??
Eu notei porque tenho aqui um sensor de temperatura comercial e esse em segundos faz atualizaçao em 10 a 15 segundos !
Desde jah agradeço a força!!
Um abraço
O codigo e o seguinte!
#include "16f877A.h"
#device adc=8 //Usa 8 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#include<lcd.c>
#use standard_io (D)
#use standard_io (b)
//#use fast_io (B)
void main (void)
{
int medi;
float temper,i;
// set_tris_b (0x00);
lcd_init(); //Inicia LCD
lcd_putc(" Digital\n"); //Saca texto
lcd_putc(" Termometer"); //Saca texto
delay_ms(300);
lcd_putc("\f"); //Limpia
delay_ms(100);
lcd_gotoxy(14,2); //Acomoda cursor LCD
lcd_putc("oC");
while (1)
{
lcd_gotoxy(8,2); //Acomoda cursor LCD
lcd_putc(" "); //Limpa
setup_adc (adc_CLOCK_INTERNAL); //acende ADC
setup_adc_ports (RA0_RA1_ANALOG_RA3_REF);
set_adc_channel (0); // canal a medir RA0
delay_us (20);
medi=read_adc (); // converçao AD
setup_adc (adc_off); //Apaga ADC
temper=medi*0.7843; //Passa binario a °C
printf(lcd_putc,"%03.1f",temper); //xxx.x °C
delay_ms (300);
if(temper>=25.5)
output_low(PIN_D1);
else
output_high(PIN_D1);
}
}

Enviado:
17 Mar 2009 08:19
por fabim
Olá.
Olha eu uso o LM35 em algumas aplicações home-app..
O tempo de constante termica, é diretamente proporcional a quantidade de ar do local e no que ele está tocando.
Eu utilizo ele em contato com uma chapinha de 2X2CM e com pasta termica.
O tempo de atualizaçao dele é de alguns segundos utilizando desta forma, ele nú no meio a ser medido provavelmente é um pouco maior, mais não coisa de minutos.
E mais uma coisa, na sua rotina do main, você esta jogando a temperatura constantemente no display, isso pode criar aquela mala de casa variante no final da temp.
Experimente criar uma decisão, que caso a nova medida diferente da anterior atualiza display, se igual, não atualiza.
fabim

Enviado:
17 Mar 2009 10:10
por antonio
E mais uma coisa, na sua rotina do main, você esta jogando a temperatura constantemente no display, isso pode criar aquela mala de casa variante no final da temp.
Experimente criar uma decisão, que caso a nova medida diferente da anterior atualiza display, se igual, não atualiza.
************************************************************
Ola Fabim tudo bem!!
Agradeço sua ajuda...!
Quanto a chapa para o sensor è realmente uma boa edeia e jah esta a ser tratada da mesma !
Vc falou na rotina principal MAIN que eu estou jogando a temperatura constantemente no display ,pois vc tem razão ,mas olha nao sei fazer outro jeito ! desculpa por minha ignorancia!!
Caso vc poder mais um jeito nessa decisão agradeço !
Desde Ja agradeço

Enviado:
17 Mar 2009 11:56
por msamsoniuk
coloca um delay e atualiza 1x por segundo o lcd.
Re: Sensor LM35 Lento

Enviado:
17 Mar 2009 15:13
por fabim
De uma olhadinha nos meus comentários, e observe sobre comparação para nova atualização.
antonio escreveu:
#include "16f877A.h"
#device adc=8 //Usa 8 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#include<lcd.c>
#use standard_io (D)
#use standard_io (b)
//#use fast_io (B)
void main (void)
{
int medi=0, oldmedi=0;
float temper,i;
// set_tris_b (0x00);
lcd_init(); //Inicia LCD
lcd_putc(" Digital\n"); //Saca texto
lcd_putc(" Termometer"); //Saca texto
delay_ms(300);
lcd_putc("\f"); //Limpia
delay_ms(100);
lcd_gotoxy(14,2); //Acomoda cursor LCD
lcd_putc("oC");
// estes tres parametros não precisam ficar no loop
// claro neste caso, pois uma vez configurados se matem
// e você não esta utilizando por enquanto outras portas AD
// nem tão pouco esta mechendo nas configurações
setup_adc_ports (RA0_RA1_ANALOG_RA3_REF);
setup_adc (adc_CLOCK_INTERNAL); //acende ADC
set_adc_channel (0); // canal a medir RA0
while (1)
{
delay_ms (1000); // média de leitura de 1S
lcd_gotoxy(8,2); //Acomoda cursor LCD
lcd_putc(" "); //Limpa
medi=read_adc (); // le o canal AD
setup_adc (adc_off); // caramba qual compilador esta utilizando?
// e pra que isso aqui ?
if(medi != oldmedi){ // se diferente da medida anterior
oldmedi = medi; // então oldmedi = novo valor
temper=medi*0.7843; //converte para float "0.7843 ???"
printf(lcd_putc,"%03.1f",temper); //xxx.x °C // printf?
}
if(temper>=25.5)
output_low(PIN_D1);
else
output_high(PIN_D1);
}
}

Enviado:
17 Mar 2009 17:11
por antonio
Ola Fabim tudo bem !!
Agradeço teu apoio, bem eu jah estava a prever que alguma coisa não estava certo!!
Cara!.. aqui (temper=medi*0.7843; //converte para float "0.7843 ???") eh a resolução, ou seja como eu estou usando a Vref+ 2V e estou usando o AD para 8bits
Então 200mV/255=0.7843....Certo ou errado ?? caso errado por favor me ajuda !!
Não tenho certeza se esta certo,mas por o que andei lendo menso que sim!
Fabim mais uma vez agradeço
Um abraçO

Enviado:
17 Mar 2009 17:26
por fabim
qual sua tensão no pino Vref ?
Lembre-se que ele esta medindo em 10 bits e não 8!!
fabim

Enviado:
17 Mar 2009 17:37
por antonio
Ola Fabim!
A tensão no pino Vref+ eh de 2V!!
Não..! esta medindo em 8bits olha aqui..,
#include "16f877A.h"
#device adc=8 //Usa 8 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect

Enviado:
17 Mar 2009 19:07
por fabim
antonio escreveu:Ola Fabim!
A tensão no pino Vref+ eh de 2V!!
Não..! esta medindo em 8bits olha aqui..,
#include "16f877A.h"
#device adc=8 //Usa 8 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
então faz o seguinte.
#device adc=10 //Usa 10 bits
caso contrario não faz sentido você criar uma varivel de 16bits "int" se vai ler apenas 8.
fica assim ó.
temper=medi*(2000.00/1024); // res = 0,001953125V.
// lembrando que o LM35 = 0.010V°C...
// em valor binario vai ser = a 6 bits°C
// se você medir por exemplo 27°C = 270mV +/- 10mV.
// 0.270V div "valor passo 0,001953125V. " = 138~ << valor para 270mV
138 * (2000.00/1024) = 269,53125 <<look
preciso terminar ?
fabim

Enviado:
17 Mar 2009 19:36
por antonio
Fabim..jah fiz tudo como vc falou ,dah uma olhada se esta tudinho certo?
Estou a comparar aqui a temperatura da minha montagem com um sensor comercial ,...e tah uma diferenca de quase 1grau !
Vc que tem trabalhado com o LM35 sabe a razão que isto acontece?
o codigo!
Um abraço
#include "16f877A.h"
#device adc=10 //Usa 8 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#include<lcd.c>
#use standard_io (D)
#use standard_io (b)
//#use fast_io (B)
void main (void)
{
int medi,oldmedi=0;
float temper,i;
// set_tris_b (0x00);
lcd_init(); //Inicia LCD
lcd_putc(" Digital\n"); //Saca texto
lcd_putc(" Termometer"); //Saca texto
delay_ms(300);
lcd_putc("\f"); //Limpia
delay_ms(100);
lcd_gotoxy(14,2); //Acomoda cursor LCD
lcd_putc("oC");
setup_adc_ports (RA0_RA1_ANALOG_RA3_REF);
setup_adc (adc_CLOCK_INTERNAL); //acende ADC
set_adc_channel (0); // canal a medir RA0
while (1)
{
delay_ms (1000); // média de leitura de 1S
lcd_gotoxy(8,2); //Acomoda cursor LCD
lcd_putc(" "); //Limpa
medi=read_adc (); // converçao AD
if(medi != oldmedi){ // se diferente da medida anterior
oldmedi = medi; // então oldmedi = novo valor
temper=medi*(2000.00/1024); // res = 0,001953125V
printf(lcd_putc,"%02.1f",temper); //xxx.x °C
}
if(temper>=25.5)
output_low(PIN_D1);
else
output_high(PIN_D1);
}
}

Enviado:
17 Mar 2009 20:53
por fabim
bom, 1°!!
Olhe o datasheet do LM35.. ele diz +/-1°C...
o bom 2°!!
Estes 2V são 2V mesmo ?
ou tipo 1.952 ou 2.125 ou quem sabe 2.085 ?? eim eim ??
o bom 3°!!
remenber !! de não esquecer do bom 2°, e olhe o bom 1°!!
faz o seguinte, pega um multimetro de alta impedância que tenha escala de medição de mV.
meça a tensão que esta saindo do LM35 e confira com o valor mostrado.
meça também este valor de referencia de 2V "o bom 2°"
coloque os resultados aqui.
obs. ja ia me esquecendo.
Dependendo do compilador, quando você da o comando de leitura de AD.
suponha que o valor de tensão é de exatos 200mV e a tensão de passo do ad é de 2mV.
O resultado do valor do ad é de 100 né ?
Não o valor é 101..
Porque o comparador do AD passa 1 acima do valor que está na porta analogica, isto para que o comparador do AD saiba que ele ja acabou a leitura.
Alguns compiladores devolvem o valor de leitura -1, e outros não..
experimente também, fazer a leitura do AD e subtrair 1 da leitura...
abraços
fabim

Enviado:
18 Mar 2009 04:41
por antonio
Fabim tudo blz!!
1°..sim vendo o datasheet acho que para o LM35DZ que eh esse que estou usar eh de +/-05°C , no data esta um pouco confuso pra mim!
2°.. na entrada do Vref+ foi medido com o multimetro os 2 volts certos. eu tenho um potencimetro de 1K entre o (+ e o -) e a saida (centro)para o AD e calibrado com o multimetro!
Nota!..eu depois para calibrar depois com um sensor de temperatuar comercial rodei um pouco esse pot.e agora esta no 2.13V e a temperatura ficou mais proximo da temperatura que mostra o sensor comercial !! não sei se isto eh coreto e se tem algumas anormalias em outras leituras !!
3°.. Medindo a saida do sensor em Vout. neste momento esta com 248mV que no meu ver devia mostrar no LCD 24.8°C certo ou errado?
4°..quanto fazer a leitura do AD e subtrair 1 da leitura sinceramento estou com duvida como pode sair,...serà isto..temper=medi*(2000.00/1024)-1; ??
5°.. o sensor vai ficar +/- 1 metro de distancia do Pic qual eh o cabo mais aconselhado para esta aplicação? devido a distancia eh preciso ter algum cuidado com a blindagem?
Fabim mais uma vez agradeço seu apoio!!
Um abraço

Enviado:
18 Mar 2009 13:18
por fabim
hum bem estranho isso.
Observe.
2.180V / 1024 = 0,00212890625 V
0,00212890625 = tensão por 1 do ADC, ou seja tensão de passo.
0.248V / 0,00212890625 = 116,49174311926605504587155963303
o ADC vai capturar o valor 116, e não 116.dizima
116 * 0.00212890625 = 0,246953125 observe que ele perdeu uma certa resolução.. pois a leitura do ADC pegou apenas 116, e perdeu as dizimas..
só aí ja da pra você sentir o erro né ?
se você agora fazer uma conversão inplicita.
int a
a = 0,246953125 *1000// observe o 4° digito
a então = 246,953125 certo ? o compilador sabe que a=int, se 4° digito passou de 0.5 ele arredonda.
247 ou 24.7°C.
Entendeu ? dependendo da aplicação é necessario um AD com valor maior do que 10bits..
mais não adianta nada colocar um 12bits para um LM35...
Eu pessoalmente só trabalho com 12bits e ref de 4.096V.
Mais dependendo do caso, utilizo 2.5Vref
fabim

Enviado:
18 Mar 2009 13:28
por antonio
Fabim !
eu entendo sim o seu raciocinio,mas comigo não vai !
Cara..! o sensor vai ficar +/- 1 metro de distancia do Pic qual eh o cabo mais aconselhado para esta aplicação? devido a distancia eh preciso ter algum cuidado com a blindagem?
bem depois de estas ajudas reta-me só agradeçer !
Um abraço

Enviado:
18 Mar 2009 13:40
por fabim
hehen tõin..
compra um cabo stéreo.
2 vias + blindagem.
e na entrada do pino do pic.
Você coloca um resistor de uns 4.7K e um capacitor de tipo 1uF..
e bem proximo do LM, você solda entre VDD e GND, um capacitorzinho de poliestes de uns 10nF, só por gatantia!!
ja era!!
fabim