Interfaceando termistores NTC com microcontroladores


Os sensores NTC apresentam normalmente uma grande sensibilidade às alterações de temperatura, o que o torna relativamente fácil de ser interfaceado com microcontroladores. Vamos exemplificar utilizando o NTC para o qual levantamos as características anteriormente. Obs: Os scripts python aqui disponibilizados para os diferentes cálculos são executados com o Python3. O sistema operacional utilizado foi o Linux Mint 18.1. Se você chegou aqui sem ter lido nada sobre termistores, vale a pena dar uma olhada aqui antes.

 

A maneira mais fácil é utilizarmos o sensor em um divisor resistivo, da forma indicada a seguir:

Divisor resistivo com o sensor

A tensão de saída deste divisor resistivo é dada por:

V_0 = Vcc * R_s / (R_1 + R_s)

O valor da resistência em função da temperatura é dado por:

R = exp { ( root {3} {y - x / 2} - root {3} {y + x / 2} ) }

Sendo que os valores de “x” e “y” são obtidos com as fórmulas:

x= (A*T-1) / (T*C)

y= sqrt { { B / (3C)) ^ 3} + (x / 2)^2 }

Com estes dados podemos desenvolver um script Python que nos apresente de forma gráfica a variação da tensão no divisor resistivo em função da temperatura:

arquivo: termistor1.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  termistor1.py
#  
#  Copyright 2017 tavares <tavares@tavares-Inspiron-5558>
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#  
#  

import numpy as np
import matplotlib.pyplot as plt


"""
Altere as constantes abaixo para configurar de acordo com o 
termistor que voce esta utilizando
"""
C=  7.48209846558e-07  #coeficientes que definem o termistor

B= 0.000240762032337

A= 0.00140567344745
    
R1= 1000.0         # resistor da parte de cima do divisor, em ohms
   
Vcc= 5.0            # valor da tensao de alimentacao
    
tmin= 0.0           # valor da menor temperatura (centigrados)
    
tmax= 100.0         # valor da maior temperatura (centigrados)
        
nPontos= 100        # numero de pontos a calcular no intervalo
    



def main(args):
    
        
    tminK= tmin + 273.15
    tmaxK= tmax + 273.15

    # criamos um vetor com os pontos de temperatura calculados
    pontosTemp = np.linspace(tminK, tmaxK, nPontos, endpoint=True)
    
    #calculamos os valores de resistencia correspodentes
    x = (A * pontosTemp - 1)/(pontosTemp * C)
    
    y= np.sqrt((B/(3.0 * C))**3  + (x/2)**2)

    Rs= np.exp ( np.cbrt(y - x/2.0) - np.cbrt(y + x/2.0))
    
    
    Vo= Vcc * Rs/(Rs+R1)
    
    
        
    plt.plot(pontosTemp-273.15, Vo)
    plt.show()
   
    
    
    
    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

É interessante experimentarmos com diversos valores do resistor R1. Com um valor de 100 ohms temos a seguinte curva:


Curva para R1 = 100 ohms

Vemos que a curva não é nada linear, e que a uma variação de temperatura de 0-100 graus centígrados, a tensão de saída irá variar de 3.00 a cerca de 4.75 volts. (1,75 volts).

Agora vamos alterar o valor de R1 para 10000 ohms:

Curva para R1 = 10000 ohms

Mantém a não linearidade e a excursão agora está de 0 a 1 V, nenhuma vantagem em relação ao valor de 100 ohms.

Façamos agora o valor igual ao valor do sensor a 25 graus, 1000 ohms.

Curva para R1 = 1000 ohms

Bem melhor, mais próxima de uma variação linear, e com uma excursão aproximada de 3 V. Mas a curva é inversa, ou seja, quanto maior a temperatura, menor a tensão. Como fazer para obtermos uma curva em que a tensão aumente com a temperatura?. Simples, apenas inverta a posição entre o Rs e o R1. O script python a seguir mostra a curva para esta nova situação:

.termistor2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  termistor2.py
#  
#  Copyright 2017 tavares <tavares@tavares-Inspiron-5558>
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#  
#  

import numpy as np
import matplotlib.pyplot as plt


"""
Altere as constantes abaixo para configurar de acordo com o 
termistor que voce esta utilizando
"""
C=  7.48209846558e-07  #coeficientes que definem o termistor

B= 0.000240762032337

A= 0.00140567344745
    
R1= 1000.0         # resistor da parte de cima do divisor, em ohms
   
Vcc= 5.0            # valor da tensao de alimentacao
    
tmin= 0.0           # valor da menor temperatura (centigrados)
    
tmax= 100.0         # valor da maior temperatura (centigrados)
        
nPontos= 100        # numero de pontos a calcular no intervalo
    



def main(args):
    
        
    tminK= tmin + 273.15
    tmaxK= tmax + 273.15

    # criamos um vetor com os pontos de temperatura calculados
    pontosTemp = np.linspace(tminK, tmaxK, nPontos, endpoint=True)
    
    #calculamos os valores de resistencia correspodentes
    x = (A * pontosTemp - 1)/(pontosTemp * C)
    
    y= np.sqrt((B/(3.0 * C))**3  + (x/2)**2)

    Rs= np.exp ( np.cbrt(y - x/2.0) - np.cbrt(y + x/2.0))

       
    Vo= Vcc * R1/(Rs+R1)
    
    
        
    plt.plot(pontosTemp-273.15, Vo)
    plt.show()
   
    
    
    
    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

Para um R1= 1000 ohms, temos a seguinte curva:

Curva para R1 = 1000 ohms/Rs na parte superior do divisor

Observe que de zero a 60 graus a curva é bem linear. Se estivermos procurando medir temperaturas ambientes, esta excursão é suficiente.

O próximo passo agora é levantar a equação que será implementada no Arduino para obtermos os valores diretamente em graus centígrados.

Podemos levantar a partir do gráfico dois pontos da reta. Para identificar estes pontos basta posicionar a ponta da seta do cursor do mouse sobre a linha do gráfico e ler o valor das coordenadas na parte inferior direita. Obtemos os seguintes pares de pontos:

temp (y) Vo (x)
6.75 1,62
57.09 3.5

 

A equação de uma reta é dada por:

y= a * x + b

Sendo que “x” é a tensão lida pelo arduino e y é o valor da temperatura em graus centígrados.

Na reta que obtivemos, a inclinação “a” pode ser calculada da seguinte maneira:

a =(Delta y) / ( Delta x) = ( 57.09 - 6.75) / (3.5 - 1.62)  = 27.776

Para o calculo de b, basta substituir os valores que já temos na equação da reta:

6.75 = 27.776  *  1.62 + b

O que resulta em b= -38.247.

A equação de conversão então se torna:

y = 27.776 * x - 38.247

Estaria tudo muito bem se o conversor AD do Arduino já nos retorna-se o valor lido em volts. Mas o retorno é realizado em termos de um numero de 10 bits no máximo. Temos inicialmente que converter este número em volts.

É basicamente outra equação de reta, neste caso mais simples pois b=0 (o valor zero retornado equivale a 0 volts)

Em uma palavra de dez bits podemos ter 2 10, ou seja 1024 valores. Cada bit corresponde então a 5/1024= 4.88 mV.

Portanto, para termos o valor lido no AD do Arduino em volts, basta multiplicar o valor retornado pelo conversor por 0.00488.

No próximo artigo vamos elaborar o programa no Arduino para nos proporcionar uma leitura contínua de temperatura baseado no sensor termistor. Até lá!

Deixe um comentário