Arduino UNO - Sensor de temperatura interno

Este post faz parte da série Arduino UNO: Conversor A/D. Leia também os outros posts da série:

No artigo anterior, falamos sobre a taxa de amostragem do conversor AD o que nos ajudou a entender sobre esse periférico no Arduino UNO. Nesse artigo vamos explorar o sensor de temperatura interno do ATmega328P, que também está agregado ao conversor A/D.

 

O sensor é um diodo que produz uma tensão proporcional a temperatura interna do microcontrolador. No ATmega328P este sensor está ligado ao canal 8 (ADC8) do conversor. O sensor possui uma relação linear entre tensão e temperatura, porém a tensão de saída do sensor varia de um chip para outro, devido ao seu processo de fabricação.

 

A temperatura interna do microcontrolador aumenta durante o seu funcionamento e, por exemplo, se um pino é usado para acionar um LED, a temperatura irá aumentar mais.

 

A temperatura interna pode ser monitorada para verificar se não há problema no sistema. Por exemplo, se a temperatura durante o funcionamento normal acresce por volta de 5°C e no momento ela atingiu 20°C a mais, isso indica um problema no sistema.

 

A faixa de temperatura de operação do Atmega328 vai de -40°C a 85°C, conforme exibido em sua folha de dados.

 

Esse sensor não pode ser utilizado para medir a temperatura ambiente, porém ao ligar o microcontrolador, quando o mesmo estiver desligado por um bom tempo, a temperatura lida será bem próxima da temperatura ambiente.

 

Abaixo são exibidos os valores típicos de temperatura versus tensão, porem para cada chip, a tensão pode variar:

 

tabela1

 

A sensibilidade é de aproximadamente 1 mV/°C e precisão do valor medido é de +/- 10°C. Essa precisão pode ser melhorada para aproximadamente 2°C se o ganho e offset forem medidos e usados na equação de temperatura. Isso pode ser feito conforme sugerido no application note: AVR122 - Calibration of AVR’s internal temperature reference, com a seguinte equação:

 

equação

 

O valor de ganho e offset são diferentes para tipos de microcontroladores. Conforme sugerido pelo tutorial no site no site Arduino Playground - InternalTemperatureSensor, a equação para o ATmega328P é:

 

temperatura = (ADC - 324.31) / 1.22

 

Sketch para teste

 

Primeiramente vamos entender o que será necessário configurar nos registradores do ADC. Conforme explicado na folha de dados do ATmega328P, para utilizar o sensor de tensão é necessário escolher o canal ADC8 e selecionar a tensão de referência interna de 1,1V.

 

Para selecionar a tensão de referência interna é necessário configurar o registrador ADMUX, os bits 7:6 - REFS1:RFS0,  conforme a tabela a seguir:

tabela2

 

Como pode-se observar na tabela deve-se colocar nível lógico 1 nesses dois bits para selecionar a referência de tensão interna.

 

Agora vamos selecionar o canal 8(ADC8), este canal não é selecionado através da função do arduino, devemos configurar no ADMUX os bits 3:0 - MUX3:0, conforme tabela abaixo:

 

sensor de temperatura interno

 

Dessa forma vamos criar uma função para configuração e leitura do sensor conforme sketch a seguir:

 

 

A figura a seguir exibe os valores lidos de temperatura:

 

sensor de temperatura interno

 

 

Saiba mais

 

Arduino - Primeiros Passos

Arduino UNO

Arduino - Entradas/Saídas digitais

 

 

 

Referências

 

Arduino Playground - InternalTemperatureSensor

AVR122 - Calibration of AVR’s internal temperature reference

 

 

Outros artigos da série

<< Arduino UNO - Taxa de amostragem do conversor A/D
Este post faz da série Arduino UNO: Conversor A/D. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Fábio Souza
Engenheiro, especialista em sistemas embarcados. Hoje é diretor de operações do portal Embarcados, onde trabalha para levar conteúdos de eletrônica, sistemas embarcados e IoT para o Brasil. Também atua no ensino eletrônica e programação. É entusiastas do movimento maker, da cultura DIY e do compartilhamento de conhecimento, publica diversos artigos sobre eletrônica e projetos open hardware. Com iniciativas como o projeto Franzininho e projetos na área de educação, leva a cultura maker para o Brasil capacitando e incentivando professores e alunos a usarem tecnologia em suas vidas. Participou da residência hacker 2018 no Red Bull Basement.

19
Deixe um comentário

avatar
 
13 Comment threads
6 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
8 Comment authors
Fábio SouzaGuilhermeMarcos Kazan Fleury SilveiraThiago Marchesijeferson Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Guilherme
Visitante
Guilherme

Na linha 19 não entendi como ele diz se o valor é 0 ou 1 para selecionar a tensão interna e o adc8. Alguém ainda por aí?

Leonan Trentini
Visitante

Será que funciona também no nodemcu esp8266?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Não. Esse código foi feito para o ATmega328.

Guilherme Batalha
Visitante
Guilherme Batalha

Nossa, esse artigo já foi postado á algum tempo, mas caso o autor ainda esteja por aí gostaria de fazer uma pergunta; Alterando a tensão interna para 1,1 v influencia noq exatamente? pq eu estou usando quase todas as portas do arduino UNO nesse meu projeto, incluindo as digitais... então eu gostaria de saber se pode acabar gerando algum problema.... eu iria usar esse seu código para acionar um cooler, caso a temperatura lida fosse maior que 60ºc. pq onde vai ficar o arduino tbm vai ficar um Relé de Estado Sólido que vai esquentar bastante.... att. Guilherme

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Olá Guilherme, no caso é alterado a tensão de referencia do conversor AD para 1,1V diminui o valor da resolução. Não irá alterar nada nas portas. Da uma lida nesse artigo que fala sobre o conversor AD: https://www.embarcados.com.br/arduino-entradas-analogicas/ Abraços,

trackback

[…] Arduino UNO - Sensor de temperatura interno […]

trackback

[…] Arduino UNO - Sensor de temperatura interno […]

trackback

[…] Arduino UNO - Sensor de temperatura interno […]

trackback

[…] Arduino UNO - Sensor de temperatura interno […]

trackback

[…] Arduino UNO - Sensor de temperatura interno […]

trackback

[…] Arduino UNO - Sensor de temperatura interno […]

Marcos Kazan Fleury Silveira
Visitante
Marcos Kazan Fleury Silveira

Essa rotina causa algum problema de leitura nas outras portas analógicas ao selecionar a tensão interna de referência 1v1 ?