Professor: James Alexandre Baraniuk
Aula: Segunda - Feira 17h30m
Controle de temperatura negativa utilizando NTC Jagher, Eduardo; Loures, Emanuelle M.; Tam, Gisele Universidade Federal do Paraná Centro Politécnico – Jd. das Américas – 81531-990 – Curitiba – PR - Brasil Resumo Este trabalho visa desenvolver e aplicar um circuito eletrônico que possa medir temperaturas entre -55 oC e 0oC para atuar no local medido com um resistor a fim de aquecer o local , em seguida atualiza um display de LCD com o valor instantâneo de temperatura medida e posteriormente enviar para um computador os dados coletados em um período pré estipulado. Palavras-chaves: NTC, temperatura negativa. Introdução A temperatura influencia praticamente em todas as propriedades físicas e químicas de um elemento. Para recipientes metálicos que detêm substâncias extremamente frias, como nitrogênio líquido, é interessante saber a temperatura em seus pontos mais frágeis, pois o metal pode apresentar fissuras e perder parte de sua vida útil. Assim, o objetivo do trabalho é criar um sensor de temperaturas negativas e aquecer o local, caso a medição apresente um valor abaixo do desejado.
benefício e por suas características intrínsecas, incluindo a faixa de operação e o encapsulamento, este último proporcionando uma pequena influência na medida devido a sua baixa capacidade térmica. Sua resistência varia com a temperatura conforme a equação 1, Rn mostrada no gráfico 1. Sendo a resistência nominal do dispositivo à 25 oC e β o coeficiente de sensibilidade térmica do dispositivo. β ( β − 278,15 )
Rntc ( T )= Rn∗e T
Fundamentação Teórica O transdutor escolhido é o NTC 173-103LAD-301 fabricado pela Honeywell Sensing and Control cujo beta ( β ) é 3750K e a resistência nominal em 25 grau Celsius é 10 k. Ω , o encapsulamento é C0805 e o preço por unidade é $0,50. Foi escolhido este transdutor pelo alto custo
Gráfico 1.
(1)
A resistência do NTC não varia linearmente com a temperatura, como observado no gráfico 1, por isso há a necessidade de linearizá-la. Para isso utiliza-se um resistor em paralelo ao NTC, a fim de linearizar a resistência do conjunto em torno de um ponto central, como mostra na figura 1. Gráfico 2.
Em seguida pode-se medir uma tensão proporcional à variação da resistência do conjunto, para isso utiliza-se uma ponte de Wheatstone conforme a figura 2. Figura 1.
Para o cálculo do valor do R sh resistor utiliza-se a equação 2,
sendo
Tc
a
temperatura Rtc central em Kelvin (K) e a resistência
Rntc
para
a
temperatura
Tc ,
visto
na
equação 3. R sh =
Rtc∗β−2Tc β+ 2Tc
Rtc =Rntc (Tc)
(2)
(3)
É possível observar no gráfico 2 a resistência do conjunto em função da temperatura. Com essa topologia de resistores em paralelo é possível linearizar a resistência do conjunto em torno de uma temperatura central, contudo perde-se um pouco da sensibilidade do NTC.
Figura 2.
Com este circuito mede-se uma tensão diferencial na ponte proporcional à resistência dos conjuntos NTC’s. Para esta configuração da ponte as tensões v +¿ v−¿ e podem ser descritas a partir das equações 4 e 5 respectivamente e a tensão diferencial pela equação 6. Sendo NTC a resistência do conjunto R sh
e
Rntc
, visto na equação 7.
v +¿
R1∗10 −5 NTC (T )+ R1
v−¿ NTC
(T )∗10 −5 NTC (T )+ R2
v−¿ v +¿−¿ v dif (T )=¿
NTC (T )=
(4)
(5)
(6)
1 1 1 + R sh Rntc (T )
0oC, portanto a máxima variação de temperatura é de 55oC. O microcontrolador utilizado é o MSP430, cujos limites de tensão de entrada na porta A/D é de 0 volts à 3,3 volts, sendo assim pré-definido que a tensão de 0 volt corresponde à -55oC e 3,3 volts corresponde à 0oC, dessa forma consegue-se a melhor resolução possível dentro da faixa de operação. Para satisfazer o condicionamento imposto acima R1 devemos dimensionar e R2
(7)
Obteve-se a tensão diferencial na ponte de Wheatstone e é preciso condicionar o sinal para enviar a um microcontrolador que irá efetuar a medida propriamente dita. Para isso utilizou-se um amplificador de instrumentação, especificado na figura 3 e um circuito de proteção em série a fim de que as máximas variações de temperaturas ocasionem as máximas variações de tensão possíveis na entrada do conversor A/D do micro controlador.
de modo que
v dif (−55)=0 .
Com isso pode se concluir que v +¿ v −¿ , resolvida esta igualdade obtemos a equação 8.
10∗R1∗( NTC (−55)+ R2)=NTC (−55)∗10∗( NTC (−55) (8) Para utilizou-se
facilitar os cálculos R1=R2 e foi obtido a
equação 9. R1=R2=NTC (−55) Com
R1 e
(9)
R2 calculados
podemos saber qual será
v dif (0)
a partir da equação 6. Com o valor de v dif (0) , calcula-se o ganho do amplificador de instrumentação de vout modo que contenha-se entre 0 e 3,3 volts com a equação vout 10, sendo a tensão de entrada do microcontrolador. Figura 3.
Para este projeto a faixa de temperatura visada é de -55 oC a
Ganho=
3,3 v dif (0) (10)
Por último conecta-se à saída do amplificador diferencial um circuito de proteção mostrado na figura 4, para que a tensão enviada ao micro controlador não ultrapasse os limites de tensão da entrada A/D.
resolução de 10 bits, portanto ele resolve tensões de amplitude mínima de 3,22mV. A tensão é lida 256 vezes consecutiva e depois extraída a média para aumentar a resolução do conversor em 4 bits. Depois de converter o valor de tensão e feita a média, o MSP irá associar uma temperatura ao valor de tensão medido. Genericamente esta associação é dada por uma função Tm( v dif ) . Observando o Gráfico 3 podemos utilizar uma aproximação de Tm( dif ) como um polinômio
Figura 4.
Para implementar todos os cálculos de uma forma rápida e prática foi desenvolvido um programa no MatLAB (anexo 1) que calcula todos os valores dos resistores assim como o ganho do amplificador e gera os gráficos de tensão em função da temperatura. Assim obtemos os valores dos componentes e a resposta da tensão em função da temperatura na porta de entrada do A/D do micro controlador, apresentado no gráfico 3.
de 1ª ordem, obtido na equação 11. Para esta aproximação obtemos uma reta aproximada que corresponde ao gráfico 4, e um módulo do erro de aproximação visto no gráfico 5. T m (v dif )= A∗v dif + B
Gráfico 4.
Gráfico 3.
Aquisição de processamento:
dados
e
O conversor A/D do microcontrolador MSP430 tem uma
Gráfico 5.
(11)
Para uma melhor aproximação foi definido um novo Tm( v dif ) como um polinômio de 3ª ordem, na equação 12. Para esta aproximação obteve-se uma equação cúbica aproximada observada no gráfico 6, e um módulo do erro de aproximação no gráfico 7. T m ( v dif ) =A∗v 3dif + B∗v 2dif +C∗v dif + D (12)
Gráfico 8.
Calibração: É feita a partir da exposição dos NTC’s a uma temperatura conhecida de 0ºC, e a qualquer momento que são feitas as leituras é possível calibrar a tensão lida, pressionando botão de calibração que está na placa do MSP. Atuação do Resistor: Quando a temperatura se encontra abaixo de -40ºC, o resistor será acionado por um sinal PWN (algoritmo vide anexo 2) tal que a temperatura fique sempre acima -40ºC. O duty cycle é influenciado pela temperatura medida pelo sensor, conforme a temperatura diminui o período que ele permanece ativo aumenta de tal modo que o resistor continue aquecendo o local e o sensor registre uma temperatura maior que -40ºC.
Gráfico 6
. Gráfico 7.
Como os erros para Tm( v dif ) definida pela equação 12 são menores que
Tm( v dif )
definida pela equação 11, foi utilizado a aproximação cúbica para caracterizar a temperatura. A comparação dos erros poderá ser analisada no gráfico 8.
Comunicação Serial: É feita a partir da interface UART, entre o microcontrolador e o conversor USB, tendo a comunicação com o micro controlador uma simulação de comunicação serial RS232. Portanto o envio da informação é feito a partir de bytes com a configuração padrão do RS232: baud rate de 9600, 8N1.
São enviados 4 bytes sendo os dois bytes do centro a informação de nível de tensão lida na porta AD do micro controlador. A tensão lida a partir dos dois bytes são reconstruídas por um programa do MatLAB (anexo 3) e com esse valor o programa, calcula e atualiza uma interface gráfica (figura 5) mostrando qual a temperatura no sensor.
ANEXOS Anexo 1. % Calculo da ponte de wheatstone tensao condicionada e ganho % % Eduardo Jagher, Emanuelle Mussy Loures, Gisele Tam % % Rev 1.0 03/03/2013 % close all B = 3750; % Kelvin Rn = 10000; % Ohms T = -55:0.1:0; % Vetor temperatura em grau celsius K = 273.15*ones(1,length(T)); K25 = (273.15+25)*ones(1,length(T)); if (length(T)/2)==(round(length(T)/2)) Tc = (T(length(T)/2-150)+T(length(T)/2+151))/2; % grau celsius else Tc = T(round(length(T)/2)-150); % grau celsius end Rtc = Rn*exp(B/(273.15+Tc)-B/(273.15+25)); % Ohms Rsh = Rtc*((B-2*(273.15+Tc))/(B+2*(273.15+Tc))) % Resitor paralelo em Ohms Rntc = Rn*exp(B./(K+T)-B./(K25)); R = (((1/Rsh+1./(Rn*exp(B./(K+T)-B./(K25)))).^-1)); R1 = R(1) R2 = R1 v1 = R1*10./(R+R1*ones(1,length(T)))-5*ones(1,length(T)); v2 = R*10./(R+R2*ones(1,length(T)))-5*ones(1,length(T)); vd = v1-v2; % volt ganho = 3.3/max(vd) % ganho do amplificador rg = 10000; r1 = 10000; r3 = 10000; r2 = (1+2*r1/rg)*r3/ganho vdcond = vd*ganho; figure plot(T,Rntc) grid on xlabel('Temperatura graus celsius')
ylabel('Resistencia NTC') figure plot(T,R) grid on xlabel('Temperatura graus celsius') ylabel('Resistencia Linearizada') figure plot(T,v1) grid on xlabel('Temperatura graus celsius') ylabel('Tensao v1') figure plot(T,v2) grid on xlabel('Temperatura graus celsius') ylabel('Tensao v2') figure plot(T,vd) grid on xlabel('Temperatura graus celsius') ylabel('Tensao diferencial') figure plot(vdcond,T) grid on xlabel('Tensao diferencial na porta do MSP') ylabel('Temperatura graus celsius') plot(T,vdcond) grid on xlabel('Temperatura graus celsius') ylabel('Tensao diferencial na porta do MSP') figure plot(vdcond,T) grid on xlabel('Tensao diferencial na porta do MSP') ylabel('Temperatura graus celsius') hold on A = polyfit(vdcond,T,3); save POLY A C = polyfit(vdcond,T,1); Tmodelo = A(1,1)*vdcond.^3+A(1,2)*vdcond.^2+A(1,3)*vdcond+A(1,4)*ones(1,length(T )); Tmodelo2 = C(1,1)*vdcond+C(1,2)*ones(1,length(T)); plot(vdcond,Tmodelo,'red') hold off figure plot(vdcond,T,vdcond,Tmodelo2,'red') grid on xlabel('Tensao diferencial na porta do MSP') ylabel('Temperatura graus celsius') hold on Err1 = Tmodelo2-T; Err2 = Tmodelo-T; figure plot(T,abs(Err1)) grid on xlabel('Temperatura graus celsius') ylabel('Modulo Erro1') figure plot(T,abs(Err2)) grid on
xlabel('Temperatura graus celsius') ylabel('Modulo Erro2') figure plot(T,abs(Err2),T,abs(Err1),'red') grid on xlabel('Temperatura graus celsius') ylabel('Erro comparacao')
Anexo 2. # include <msp430g2553.h> unsigned long voltMeasured=0; float voltAverage=0; float voltCalibration=1; float volt=0; float tempCalc; float Axya = 1.224; float Axyb = -5.7222; float Axyc = 22.0542; float Axyd = -54.6968; unsigned int delay1; unsigned long delay2; char l; char h; unsigned int v; void UARTconfigure (void); void UARTtransmit (char c); void main(void){ WDTCTL = WDTPW + WDTHOLD; // stop WDT UARTconfigure (); //Configure port// P1DIR |= 0x41; // P1OUT &= ~0x01; // P1DIR &= ~0x08; // P1REN |= 0x08; //
BIT0 e BIT6 BIT0 BIT3 BIT3
// start aplication // while ((P1IN & 0x08)){ P1OUT |= 0x40; // bit p1.6 high __delay_cycles(100000); // Pausa P1OUT &= ~0x40; // bit p1.6 down P1OUT |= 0x01; // bit p1.6 high __delay_cycles(100000); // Pausa P1OUT &= ~0x01; // bit p1.6 down } // Configure ADC Temp Sensor Channel // ADC10CTL1 = INCH_7 + ADC10DIV_3; ADC10CLK/4 ADC10CTL0 = ADC10SHT_3 + ADC10ON + ADC10IE; __delay_cycles(1000); settle // Configure ADC Temp Sensor Channel // while (1) {
// Temp Sensor // Wait for ADC Ref to
if((P1IN & 0x08)) // Default calibration when skip start aplication { P1OUT |= 0x40; // BIT6 high program on while (1) { // Moving average filter out of 256 values to somewhat stabilize sampled ADC voltAverage = 0; voltMeasured = 0; unsigned int i; for (i = 0; i < 256; i++) { ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start voltMeasured += ADC10MEM; // register ADC value } voltAverage = voltMeasured; voltAverage = voltAverage/1023/256; // Divide by 256 to get average volt = 3.3*voltAverage/voltCalibration; // Get decimal voltage // Temperature calculation, MatLab modelation tempCalc = Axya*volt*volt*volt + Axyb*volt*volt + Axyc*volt + Axyd; v = volt*10000; l = v&0xFF; h = v>>8; // Transmit // UARTtransmit UARTtransmit UARTtransmit UARTtransmit
(255); (l); (h); (255);
// Transmit // // Temperature calculation, MatLab modelation while (!(P1IN & 0x08)) { voltCalibration = 0; for (i = 0; i < 256; i++) { ADC10CTL0 |= ENC + ADC10SC; voltCalibration += ADC10MEM; } voltCalibration = voltCalibration/1023/256; // Divide by 256 to get average P1OUT ^= 0x40; // inverte bit __delay_cycles(100000); // Wait+ P1OUT ^= 0x40; // inverte bit } delay1 = -39-tempCalc; delay2 = 16-delay1; tempCalc = -tempCalc; if (tempCalc >= 40){ for (i = 0; i < delay1;i++){ P1OUT |= 0X01; //P1.0 High
} }
__delay_cycles(10); //Pausa } for (i = 0; i < delay2;i++){ P1OUT &= ~0X01; //P1.0 Low __delay_cycles(1); // Pausa }
}
}
} void UARTconfigure (void) { P1SEL |= BIT1+BIT2; P1SEL2 |= BIT1+BIT2; UCA0CTL1 = 0x81; UCA0CTL0 = 0x00; UCA0BR0 = 104&255; // UCA0BR1 = 104>>8; // UCA0MCTL = 6<<1; UCA0CTL1 = 0x80; } void UARTtransmit (char c) { while(!(IFG2 & UCA0TXIFG)); UCA0TXBUF = c; }
Anexo3. % Função BOXr para leitura e interface da temperatura % % Eduardo Jagher, Emanuelle Mussy Loures, Gisele Tam % % Rev 1.0 03/03/2013 % function varargout = BOXr(varargin) % BOXr MATLAB code for BOXr.fig % BOXr, by itself, creates a new BOXr or raises the existing % singleton*. % % H = BOXr returns the handle to a new BOXr or the handle to % the existing singleton*. % % BOXr('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in BOXr.M with the given input arguments. % % BOXr('Property','Value',...) creates a new BOXr or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before BOXr_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to BOXr_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help BOXr % Last Modified by GUIDE v2.5 04-Mar-2013 17:09:43 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @BOXr_OpeningFcn, ... 'gui_OutputFcn', @BOXr_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before BOXr is made visible. function BOXr_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to BOXr (see VARARGIN) % Choose default command line output for BOXr handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes BOXr wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = BOXr_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; % --- Executes during object creation, after setting all properties. function text2_CreateFcn(hObject, eventdata, handles) % hObject
handle to text2 (see GCBO)
% eventdata % handles called
reserved - to be defined in a future version of MATLAB empty - handles not created until after all CreateFcns
% --- Executes on button press in pushbuttonstart. function pushbuttonstart_Callback(hObject, eventdata, handles) global freeze global stop global n global T T = zeros(100,3); % vetor temperatura real stop=1; freeze=0; n=1; s = get(handles.popup,'Value'); ss = get(handles.popupg,'Value'); GET_COM_PORT % Função porta serial fclose(seriall); fopen(seriall); load POLY while(stop==1) TEMPrr % Função Leitura if(freeze==1) % Não faz nada pause(0.2) else set(handles.text2,'String',Tempc); set(handles.text3,'String',Tempf); set(handles.text4,'String',Tempk); pause(0.2) end end fclose(seriall); set(handles.text2,'String','Stoped'); set(handles.text3,'String','Stoped'); set(handles.text4,'String','Stoped'); % hObject % eventdata % handles
handle to pushbuttonstart (see GCBO) reserved - to be defined in a future version of MATLAB structure with handles and user data (see GUIDATA)
% --- Executes on button press in pushbuttonstop. function pushbuttonstop_Callback(hObject, eventdata, handles) global freeze global stop freeze = 0; stop = 0; % hObject % eventdata % handles
handle to pushbuttonstop (see GCBO) reserved - to be defined in a future version of MATLAB structure with handles and user data (see GUIDATA)
% --- Executes during object creation, after setting all properties. function text1_CreateFcn(hObject, eventdata, handles) % hObject handle to text1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB
% handles called
empty - handles not created until after all CreateFcns
% --- Executes during object creation, after setting all properties. function text6_CreateFcn(hObject, eventdata, handles) % hObject handle to text6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % --- Executes during object creation, after setting all properties. function text3_CreateFcn(hObject, eventdata, handles) % hObject handle to text3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % --- Executes during object creation, after setting all properties. function text13_CreateFcn(hObject, eventdata, handles) % hObject handle to text13 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% --- Executes on button press in pushbuttonfreeze. function pushbuttonfreeze_Callback(hObject, eventdata, handles) global stop global freeze if (freeze==0) freeze=1; set(handles.pushbuttonfreeze,'String','De-freeze') else freeze=0; set(handles.pushbuttonfreeze,'String','Freeze') end % hObject handle to pushbuttonfreeze (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbuttonget. function pushbuttonget_Callback(hObject, eventdata, handles) serialports=instrhwinfo('serial'); nPorts = length(serialports.SerialPorts); set(handles.text13, 'String',[ serialports.SerialPorts ]); % hObject handle to pushbuttonget (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on selection change in popup. function popup_Callback(hObject, eventdata, handles) % hObject handle to popup (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popup contents as cell array % contents{get(hObject,'Value')} returns selected item from popup % --- Executes during object creation, after setting all properties. function popup_CreateFcn(hObject, eventdata, handles) % hObject handle to popup (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: popupmenu controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on selection change in popupg. function popupg_Callback(hObject, eventdata, handles) % hObject % eventdata % handles
handle to popupg (see GCBO) reserved - to be defined in a future version of MATLAB structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupg contents as cell array % contents{get(hObject,'Value')} returns selected item from popupg % --- Executes during object creation, after setting all properties. function popupg_CreateFcn(hObject, eventdata, handles) % hObject handle to popupg (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: popupmenu controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end