====== 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:\\ * T0 - temperatura nominal, 25 °C tipicamente.\\ * R0 - 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: // 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 }; Seguindo algoritmo pode ser utilizado para encontrar a temperatura que corresponde aos parâmetros do ADC: // 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; } 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. // Example program of the thermistor of Sensors module // The temperature is displayed on the LCD #include #include #include #include #include // 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; }