Página 1 de 2
PIC E LM35

Enviado:
03 Mai 2010 08:55
por Pask
Amigos, usando o pic para ler a temperatura do sensor LM35, somente se consegue a leitura correta dividindo-se o valor lido pelo A/D por 2. Caso contrário, o valor indicado é sempre o dobro do valor lido.
Por exemplo: Se o LM35 estiver lendo uma temperatura de 5ºC, a tensão de saída será 50mV.
Trabalhando com o A/D de 10 bits do PIC, o menor nível de tensão com o qual ele pode trabalhar é 4,88mV, pois 5 / 1024 = 4,88mV.
50mV é maior do que 4,88mV. Então para uma tensão de entrada de 50mV, o valor digital correspondente gerado pelo A/D será de:
(0,05 * 1023) / 5 = 10,23 ou 0x10 digital em base hexadecimal.
Agora eu pergunto: porque o valor apresentado é o dobro do valor lido se a resolução do PIC abrange este range de medição?

Enviado:
03 Mai 2010 09:36
por rafael.wachter
O valor lido não vai ser a temperatura real, vai ser uma escala
o PIC faz leituras de 0 á 5V
no momento que sair 5V do LM35 vc tem 500°C
5V/10mV=500°C
a escala do AD do PIC eh:
5V - 1023
0V - 0
então vc tem:
500°C - 1023
x°C - valor lido pelo AD
fazendo a famosa regra de 3
se vc ler o valor 10, vc tem 4.88°C
e se tivesse precisão decimal, lendo 10,23 teria os seus 5°C


Enviado:
03 Mai 2010 09:57
por Pask
Sim. Mas, esses cálculos que você fez apenas comprovam a teoria de funcionamento do A/D. São cálculos corretos mas são apenas algebrismos.
Eu ainda gostaria de uma explicação sobre a razão de ter que se dividir o valor lido pelo A/D por 2 para se ter o valor correto da leitura da temperatura do LM35.
Vejamos: a menor tensão analógica que o AD pode ler é 4,88mV que corresponde ao valor digital 0,00488 * 1023 / 5 = 1 decimal.
Teoricamente, ao ler este valor de tensão o valor digital convertido teria que ser exatamente 1.
Então, ao ler qualquer outro valor analógico acima deste, o valor digital correspondente deveria ser lido normalmente sem a necessidade de adequações matemáticas para indicar o valor correto.

Enviado:
03 Mai 2010 10:13
por rafael.wachter
Isso é feito justamente para vc ter precisão, os microcontroladores não trabalham com tipos float nativamente
se ele te entregasse 1 para 1°, 2 para 2°, 3 para 3°,.......
qdo vc precisasse ler uma temperatura 5° e 6° por exemplo, vc não conseguiria.
a razão de vc achar a temperatura dividindo-se o valor por dois é q a cada grau celcius vc tem 10mV a mais no sensor e a cada 10mV a mais, vc tem 2 a mais no valor do AD (10mV/4,88mV=2,04)
então vc pegando qualquer valor na conversão e dividir por dois acha a temperatura aproximada
é uma relação entre as duas

Enviado:
03 Mai 2010 10:21
por Pask
Basicamente, o que você está tentando dizer é que o valor digital precisa ser arredondado para que a conversão seja feita. Então, o que o conversor do PIC faz é arredondar os valores digitais que são reais (float) para valores inteiros como você disse, pois ele não consegue reconhecer números tipo ponto flutuante. Estou certo?

Enviado:
03 Mai 2010 10:40
por rafael.wachter
Não seria bem um arrdondamento o q o PIC faz, pq se tiver 10,9(calculado) por exemplo, ele não vai arredondar para 11 e sim vai cortar a parte decimal ficando 10
É uma escala, a cada 4,88mV na entrada ele incrementa 1 no valor
Se a entrada tiver uma variação menor q isso, 3mV por exemplo, o valor convertido não muda
Uma ideia mais facil de entender é vc visualisar o conversor AD como um contador
- Aumenta 4.88mV -> mais um no contador
- Diminui 4.88mV - menos um no contador

