segunda-feira, 20 de dezembro de 2010

Termometro LM35 com LCD


Olá a todos, após um período conturbado (devido aos vestibulares de final de ano) estou de volta, e com mais um projeto interessante, e de fácil montagem, em que novamente iremos utilizar um microcontrolador PIC da Microchip, e a linguagem C, e o compilador CCS.
Trata-se de um termometro, que irá exibir a temperatura em graus Celsius em um display LCD 16x2.
O sensor utilizado para medir a temperatura foi o LM35, (clique para ver seu datasheet).
Nosso projeto exibe temperaturas de 0° a 150°C.
A novidade neste projeto é que o hardware/firmware foi desenvolvido para 3 microcontroladores diferentes:
PIC16f877a (figura acima)
PIC16f688
PIC16f819
Sendo que cabe a você leitor escolher o que for mais conveniente, o arquivo compactado (que encontra-se no final desta postagem), contêm 3 sub-diretorios contendo os arquivos, cada um desses diretorios têm o nome do PIC que foi usado.

O LM35 apresenta saída analógica, em que sua corrente varia correspondendo a variação de temperatura, para ler este sinal AD, utilizamos o ADC (Conversor Analógico Digital) interno do PIC, que irá converter está tensão AD em um nível binário correspondente.
Vamos trabalhar em cima do PIC16f877a.Ele possui um conversor AD de 10bits, estes bits representam a resolução do conversor, quanto mais bits, mais preciso será.
Nos ADC usamos uma tensão de referência (Vref) que servirá como escala, ou seja o as saídas do ADC estaram em 1 quando a tensão de entrada for maior ou igual a tensão Vref.
Mas como na saída do ADC temos um valor binario proporcional a tensão AD e não o próprio valor, usamos a técnica conhecida como escalonamento para encontrar o valor da saída do ADC.
Para exemplificar o funcionamento do ADC usarei a resolução do PIC16f877a (10bits), e a tensão de referência sendo os 5V da alimentação, com isso temos que:
Vsaída=Vref/resolução-1 == 5/2^10-1=4,887...mV.
Por exemplo para um valor de 200 em decimal, teremos 200 *4,887mV=0,9774V.

Quando desenvolvemos um firmware com ADC, devemos informar ao compilador qual é a resolução do PIC, fazemos isso através desta diretiva:
#device adc=10 // Configura conversor AD

Além disso, na função principal (main) devemos configurar o ADC, efetuando os seguintes comandos:
setup_adc_ports(ra0_analog); // Define pino a0 como entrada analógica
setup_adc(adc_clock_internal); // Usa clock interno
set_adc_channel(0); // Seleciona canal de 0

O primeiro define os pinos que serão usados como entradas analógicas, o segundo define o clock do ADC, e o terceiro seleciona o canal do ADC (no caso o 0, que corresponde ao pino A0 do PIC) que deve ser trocado caso deseje efetuar a leitura de outro sensor ligado a outro pino.

Para armazenar o valor analógico usamos neste caso variaveis de 16bits, já que o ADC é de 10bits de resolução.
int16 valor,temp; // Para guardar temperatura
A primeira irá armazenar o valor AD, e a segunda o valor AD convertido em graus Celsius.

Quando queremos ler o ADC devemos usar a seguinte diretiva, que irá passar o valor AD para a variavel "valor".
valor=read_adc(); // Guarda valor lido em valor
Lembrando que antes da leitura AD é necessário usar algum comando de atraso (delay), para estabilizar o ADC, no nosso caso 50ms, mas poderia ser menos, só que no nosso projeto o tempo não é primordial.

Por fim, falaremos dos comandos de conversão do valor AD para graus Celsius:
if(valor) valor+=1;
temp = valor*4 + (valor * 113)/128;

temp=temp/10;
Estes são os comandos usados para transformar a leitura AD em °C.

Após isso, o resto do programa não é segredo dos leitores do eletronicaffa, já que trata-se das rotinas para display LCD.
Junto com os anexos do projeto, encontra-se também o fluxograma resumido do projeto, feito com o Microsoft Visio.

Qualquer dúvida entrem em contato comigo:
rafaelvarago@yahoo.com.br
Os arquivos encontram-se no meu disco virtual com o seguinte nome:"Termometro LM35 (LCD).0.rar", e devem ser descompactados com WinRar ou semelhante.
Download Termometro LM35 e LCD

4 comentários:

  1. Dei uma olhada no prog do 819 e pela quantidade de memória gasta acho que dá para rodar no 818...
    Depois te dou um retorno,
    abçs

    ResponderExcluir
  2. É provavel que rode sim, eu tive que usar o 819 pois era exigência do projeto.
    Eu não posso afirmar que irá rodar, pois este é um projeto meu um tanto antigo, hoje por exemplo nem uso mais o CCS (raras exceções) trabalho mais com o Hi-tech C e C18.
    Mas obrigado por visitar o blog, qualquer dúvida entre em contato.

    Rafael Varago de Aguiar.

    ResponderExcluir
  3. mano se eu gravar com seu hex sem mecher em nada, da certo ou tenho que configurar algo ?

    ResponderExcluir