PIC E LM35

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PIC E LM35

Mensagempor Pask » 03 Mai 2010 08:55

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?
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor rafael.wachter » 03 Mai 2010 09:36

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

:lol:
Avatar do usuário
rafael.wachter
Nibble
 
Mensagens: 89
Registrado em: 19 Nov 2008 13:12
Localização: no RS tchê

Mensagempor Pask » 03 Mai 2010 09:57

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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor rafael.wachter » 03 Mai 2010 10:13

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
Avatar do usuário
rafael.wachter
Nibble
 
Mensagens: 89
Registrado em: 19 Nov 2008 13:12
Localização: no RS tchê

Mensagempor Pask » 03 Mai 2010 10:21

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?
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor rafael.wachter » 03 Mai 2010 10:40

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
Avatar do usuário
rafael.wachter
Nibble
 
Mensagens: 89
Registrado em: 19 Nov 2008 13:12
Localização: no RS tchê

Mensagempor marcelo campos » 03 Mai 2010 11:20

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');

}
marcelo campos
Word
 
Mensagens: 648
Registrado em: 08 Ago 2009 08:37

Mensagempor marcelo campos » 03 Mai 2010 11:31

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');

}
marcelo campos
Word
 
Mensagens: 648
Registrado em: 08 Ago 2009 08:37

Mensagempor tcpipchip » 03 Mai 2010 13:11

Foi otimo citar os creditos!
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor _blackmore_ » 03 Mai 2010 14:17

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!
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor Pask » 03 Mai 2010 15:16

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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor MOR_AL » 03 Mai 2010 17:03

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor ÁgioFelipe » 30 Jun 2010 12:31

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.
ÁgioFelipe
Word
 
Mensagens: 626
Registrado em: 27 Out 2006 20:04

Mensagempor Silvio51 » 30 Jun 2010 13:07

Á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....
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil

Mensagempor ÁgioFelipe » 30 Jun 2010 17:41

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.
ÁgioFelipe
Word
 
Mensagens: 626
Registrado em: 27 Out 2006 20:04

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x