Enviado:
03 Mai 2010 11:20
por marcelo campos
tenho uma abordagem prática no código abaixo, que já também separa cada dígito pra locar no LCD e nos displays de 7 segmentos do PIC CUBE:
- Código: Selecionar todos
void Le_Temperatura () {
// da sub Le_Temperatura
unsigned char ch;
unsigned int adc_rd;
long tlong;
char *text;
adc_rd = ADC_Read(0); // get ADC value from 2nd channel : AN1 / RA1
LCD_Out(2,1,text); // print string a on LCD, 2nd row, 1st column
tlong = (long)adc_rd * 5000; // covert adc reading to milivolts
tlong = tlong / 1023; // 0..1023 -> 0-5000mV
ch = tlong / 1000; // extract volts digit
LCD_Chr(2,8,48+ch); // write ASCII digit at 2nd row, 9th column
ch = (tlong / 100) % 10; // extract 0.1 volts digit
LCD_Chr_CP(48+ch); // write ASCII digit at cursor point
Temp_Dez = ch; // armazena MSB temp pra monstrar 7 segmentos
ch = (tlong / 10) % 10; // extract 0.01 volts digit
LCD_Chr_CP(48+ch); // write ASCII digit at cursor point
Temp_Uni = ch; // armazena MSB temp pra monstrar 7 segmentos
LCD_Chr_CP(',');
ch = tlong % 10; // extract 0.001 volts digit
LCD_Chr_CP(48+ch); // write ASCII digit at cursor point
LCD_Chr_CP(' ');
LCD_Chr_CP('o');
LCD_Chr_CP('C');
}

Enviado:
03 Mai 2010 11:31
por marcelo campos
desculpe esqueci de colocar na minha mensagem acima: créditos à este código ao pessoal da Mikroeletronica, ao qual só adaptei as necessidades.
Abraço
marcelo campos escreveu:tenho uma abordagem prática no código abaixo, que já também separa cada dígito pra locar no LCD e nos displays de 7 segmentos do PIC CUBE:
- Código: Selecionar todos
void Le_Temperatura () {
// da sub Le_Temperatura
unsigned char ch;
unsigned int adc_rd;
long tlong;
char *text;
adc_rd = ADC_Read(0); // get ADC value from 2nd channel : AN1 / RA1
LCD_Out(2,1,text); // print string a on LCD, 2nd row, 1st column
tlong = (long)adc_rd * 5000; // covert adc reading to milivolts
tlong = tlong / 1023; // 0..1023 -> 0-5000mV
ch = tlong / 1000; // extract volts digit
LCD_Chr(2,8,48+ch); // write ASCII digit at 2nd row, 9th column
ch = (tlong / 100) % 10; // extract 0.1 volts digit
LCD_Chr_CP(48+ch); // write ASCII digit at cursor point
Temp_Dez = ch; // armazena MSB temp pra monstrar 7 segmentos
ch = (tlong / 10) % 10; // extract 0.01 volts digit
LCD_Chr_CP(48+ch); // write ASCII digit at cursor point
Temp_Uni = ch; // armazena MSB temp pra monstrar 7 segmentos
LCD_Chr_CP(',');
ch = tlong % 10; // extract 0.001 volts digit
LCD_Chr_CP(48+ch); // write ASCII digit at cursor point
LCD_Chr_CP(' ');
LCD_Chr_CP('o');
LCD_Chr_CP('C');
}

Enviado:
03 Mai 2010 13:11
por tcpipchip
Foi otimo citar os creditos!

Enviado:
03 Mai 2010 14:17
por _blackmore_
Estes numeros quebrados ajudam a piorar tudo ...
Por sugestão do MOR_AL, eu utilizei uma tensão de referencia de 5,115volts (chato de conseguir viu) mas que deu muito certo, pois dividindo 5,115volts pelos 1023 dá exatamente 0,005V ... e como o LM35 trabalha até 150ºC ... ficou tudo em casa!!
abrax!

Enviado:
03 Mai 2010 15:16
por Pask
Realmente essa sugestão do Mor_Al é interessante mesmo. Boa idéia.
Uma maneira interessante e até prática de se conseguir a tensão de 5,115V seria a seguinte: pega-se um regular 7805 e liga-se um diodo ao seu pino central e à massa do circuito para elevar a sua tensão de saída para 5,6V. Anodo no regulador e catodo à massa.
A partir disto, toma-se a tensão em seu pino 3 de saída, e joga-se num divisor resistivo de tensão formado por um resistor fixo superior e um trimpot multivoltas inferior. Do pino central do trimpot retira-se a tensão de 5,115V sugerida pelo Mor-Al. O resistor fixo e o trimpot devem ser escolhidos criteriosamente para que o ajuste permita alcançar este valor de forma suave e fácil.
Pode-se simular tal circuito para se chegar a valores ideais para esses componentes.

