Instituto Politécnico Nacional
Unidad Profesional Interdisciplinaria en Ingeniería y Tecnologías Avanzadas
Práctica 5: Sensor Térmico LM35
Clara Lugo Marcos de Oliveira
González Alatorre Víctor Jesús
Juárez González Luis Angel
Sensores y Acondicionador de Señal
Grupo 2MV8
Profesor Juan Manuel Peza Tapia
Fecha de entrega: 17 de junio de 2017
Resumen
En la presente práctica se reporta la implementación básica de un termómetro digital utilizando el circuito lm35 y un circuito ADC0804 convertidor analógico digital, mediante el conocimiento de estos circuitos, además de su implementación en la tarjeta de desarrollo FPGA Nexys 2.
Objetivo
Aprender a utilizar el sensor lm35 de acuerdo con sus características de la datasheet y utilizar los conocimientos adquiridos en otras materias para la implementación de un termómetro digital de 0 a 127 grados centígrados, mediante un circuito convertidor analógico digital y una tarjeta de desarrollo.
Sensores piroeléctricos
El efecto piroeléctrico es análogo al piezoeléctrico donde aparece una polarización eléctrica en un material al deformarse, pero que aquí se trata de la aparición de cargas superficiales en una dirección determinada cuando el material experimenta un cambio de temperatura. Estas cargas son debidas al cambio de su polarización espontanea al variar la temperatura.
Si el cambio de temperatura, ΔT, es uniforme en todo el material, el efecto piroelectrico se describe mediante el coeficiente piroeléctrico, p, que es un vector de la forma
P=p T
Donde P es la polarización espontanea.
Este efecto se aplica sobre todo a la detección de radiación térmica a temperatura ambiente. Para ello se disponen electrodos metálicos en dirección perpendicular a la de polarización formándose un capacitor que actúa como sensor térmico. Cuando el detector absorbe radiación cambia su temperatura y con ella su polarización, produciendo una carga superficial en las placas del capacitor.
Si el área donde incide la radiación es A y el grosor del detector, b, es suficientemente pequeño para poder suponer que los gradientes de temperatura en él son despreciables, la carga inducida será
Q=A P=pA T
La tensión obtenida será
V0= QC= QbεA=pbε T
Algunos materiales piroeléctricos comunes
Coeficiente piroeléctrico nC/cm2K
Permitividad relativa
Calor especifico J/cm3K
Sulfato de triglicina TGS
40
35
2.5
Tantalato de litio TaO3Li
19
46
3.19
Niobato de estroncio y bario SBN
60
400
2.34
PVDF
3
11
2.4
La aplicación más inmediata del efecto piroeléctrico en sensores es la detección de radiación térmica a temperatura ambiente. En consecuencia, se ha aplicado en pirómetros(medida de temperatura a distancia), radiómetros (medida de la potencia generada por una fuente de radiación), analizadores de IR, detectores de CO2y otros gases que absorben radiación IR, detección de la radiación IR emitida por el cuerpo humano, detección de pulsos laser de alta potencia y en termómetros de alta resolución.
Por su pequeño tamaño y alta sensibilidad a cambios de temperatura, su respuesta es más rápida que la de otros detectores térmicos, pues no es necesario que alcancen el equilibrio térmico con la fuente de radiación. Esto los hace apropiados para la exploración de la superficie a detectar.
Sensor de temperatura LM35
El circuito integrado LM35 es un sensor piroeléctrico de temperatura, de precisión y que solo requiere de alimentación, tierra y dará a la salida un voltaje linealmente proporcional a la escala Centigrada de temperatura. Se encuentra en un empaquetado común TO-92 igual al de los transistores comerciales más usados.
Como ya dijimos su voltaje de salida es linealmente proporcional a su salida, y se puede utilizar en dos configuraciones básicas, una sin resistencia de carga y otra con resistencia de carga, la primera nos brinda una salida de 10 miliVolt por cada grado centígrado, la segunda nos brinda, escogiendo una resistencia de carga a un voltaje negativo, una salida lineal que nos brinda un rango de -55 grados centígrados hasta 150 grados centígrados, con un aumento de 10 miliVolt por cada grado centígrado, es decir, la resistencia a una alimentación negativa amplía el rango del sensor, como se muestra en la figura:
Características principales
Esta calibrado en grados Celsius (centígrados)
Escala lineal de + 10,0 mV / ° C
Posee una exactitud de 0,5 ° C (a 25 ° C)
Muestra temperaturas de un rango de -55 ° a +150 ° C
Opera de 4 a 30 voltios
Consumo de corriente menor a 60 μA
Bajo calentamiento espontáneo, 0.08 ° C en aire
Salida de baja impedancia, 0.1 W para la carga 1 mA
Descripción de los ADC
Los ADC son convertidores analógicos a digitales tienen una gran variedad de aplicaciones, como un dispositivo intermedio que convierte las señales de forma analógica a digital. Estas señales al ser digitalizadas se utilizan para el procesamiento de los procesadores digitales.
El ADC0804 es un convertidor de señal analógica a digital de 8 bits. Este ADC0804 cuenta con un solo canal de entrada analógica con una salida digital de ocho bits que puede mostra 256 valores de medidas diferentes. El tamaño de paso se ajusta mediante el establecimiento de la tensión de referencia en pin9 la entrada de referencia de voltaje puede ser ajustado para permitir que codificar cualquiera rango de tensión analógica más pequeña para la totalidad de 8 bits de resolución. Cuando en el adc0804 no se conecta el pin tensión de referencia, la tensión de referencia por defecto es la tensión de funcionamiento, es decir, Vcc. El tamaño del paso a 5V es 19.53mV (5V/255), es decir, por cada aumento de 19.53mV en la entrada analógica, la salida varía por 1 unidad. Para establecer un nivel de tensión determinado como valor de referencia, esta clavija está conectada a la mitad de la tensión. Por ejemplo, para establecer una referencia de 2V (Vref), pin9 está conectado a 1V (Vref / 2), reduciendo de este modo el tamaño del paso a 7.84mV (2V/255).
ADC0804 también necesita un reloj para operar. El tiempo de conversión del valor analógico a un valor digital depende de la fuente de reloj. Podemos conectar un reloj externo en el pin 4 o podemos hacer uso de su reloj incorporado, colocando de un circuito RC, como el mostrado en la siguiente figura.
Materiales:
LM35
ADC0804
TRIMPOT 10KOhm
8 Resistores de 220 Ohm
1 Resistor de 10K Ohm
Capacitores de:
1uF
22pF
Tarjeta de desarrollo Nexys 2
Software de Xilinx ISE
Fuente de 5 V
Osciloscopio
Multimetro digital
Desarrollo y resultados:
-Se caracterizó el Sensor y se concluyó que en efecto daba un voltaje a la salida de 10 mV por cada grado Centigrado, esto es, tenía un voltaje inicial de 0.26 V debido a que era la temperatura ambiente.
-Se decidió diseñar un circuito que midiera de 0 a 127 Grados centígrados, por lo que el sensor de temperatura no debe tener resistencia de carga o alimentación negativa, la pata de salida de Voltaje irá directo a la entrada analógica del ADC.
-Se decidió utilizar el reloj interno del ADC, para el que se utilizó la resistencia de 10 KOhm y un capacitor de 22pF. Lo que nos da una frecuencia, de 1/(RC*1.1) aproximadamente igual a 4132231 Hz.
-Para respetar la linealidad del sensor se decidió que el voltaje de referencia Vr o voltaje máximo debía ser 1.27 V, así que como dice el datasheet, para calibrar el sensor se deben poner Vr/2 aproximadamente igual a .64 V en la pata 9 del ADC, por lo que primero se instala en TRIMPOT entre voltaje y tierra, se ajustó con un multimetro al voltaje de referencia y exclusivamente después de eso se hace la conexión con la respectiva pata del ADC. Con esta calibración se obtendrá a la salida del ADC un numero binario que va del 0 al 127, que es lo que nos interesa, sin embargo este número binario no es enviado de una manera continua, debido al método de aproximaciones sucesivas que el ADC proporciona, además de que este número es en binario de máximo 7 bits, sólo se utilizaron los siete bits menos significativos a la salida del ADC para interfasar a la tarjeta de desarrollo.
-Fue utilizado un osciloscopio para determinar la frecuencia con la que el dato binario era enviado a la salida del ADC, se concluyó que el dato era repetido a aproximadamente 3.75 Khz, así que se muestreó con la tarjeta de desarrollo aproximadamente 20 veces en cada ciclo y hacer un promedio de ellas para así reducir el error.
El circuito obtenido además del código desarrollado en la tarjeta se reportan a continuación:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ter is
port(
bits: in std_logic_vector (11 downto 0);
bitsout: out std_logic_vector(11 downto 0);
an: out STD_LOGIC_VECTOR(3 downto 0);
SEGM: out STD_LOGIC_VECTOR(7 DOWNTO 0);
clk: in std_logic
);
end ter;
architecture Behavioral of ter is
signal Conta: integer;
signal Conta2: integer;
signal A1: std_logic_vector(11 DOWNTO 0);
signal A2: std_logic_vector(11 DOWNTO 0);
signal A3: std_logic_vector(11 DOWNTO 0);
signal A4: std_logic_vector(11 DOWNTO 0);
signal A5: std_logic_vector(11 DOWNTO 0);
signal A6: std_logic_vector(11 DOWNTO 0);
signal A7: std_logic_vector(11 DOWNTO 0);
signal A8: std_logic_vector(11 DOWNTO 0);
signal A9: std_logic_vector(11 DOWNTO 0);
signal A10: std_logic_vector(11 DOWNTO 0);
signal A11: std_logic_vector(11 DOWNTO 0);
signal A12: std_logic_vector(11 DOWNTO 0);
signal A13: std_logic_vector(11 DOWNTO 0);
signal A14: std_logic_vector(11 DOWNTO 0);
signal A15: std_logic_vector(11 DOWNTO 0);
signal A16: std_logic_vector(11 DOWNTO 0);
signal A17: std_logic_vector(11 DOWNTO 0);
signal A18: std_logic_vector(11 DOWNTO 0);
signal A19: std_logic_vector(11 DOWNTO 0);
signal A20: std_logic_vector(11 DOWNTO 0);
signal SUMA: STD_LOGIC_VECTOR(11 DOWNTO 0);
signal veinte: unsigned(11 downto 0):="000000010100";
signal PROM: STD_LOGIC_VECTOR(11 DOWNTO 0);
function divide (a : UNSIGNED; b : UNSIGNED) return UNSIGNED is
variable a1 : unsigned(a'length-1 downto 0):=a;
variable b1 : unsigned(b'length-1 downto 0):=b;
variable p1 : unsigned(b'length downto 0):= (others => '0');
variable i : integer:=0;
begin
for i in 0 to b'length-1 loop
p1(b'length-1 downto 1) := p1(b'length-2 downto 0);
p1(0) := a1(a'length-1);
a1(a'length-1 downto 1) := a1(a'length-2 downto 0);
p1 := p1-b1;
if(p1(b'length-1) ='1') then
a1(0) :='0';
p1 := p1+b1;
else
a1(0) :='1';
end if;
end loop;
return a1;
end divide;
----------------------------------------------------
function to_bcd ( bin : std_logic_vector(15 downto 0) ) return std_logic_vector is
variable i : integer:=0;
variable bcd : std_logic_vector(19 downto 0) := (others => '0');
variable bint : std_logic_vector(15 downto 0) := bin;
begin
for i in 0 to 15 loop -- repeating 8 times.
bcd(19 downto 1) := bcd(18 downto 0); --shifting the bits.
bcd(0) := bint(15);
bint(15 downto 1) := bint(14 downto 0);
bint(0) :='0';
if(i < 15 and bcd(3 downto 0) > "0100") then --add 3 if BCD digit is greater than 4.
bcd(3 downto 0) := bcd(3 downto 0) + "0011";
end if;
if(i < 15 and bcd(7 downto 4) > "0100") then --add 3 if BCD digit is greater than 4.
bcd(7 downto 4) := bcd(7 downto 4) + "0011";
end if;
if(i < 15 and bcd(11 downto 8) > "0100") then --add 3 if BCD digit is greater than 4.
bcd(11 downto 8) := bcd(11 downto 8) + "0011";
end if;
if(i < 15 and bcd(15 downto 12) > "0100") then --add 3 if BCD digit is greater than 4.
bcd(15 downto 12) := bcd(15 downto 12) + "0011";
end if;
if(i < 15 and bcd(19 downto 16) > "0100") then --add 3 if BCD digit is greater than 4.
bcd(19 downto 16) := bcd(19 downto 16) + "0011";
end if;
end loop;
return bcd;
end to_bcd;
-----------------------------------------------------------
SIGNAL AUX1:STD_LOGIC_VECTOR (11 DOWNTO 0);
SIGNAL AUX2:STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL BCD: STD_LOGIC_VECTOR (19 downto 0);
SIGNAL centenas: STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL decenas: STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL unidades: STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL principal: STD_LOGIC_VECTOR (3 DOWNTO 0);
constant delay_sw: integer := 499; -- 100 us velocidad de los segmentos
signal conta_sw: integer range 0 to delay_sw := 0;
TYPE DISPLAYS IS (unid,dec,cen);
signal estado_p, estado_f:DISPLAYS:=unid;
begin
process(clk)begin
if(clk'event and clk='1')then
If (conta<50000000) then
Conta<=Conta+1;
else
Conta<=0;
Suma<=A1+A2+A3+A4+A5+A6+A7+A8+A9+A10+A11+A12+A13+A14+A15+A16+A17+A18+A19+A20;
Prom<=std_logic_vector(divide(unsigned(Suma),veinte));
AUX1<=prom+5;
bitsout<=AUX1;
AUX2(15 DOWNTO 12)<="0000";
AUX2(11 DOWNTO 0)<=AUX1;
BCD<=to_bcd(AUX2);
end if;
end if;
end process;
PROCESS(CLK)BEGIN
IF(clk'event and clk='1')then
IF(conta2<333333)then
conta2<=conta2+1;
else
conta2<=0;
A1<=bits;
A2<=A1;
A3<=A2;
A4<=A3;
A5<=A4;
A6<=A5;
A7<=A6;
A8<=A7;
A9<=A8;
A10<=A9;
A11<=A10;
A12<=A11;
A13<=A12;
A14<=A13;
A15<=A14;
A16<=A15;
A17<=A16;
A18<=A17;
A19<=A18;
A20<=A19;
end if;
END IF;
END PROCESS;
process (BCD) begin
centenas<=BCD(11 downto 8);
decenas<=BCD(7 downto 4);
unidades<=BCD(3 downto 0);
end process;
process (estado_p) begin --Velocidad de los AN de los segmentos
case estado_p is when unid=> an<="1110";
estado_f<=dec;
when dec=> an<="1101";
estado_f<=cen;
when cen=> an<="1011";
estado_f<=unid;
when others => null;
end case;
end process;
process (clk,estado_p,estado_f)begin
if rising_edge (clk) then --Por cada flanco de subida se incrementa Sw
conta_sw<=conta_sw+1;
if conta_sw=delay_sw then --Si Conta_sw =4999 se reinicia en 0
conta_sw<=0;
estado_p<=estado_f;
end if;
end if;
end process;
principal<=unidades when estado_p=unid
else decenas when estado_p=dec
else centenas when estado_p=cen
else "0000";
SEGM<="00000011" when principal = "0000"
else "10011111" when principal = "0001"
else "00100101" when principal = "0010"
else "00001101" when principal = "0011"
else "10011001" when principal = "0100"
else "01001001" when principal = "0101"
else "01000001" when principal = "0110"
else "00011111" when principal = "0111"
else "00000001" when principal = "1000"
else "00011001";
end Behavioral;
El código realiza un muestreo del numero binario del ADC cada 333333 ciclos de reloj de la tarjeta (a 50MHz) y saca un promedio de los últimos 20 datos muestreados cada 50000000 ciclos de reloj (un segundo) y le suma un factor de corrección igual a 5 para ajustar a la misma temperatura.
A continuación una ilustración del circuito en funcionamiento:
Análisis de resultados
Los resultados experimentales nos mostraron que la datasheet es correcta al decir que la salida del LM35 es linealmente proporcional a su salida.
Al experimentar con el ADC y sus salidas a leds se observó que las salidas no eran confiables al verse a simple vista, por lo que se decidió utilizar la nexys para sacar el promedio de las salidas digitales para saber cuál era el valor real que nos estaba marcando el convertidor analógico digital. Una vez que se observó esto, nos pudimos dar cuenta que aunque la calibración del ADC fue correcta, se tenía que sumar una pequeña suma de corrección para ajustar al valor que el multimetro marcaba, pudiéndose quedar constante debido a que en efectivo la salida es lineal.
Analizando el caso de estudio podemos decir que para calibrar de una mejor manera necesitaríamos un medidor patrón, sin embargo es muy difícil medir las condiciones climáticas exactas, concluyendo que el sensor era muy exacto debido a que sabemos que la temperatura ambiente oscila entre los 24 a 27 grados, y eso es lo que nos da el sensor a temperatura ambiente, además de que se probó como un termómetro corporal, midiendo la temperatura de la axila, y que oscilaba entre 30 y 31 grados que como sabemos es la temperatura corporal promedio de un humano.
Conclusiones Individuales:
Clara Lugo Marcos De Oliveira
Durante la presente practica se concluyo que el sensor LM35 es uno de los más útiles en el mercado para medir temperatura, ya que su calibración en grados centígrados evita que tengan que corregirse mediante grandes sumas como es en el caso de los sensores calibrados en grados Kelvin.
También se concluyó que el ADC es un circuito muy útil para la conversión analógica digital, pero es necesario conocerlo a fondo para saber cómo manipularlo y sobre todo para poder utilizarlo e implementarlo no solo en proyectos como este, sino también en implementación del potenciómetro como sensor en un Joystick, por ejemplo.
Pudimos concluir la utilidad del dominio de al menos un tipo de lenguaje de programación en una tarjeta de desarrollo, para la implementación fácil y rápida de un circuito termométrico que tenga amplio rango de temperatura y sea útil para otras aplicaciones del tipo digital o analógico, debido a que con los datos digitales las posibilidades para procesar tal señal y utilizarla en diversas aplicaciones es infinita, por ejemplo en controles de temperatura de ambiente, o de alguna máquina, fuente regulada, sistema de acondicionamiento de temperatura, etc.
Juárez González Luis Angel
A través de esta práctica pudimos obtener lo que realmente se viene buscando durante todo el curso que es obtener una medición procesada y visible a partir de un sensor cuya señal es acondicionada para poder lograr esa medición. En este caso se logró a partir de un sensor de temperatura para lo cual se implementó el convertidor analógico digital y algoritmos de programación en una nexys 2. Pudimos notar que la realización del proceso de análisis de señales para poder usar un sensor puede ser complicado ya que generalmente hay que realizar la conversión de datos y un adecuado acondicionamiento además del análisis y consideración que debe tener nuestro procesador de señales para poder trabajar con los datos obtenidos del sensor. En nuestro caso resulto bastante educativo la realización de estos procesos ya que a diferencia de otras prácticas esta requirió la implementación de conocimientos de otras áreas para poder cumplir con el objetivo de la práctica.
Bibliografía
Ramón Pallas Areny, Sensores y acondicionador de señal, Cuarta edición
http://mikitronic.blogspot.mx/2013/05/sensor-de-temperatura.html Proyecto realizado con LM35 y ADC
http://www.ti.com/lit/ds/symlink/adc0802-n.pdf Datasheet oficial del ADC0804
http://www.ti.com/lit/ds/symlink/lm35.pdf Datasheet del LM35
Prácticas del curso de Dispositivos Lógicos Programables, Juan Antonio Jaramillo Gomez, UPIITA, 2017, como referencias para consulta de:
http://www.estadofinito.com/binario-bcd-7seg/ Por Carlos Ramos.