Olá Garagistas! 

Ultimamente estava tendo problemas com LM35, pois ele chegava a varias em questão de milésimo de segundos coisa de 1ºC a 2ºC, então fiz algumas pesquisas e cheguei nas seguintes conclusões.

1º- Precisamos saber exatamente a faixa de temperatura que nosso projeto deseja mensurar.

2º- Devemos configurar o referencia da portas analógicas de acordo com a conclusão 1º.

Exemplificando:

O sensor LM 35 mede temperaturas de 2ºC a +150ºC de acordo com a ligação da figura 1. Isso em tensão representa  20mv a 1,5V, então usando a referencia padrão das portas analogicas do Arduino que é 5V (5/1024=4,88mv) então temos um sensibilidade de 4,15mv que dá coisa de 0,41ºC de erro, sem contar as varias bruscas do sensor.

Então o que fazer?

Então vamos definir que meu projeto mensure temperatura de 2ºC a 110ºC (20mv a 1,1v) usando um referecia de 5V eu tenho uma grade possibilidade de erro, então vamos mudar essa referencia. Usando:

analogReference (tipo)

Tipo:

  • DEFAULT: O padrão analógico de referência de 5 volts (em placas de 5V do Arduino) ou 3,3 volts (em quadros de Arduino 3.3V)
  • INTERNAL: um built-in de referência, igual a 1,1 volts no ATmega168 ou ATmega328 e 2,56 volts na ATmega8 ( não disponível no Arduino Mega )
  • INTERNAL1V1 : a built-in 1.1V referência ( Arduino mega só )
  • INTERNAL2V56 : a built-in de referência 2.56V ( Arduino mega só )
  • EXTERNAL: a tensão aplicada ao pino AREF ( 0 a 5V apenas ) é usado como a referência.

Para melhor ainda mais essa precisão evitando a variação brusca do sensor vamos tirar uma media de leituras também.

Exemplo:

 

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
const int sensor=1;
float temperatura;
void setup()
{
  lcd.begin(16,2);
  analogReference(INTERNAL); // Referencia de 1.1V UNO (1.1/1024=0,913mv) 0,913mv de precisão ou seja 0,09ºC( INTERNAL1V1  Arduino Mega)
}
void loop()
{
 temperatura=0;
 for(int i=0;i<1000;i++)
{
temperatura=temperatura+analogRead(sensor);
}
 temperatura=temperatura/1000; //Media de mil leituras
 temperatura=temperatura*(1.1/1024);//Converte valor lido para tensão
 temperatura=temperatura*100;//Converte para Graus = temperatura/(1/10mv)
 lcd.setCursor(0,0);
 lcd.print("Temp: ");
 lcd.print(temperatura);
}

 

 

Exibições: 17670

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de paoman em 7 abril 2013 às 13:29

Como realizo o cálculo da sensibilidade e nova taxa de erro com 1.1v?

Comentário de Wiechert em 23 dezembro 2012 às 14:01

Olá Wellington,

Ótimo trabalho, vai ajudar muita gente que vem enfrentando problemas ao usar o LM35.

Mas acho que vale a pena ressaltar pro pessoal que caso o projeto for usar as outras entradas analógicas, elas também vão estar usando a mesma referência, afinal o ATmega (como a maioria dos microcontroladores) tem apenas um circuito conversor AD que faz a comutação dos pinos para aumentar o número de entradas analógicas.

No caso de um projeto onde são usados sensores com ranges diferentes de tensão (por exemplo um sensor varia de 0 a 5V e outro de 0 a 2V), temos que usar outros artifícios para "equalizar" os ranges.

Uma saída para esse exemplo é o uso de um amplificador operacional de CC com o ganho calculado de forma que o nível entregue ao AD do ATmega quando o sensor  estiver no fim de escala seja igual ao do sensor com o range maior. Ou seja, ligar um op. amp com ganho igual a 2,5 entre a saída do sensor de 0 a 2V e a entrada do AD.

Desculpe se me extendi demais na explanação.

Abraço.

Comentário de Wellington Cássio em 23 dezembro 2012 às 10:17

Isso mesmo Arilton, 1024 foi um erro meu! Vou Arrumar obrigado! :D

Comentário de Arilton Guimarães Ramos em 17 dezembro 2012 às 23:00

Tenho uma dúvida: o valor 1204 utilizado não estaria equivocado, já que provêm no número de bits do conversor AD (2^n, onde n é número de bits: então 2^10=1024 e não 1204)?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço