Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
pt:examples:sensor:thermistor [2015/12/11 20:17] – Criação deste novo documento. articapt:examples:sensor:thermistor [2020/07/20 12:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== Térmistor ======
  
 +//Conhecimento prévio: 
 +[HW] [[en:hardware:homelab:digi]], 
 +[ELC] [[en:electronics:voltage_divider]], 
 +[AVR] [[en:avr:adc]], 
 +[LIB] [[en:software:homelab:library:adc]], [LIB] [[en:software:homelab:library:module:lcd_graphic]], [LIB] [[en:software:homelab:library:module:sensor]]//
 +
 +===== Teoria =====
 +
 +[{{  ::examples:sensor:thermistor:ntc.jpg?300|Térmistor NTC}}]
 +
 +Um térmistor é um tipo de resistência em que a resistância varia com a temperatura. Existem dois tipos de térmistores: coeficiente positivo de temperatura de resistência e de coeficiente negativo de temperatura de resistência. A resistência de térmistores com coeficiente positivo está a aumentar quando a temperatura aumenta, o negativo diminui. As respectivas siglas são PTC e NTC.
 +
 +A dependência da temperatura não é linear e isto complica o uso do mesmo. Para medições precisas de temperatura em fluctuações mais amplas é usada a equação exponencial de terceira ordem de Steinhart-Hart, dado que a resistência de térmistores é linear apenas num pequeno intervalo de temperatura. Existe a seguinte equação Steinhart-Hart simplificado com parâmetro B para termistores NTC:
 +
 +{{:examples:sensor:thermistor:sensor_ntc_equation.png?130|A relação entre temperatura e resistência num térmistor NTC.}}
 +
 +onde:\\
 +  * T<sub>0</sub>  - temperatura nominal, 25 °C tipicamente.\\
 +  * R<sub>0</sub>  - resistância à temperatura nominal.\\
 +  * B   - parâmetro B.
 +
 +Parâmetro B é um coeficiente habitualmente fornecido na datasheet do térmistor. É somente suficiente constante estável entre certas gamas de temperatura, por exemplo entre a gama 25–50 °C ou 25–85 °C. Se a gama de temperatura estiver para fora destes limites a datasheet tem de ser usada para obter a equação.
 +
 +Normalmente, um divisor de tensão é usado para medir a resistância de um térmistor, onde uma resistência é substituída com um térmistor e a tensão de entrada é constante. A tensão do divisor de tensão de saída é medido, que varia de acordo com a alteração da resistência do térmistor. Se a tensão é aplicada, a corrente passa através do térmistor que aquece o térmistor devido à resistância e, portanto, altera a resistência de novo. A falha provocada pelo aquecimento do térmistor pode ser compensada com cálculos, mas é mais fácil de usar um térmistor que tem maior resistância e que, portanto, aqueça menos.
 +
 +Com recursos limitados e com menos exigências de precisão, gráficos e tabelas préviamente calculados para temperaturas são usados. Geralmente as mesas têm gamas de temperaturas e respectivos valores de resistência, tensão ou conversores analógico-digital. Todos os cálculos exponenciais já foram feitos e o usuário precisa apenas de encontrar a linha correcta e ler a temperatura dada.
 +
 +===== Prática =====
 +
 +O módulo de sensor do HomeLab está equipado com um térmistor NTC que tem 10 kΩ resistância nominal. Em temperaturas de 25-50 °C o parâmetro B do térmistor é de 3900. Um pino do térmitor está conectado à alimentação e o outro está ligado ao conversor analógico-digital (HomeLab II canal 2 e HomeLab III canal 14). Uma resistência típica de 10 kQ, também está ligada com o mesmo pino do microcontrolador e à terra, e em conjunto com o térmistor formam um divisor de tensão. Uma vez que estamos lidando com um térmistor NTC, cuja resistância diminui quando a temperatura aumenta; a tensão de saída do divisor de tensão está a aumentar com o crescente da temperatura.
 +
 +
 +Embora usando o AVR seja prático utilizar uma tabela de conversão de valores de temperatura e conversor analógico-digital para encontrar a temperatura correcta. É boa prática encontrar o valor correspondente do conversor analógico-digital para cada grau de temperatura do intervalo desejado de temperatura porque a tabela inversa será demasiado grande devido à quantidade de valores de ADC 10 bits. Recomenda-se usar qualquer tipo de programa de folha de cálculo (MS Excel, LibreOffice Calc, etc.) para fazer a tabela. A fórmula //Steinhart-Hart// que é customizada para os térmistores NTC mencionados é capaz de encontrar a resistência do termistor, que corresponde à temperatura. Derivado da resistência, é possível calcular a tensão de saída do divisor de tensão e usar esta tensão de saída para calcular o valor do ADC. Os valores calculados podem ser inseridos no programa da seguinte forma:
 +
 +<code c>
 +// Table for converting temperature values to ADC values
 +// Every element of the array marks one Celsius degree
 +// Elements begin from -20 degree and end at 100 degree
 +// There are 121 elements in the array
 +const signed short min_temp = -20;
 +const signed short max_temp = 100;
 +
 +const unsigned short conversion_table[] =
 +{                           
 + 91,96,102,107,113,119,125,132,139,146,153,
 + 160,168,176,184,192,201,210,219,228,238,247,
 + 257,267,277,288,298,309,319,330,341,352,364,
 + 375,386,398,409,421,432,444,455,467,478,489,
 + 501,512,523,534,545,556,567,578,588,599,609,
 + 619,629,639,649,658,667,677,685,694,703,711,
 + 720,728,736,743,751,758,766,773,780,786,793,
 + 799,805,811,817,823,829,834,839,844,849,854,
 + 859,863,868,872,876,880,884,888,892,896,899,
 + 903,906,909,912,915,918,921,924,927,929,932,
 + 934,937,939,941,943,945,947,949,951,953,955
 +};
 +</code>
 +
 +Seguindo algoritmo pode ser utilizado para encontrar a temperatura que corresponde aos parâmetros do ADC:
 +
 +<code c>
 +// Converting the ADC values to Celsius degrees:
 +signed short thermistor_calculate_celsius(unsigned short adc_value)
 +{
 + signed short celsius;
 +
 + // Covering the table backwards:
 + for (celsius = max_temp - min_temp; celsius >= 0; celsius--)
 + {
 + // If the value in the table is the same or higher than measured 
 + // value, then the temperature is at least as high as the 
 + // temperature corresponding to the element
 + if (adc_value >= conversion_table[celsius]))
 + {
 + // Since the table begins with 0 but values of the elements 
 + // from -20, the value must be shifted
 + return celsius + min_temp;
 + }
 + }
 +
 + // If the value was not found the minimal temperature is returned
 + return min_temp;
 +}
 +</code>
 +
 +As pesquisas de algoritmos vão desde a mesa onde o valor ADC se encontra, e adquire o escalão mais inferior deste intervalo. O número de classificação marca graus, adicionando a temperatura primária a esta temperatura com uma precisão de 1 grau.
 +
 +Este quadro de conversão e função já estão na biblioteca do HomeLab, portanto, não há necessidade de escrevê-los para este exercício. Na biblioteca a função de conversão é chamada //thermistor_calculate_celsius//. Deve ser considerado que a conversão só é válida quando utilizado no térmistor no módulo de Sensores do HomeLab. Para a utilização de outros térmistores, uma tabela de conversão tem de ser criada e funções mais complexas descritas no manual da biblioteca devem ser usadas. O programa de exemplo deste exercício é um termômetro, que mede a temperatura na escala Celsius e exibe-lo num LCD alfabético.
 +
 +<code c>
 +// Example program of the thermistor of Sensors module
 +// The temperature is displayed on the LCD
 +#include <stdio.h>
 +#include <homelab/adc.h>
 +#include <homelab/module/sensors.h>
 +#include <homelab/module/lcd_gfx.h>
 +#include <homelab/delay.h>
 +
 +// Robotic Homelab II
 +//#define ADC_CHANNEL 2
 + 
 +// Robotic Homelab III
 +#define ADC_CHANNEL 14
 +
 +// Main program
 +int main(void)
 +{
 + unsigned short value;
 + signed short temperature;
 + char text[16];
 + 
 + // Initialization of LCD
 + lcd_gfx_init();
 + 
 + // Clearing the LCD and setting backlight
 + lcd_gfx_clear();
 +        lcd_gfx_backlight(true);
 +
 + // Name of the program
 +        lcd_gfx_goto_char_xy(1, 1);
 + lcd_gfx_write_string("Thermometer");
 + 
 + // Setting the ADC
 + adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
 + 
 + // Endless loop
 + while (true)
 + {
 + // Reading the 4 times rounded values of the voltage of the 
 + // thermistor
 + value = adc_get_average_value(ADC_CHANNEL, 4);
 +
 + // Converting the values of ADC into celsius scale
 + temperature = thermistor_calculate_celsius(value);
 +
 + // Converting the temperature in to text
 + // To display the degree sign, the octal variable is 56
 + sprintf(text, "%d\56C   ", temperature);
 +
 + // Displaying the text in the beginning of the third row of the LCD
 + lcd_gfx_goto_char_xy(5, 3);
 + lcd_gfx_write_string(text);
 +
 +                hw_delay_ms(1000);
 + }
 +        return 0;
 +}
 +</code>
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0