Enviado:
03 Mai 2010 17:03
por MOR_AL
Pessoal.
Pode-se também fazer o seguinte:
1 - Só precisamos de 151 valores diferentes. De 0ºC até 150ºC. Um CAD com 8 bits seria suficiente, pois temos 256 valores, ou 255 intervalos.
2 - Se o valor numérico do resultado da conversão fosse o valor numérico da temperatura, então seria uma relação direta.
Como fazer?
3 - Vamos aproveitar apenas os 8 bits mais significativos do resultado da conversão. Então jogamos os dois bits menos significativos fora. Isso equivale a dividir o resultado da conversão por 4. Então, de 1024 valores, passaremos para 256 valores (255 intervalos). Desses 256 valores usaremos apenas 151 (0,1,2,...,149,150).
Queremos que cada 10mV gerado pelo LM35 corresponda a uma variação adjacente do CAD. Por exemplo: De 43ºC para 44ºC, ou de temperatura até temperatura mais 1ºC.
Se o valor máximo do CAD passou a ser 255, então a nova tensão de referência será 10mV * 255 = 2,55V
Com essa tensão de referência, o resultado da conversão divididos por 4, será o próprio valor da temperatura.
Se quizermos sofisticar um pouco mais e fazer um arredondamento, ou aproximação para o inteiro mais próximo, observa-se o valor dos dois bits menos significativos da conversão. Aqueles que serão descartados. Se seu valor for 0 ou 1, então o valor da temperatura não deve ser corrigido. Se o valor for 2 ou 3, então deve-se acrescentar uma unidade à temperatura.
Com esse artifício não é necessário conseguir-se uma tensão maior que 5V. Basta colocar um divisor resistivo com um potenciômetro entre eles, e ajustar-se a tensão de referência para 2,55V. Por exemplo: de Vcc (5V) para 4k7ohms, para potenciômetro de 1k ohms, para 4k7 ohms e para o terra. O pino móvel do potenciômetro para o pino VRef do PIC. Se desejar melhorar ainda mais um pouco, acrescente um capacitor eletrolítico de 10uF na entrada de VRef. Isso acrescenta um filtro passa-baixas frequências com a frequência de corte (-3dB) em cerca de 3Hz.
MOR_AL

Enviado:
30 Jun 2010 12:31
por ÁgioFelipe
Pessoal, estou tendo problemas em mostrar o valor da temperatura no LCD, coloquei uma taxa de atualização do display de 60 vezes por segundo ai ele mostra a temperatura só mudando, não fica parado com um único valor. Estou usando somente 1 casa decimal, tipo:
27,5
Valeu.

Enviado:
30 Jun 2010 13:07
por Silvio51
ÁgioFelipe escreveu:Pessoal, estou tendo problemas em mostrar o valor da temperatura no LCD, coloquei uma taxa de atualização do display de 60 vezes por segundo ai ele mostra a temperatura só mudando, não fica parado com um único valor. Estou usando somente 1 casa decimal, tipo:
27,5
Valeu.
Neste tipo de projeto, é interessante fazer o seguinte: Após todas as leituras e cálculos feitos, salva-se todas as variáveis em um rascunho e escreve no LCD. Após a próxima leitura, compara-se o valor atual com o armazenado anteriormente... se forem iguais, näo escreve no LCD. Assim evitase que fique escrevendo direto no LCD e o valor fique piscando...
ps: Eu näo sei quanto ás outras informa;cöes que vocë coloca no LCD, mas para temperatura dificilmente eu atualizo mais de uma vez por segundo... no máximo duas vezes por segundo já basta... 60 vezes é f.... haja stresse no LCD....

Enviado:
30 Jun 2010 17:41
por ÁgioFelipe
compara-se o valor atual com o armazenado anteriormente... se forem iguais, näo escreve no LCD.
Já estou fazendo isso sim, mas acontece que fica mudando a casa decimal a todo momento e faz ele piscar.
Já vi tb umas coisas de tipo fazer a média de várias leituras.