Medindo Temperatura com PIC e LM35

 

Bom, estarei explicando aqui como medir temperatura com um PIC 16F877A e um LM35, um sensor de temperatura analógico.

Estaremos usando um PIC16F877A, um sensor de temperatura LM35 e um console serial virtual. Iniciaremos configurando o PIC no CCS C.


Configuramos o PIC para rodar a 4MHz e usar Ponteiros de 16Bit, isto é necessário para que possamos usar toda memoria ram disponível. Neste projeto não usaremos nada da memoria ram, mas costumo deixar ativado para usar. Próximo passo configurar o Conversor Analógico Digital do PIC:

 



Configuramos ele para usar a porta analógica A0, para ter uma resolução de 1024 bits e para usar o clock interno do ADC. Configurado tudo, podemos clicar Ok e veremos o código do programa já.



Feito isso podemos começar o circuito no simulador. Abrindo o simulador e colocando o LM35 podemos reparar na tensão que ele fornece para determinada temperatura:



Podemos reparar, que o LM35 fornece 1mV por grau célsius. Esta informação pode ser conferida no data sheet do LM35. Teremos então de fazer o PIC contar 1ºC para cada milivolt. Adicionaremos então o PIC e o Console Virtual.


Ligaremos todo circuito conforme a figura. Não estamos considerando partes essenciais para o funcionamento real do PIC, como o cristal e a alimentação, pois isto é apenas uma simulação.

Configure o PIC16F877A para rodar a 4MHz e selecione o arquivo do programa (main.hex) que estamos usando (entre no compilador e aperte F9 para compilar o código).

Definiremos então agora as variáveis que iremos usar no programa.

Usaremos três variaveis:

tensao => Long Integer

temperatura => Long Integer

temporario => Float



Essas três variáveis serão usadas no decorrer do programa, onde tensao armazenara o valor o qual obteremos do ADC (tensão em binário), temporario iremos usar para armazenar o resultado do cálculo que faremos para descobrir a tensão em volts, e temperatura onde iremos armazenar o valor da temperatura.

Para definirmos essas variaveis, teremos de colocar o seguinte trecho de código antes da seção void main()

long int tensao,temperatura;

float temporario;



Após isso teremos de criar o loop que irá ler o valor do ADC, fazer os cálculos e mandar para o console serial. Primeiro faremos a leitura do seguinte modo:

while(true) {

SET_ADC_CHANNEL(0); // Acertar o canal do ADC para o A0

delay_ms(10); // Esperar 10ms

tensao = READ_ADC(7); // Iniciar ADC e ler o conteúdo para variável tensao

printf("Tensao %u “, tensao); // Mandar conteudo da varíavel para o console.

delay_ms(1000); // Esperar 1 segundo.

}

Compilando este programa, iremos obter o seguinte resultado:

Para 30ºC:


Para 35ºC:



Como pudemos observar, conseguimos o valor em binário da tensão. Logo precisamos converter isso. Isto é bem simples:

Configuramos o ADC para uma resolução de 1024 bits, e a tensão do ADC é a mesma do que o PIC, logo 5V. Para sabermos quantos volts por bit o ADC lê, basta dividirmos 5 por 1024.

5 / 1024 = 0,0048828125

Ou seja, 0,0048828125 volts por bit. Numero quebrado não? Não tem problema, para isso criamos a variável temporario com tipo float. Float significa que a variável terá uma virgula e números após ela.

Bom já sabemos agora quantos Volts por Bit, e agora para sabermos a temperatura? Bem é simples. Basta dividir a tensão por 0,01 (1mV por ºC) e teremos a temperatura:

62 * 0,0048828125 = 0,302734375 / 0,01 = 30,2734375 ºC arrendondando 30ºC

72 * 0,0048828125 = 0,3515625 / 0,001 = 35,15625 ºC arredondando 35ºC

Tudo certo? Então vamos a programação! Parece complicado, mas é realmente simples, aqui vai como fica nosso trecho de código:



while(true) {

SET_ADC_CHANNEL(0); // Acertar o canal do ADC para o A0

delay_ms(10); // Esperar 10ms

tensao = READ_ADC(7); // Iniciar ADC e ler o conteúdo para variável tensao

temporario = tensao * 0.0048828125; // Calculo para descobrir quantos volts o pic mediu.

temperatura = temporario / 0.01; // Calculo para descobrir a temperatura.

printf("\fTemperatura: %Lu \n", temperatura); // Mostrar a temperatura no console.

delay_ms(1000); // Esperar 1 segundo

}



Simples não? Poderiamos simplificar e fazer tudo junto:

temperatura = tensao * 0.0048828125 / 0.01;

ou até mesmo:

temperatura = tensao * 0.48828125;



Vejamos o resultado então:

Viu como é simples? Aqui está o código completo para caso você não tenha conseguido fazer funcionar:



#include "D:\Program Files (x86)\PICC\Projects\temp\main.h"



long int tensao,temperatura;

float temporario;

void main()

{



setup_adc_ports(AN0);

setup_adc(ADC_CLOCK_INTERNAL);

setup_psp(PSP_DISABLED);

setup_spi(SPI_SS_DISABLED);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

setup_timer_1(T1_DISABLED);

setup_timer_2(T2_DISABLED,0,1);

setup_comparator(NC_NC_NC_NC);

setup_vref(FALSE);



while(true) {

SET_ADC_CHANNEL(0);

delay_ms(10);

tensao = READ_ADC(7);

temporario = tensao * 0.0048828125;

temperatura = temporario / 0.01;

printf("\fTemperatura: %Lu \n", temperatura);

delay_ms(1000);

}

 

}

 

Documento por Lucas Teske

Licença Creative Commons
Esta obra de EnergyLabs Brasil, foi licenciada com uma Licença Creative Commons - Atribuição - Partilha nos Mesmos Termos 3.0 Não Adaptada.
Permissões adicionais ao âmbito desta licença podem estar disponíveis em http://www.energylabs.com.br.


Comente este conteúdo!





Você está em: Documento => - Translate this page to English