LM92: Termómetro I2C de 12Bits

LM92: Termómetro I2C de 12Bits

0 Flares Twitter 0 Facebook 0 Google+ 0 Pin It Share 0 Email -- 0 Flares ×

LM92 es un sensor de temperatura digital que posee conectividad I2C, una exactitud de hasta 0,33°C en la medición y 12 bits de resolución. Esto representa variaciones de temperatura de tan solo 0,0625°C. Estas cualidades lo transforman en un termómetro ideal para sistemas de alta precisión donde la temperatura es un factor crítico a monitorear. Junto a un sistema de “ventana” de comparación térmica, posee alarmas por baja temperatura, alta y hasta por temperatura crítica. Los ajustes de estos valores son programables de manera muy sencilla y creemos que ya no podemos seguir contándote las bondades de este dispositivo; es momento de que ingreses al artículo y te asombres con este montaje didáctico, sencillo y profesional.

Un medidor de temperatura sencillo puede admitir errores de acuerdo al ámbito donde se utilice y según las necesidades que la aplicación requiera. No será lo mismo un sensor de temperatura para un termómetro domiciliario que para un equipo médico, por ejemplo, una incubadora de bebés. Tampoco será igual el empleado en el letrero luminoso de una esquina de la ciudad que el utilizado en un invernadero, es decir, para cada aplicación las exigencias pueden cambiar de manera radical. National Semiconductor nos ofrece, en el LM92, un producto de la más alta calidad para desarrollos donde las exigencias sean rigurosas, donde los rangos de temperaturas a medir tengan una extensión considerable (-55°C a +150°C) y cuando debamos obtener un desempeño destacado. Muchas características te hemos adelantado en el encabezado del artículo, pero en el desarrollo de este texto podrás comprobar lo sencillo que es acceder a un sistema de control térmico de calidad profesional.

LM92: Termómetro I2C de 12Bits

El LM92, como comentamos antes, brinda la posibilidad de trabajar con lo que se llama una “ventana térmica”. El circuito integrado posee un registro (programable) que almacena un valor mínimo de temperatura por debajo del cual, una alarma se activa. Es decir, podemos programar el registro mencionado para que haga sonar una alarma si la temperatura del criadero de aves descendió de una determinada temperatura y los animales corren riesgo. Así, el sistema avisará con un alerta que la temperatura ha descendido por debajo de un nivel prefijado. A este registro se lo conoce como T_LOW y por supuesto, también existe otro registro similar que ofrecerá un aviso al superar un nivel alto de temperatura: el registro T_HIGH. De este modo, por debajo de un valor térmico programable y por encima de otro, las alarmas se activan. Eso es la “ventana térmica”: los valores que quedan comprendidos entre T_LOW y T_HIGH. Asociado a estos niveles existe un tercero que es la lógica histéresis que debe tener la activación o no de las alarmas para evitar situaciones confusas o disparos intermitentes.

LM92: Termómetro I2C de 12Bits

Las salidas de estas alarmas se presentan al usuario en un mismo pin (5) con el nombre INT. Esto es lógico debido a que la alarma avisará cuando la temperatura esté fuera de los valores de “ventana”. La salida es Open Drain y en consecuencia su habilitación producirá un estado lógico bajo en el mencionado pin del dispositivo. Recordemos que Open Drain es la analogía al Open Colector (Colector Abierto) pero realizado con transistores MOSFET tal como se puede ver en el diagrama superior. Allí se puede observar también que existe un cuarto registro que activa una alarma cuando ya las lecturas térmicas superan un valor crítico. El registro T_CRIT también programable y de manera habitual se ajusta con la finalidad de preservar estructuras físicas, evitar daños al propio sistema electrónico y, como decíamos, se suele ajustar a  valores altos de lectura. De todos modos, puedes moverte dentro de lo que el rango de medición que el LM92 te permite. Esto es, puedes ubicar la temperatura crítica por debajo de la ventana térmica y disparar una alarma cuando la temperatura descienda a niveles demasiados peligrosos (congelación). Es importante que tengas en claro este concepto. La temperatura crítica no sólo es aplicable a valores altos sino que también puede actuar a niveles muy bajos. Mientras ubiques ese valor fuera de la ventana térmica, el trabajo de esta alarma tendrá sentido y del mismo modo que la anterior, se presenta como Open Drain en el pin 3.

LM92: Termómetro I2C de 12Bits

Los valores que adopta el dispositivo al iniciar su trabajo cada vez que se le aplica energía es el siguiente:

  • Histéresis de temperatura (T_HYST) = 2°C
  • Temperatura Baja (T_LOW) = 10°C
  • Temperatura Alta (T_HIGH) = 64°C
  • Temperatura Crítica (T_CRIT) = 80°C

Luego, estos valores pueden ser cambiados al inicializar el funcionamiento mediante el programa del microcontrolador. De este modo, el LM92 ahorra muchas líneas de código al programador  evitando tener que utilizar pines del microcontrolador para las alarmas o para organizar la secuencia de trabajo de la ventana térmica, la temperatura crítica y la histéresis de activación/desactivación. El ahorro del tiempo de programación, al igual que los recursos de hardware han sido muy bien pensados y ejecutados por la gente de National Semiconductor en el diseño del LM92. Eso nos permite utilizar estructuras básicas para trabajar. Por ejemplo, en nuestro caso hemos utilizado nuestro clásico hardware Amicus para llevar a cabo el montaje. Aprovechando el mismo diseño base que hemos empleado para otros montajes, nos apoyamos en el PIC 18F25K20 que es un procesador muy versátil y confiable, ideal para este tipo de desarrollos. El circuito adoptado, por lo tanto, es el siguiente:

LM92: Termómetro I2C de 12Bits

Gracias a que el LM92 permite una alimentación que puede ser de 3,3Volts o de 5Volts (2,7V a 5,5V) aprovecharemos la misma alimentación que el PIC para realizar el trabajo. Las líneas SDA y SCL utilizan resistencias “pull-up” de 1K y las salidas Drain abierto de las alarmas se conectan de manera muy sencilla con un LED y una resistencia limitadora a la línea de tensión de 3,3Volts. El LED amarillo que se observa en el diagrama está colocado para ayudarnos en el trabajo de programación. La idea básica de su uso es hacerlo encender al principio de alguna rutina “importante” y apagarlo al final de la misma. Es una de las mil formas que puedes tener para ayudarte en la programación. Si el LED destella es porque el ciclo de programa se completa, si no lo hace es porque se interrumpe en algún sitio y de acuerdo al estado puedes descubrir donde se detiene la ejecución del programa. En nuestro ejemplo, su funcionamiento se encuentra antes de la toma de datos y al finalizar la presentación en el LCD siguiendo un orden muy sencillo de programa:

  • Declaro las variables a utilizar.
  • Escribo los registros de temperaturas a los valores que voy a utilizar.
  • Comienzo un lazo infinito y enciendo el LED.
  • Leo por Bus I2C el registro de temperatura.
  • Realizo el proceso sobre la información obtenida y la presento en el LCD.
  • Apago el LED y espero un tiempo hasta volver a iniciar el lazo.

Eso es todo el programa necesario para hacer funcionar al LM92 y aprovecharlo en sus funciones más importantes. Luego de observar este video donde hacemos una introducción al funcionamiento de nuestro desarrollo veremos la forma en que se organiza la estructura de los registros y cómo podemos trabajar con ellos.

Como todo dispositivo I2C, el LM92 posee un protocolo de comunicaciones que, mediante una estructura determinada, se comunica con el PIC intercambiando todos los datos necesarios para un funcionamiento apropiado. En este caso, la estructura está explicada en la hoja de datos del LM92 (Pág. 13, Fig.6) y haremos un pequeño repaso de cómo es el funcionamiento que hemos utilizado para ayudarte a que comprendas de manera más rápida los pasos a seguir y no pierdas el tiempo valioso que puedes emplear en el desarrollo del resto de la aplicación. Comenzamos entonces con “abrir” el bus I2C mediante la instrucción HBSTART. En Amicus, este formato de instrucción indica que utilizaremos el módulo MSSP del PIC para realizar la comunicación. Dicho de otro modo, usaremos los pines dedicados por hardware para facilitar el trabajo del PIC. Luego de abrir el canal de diálogo, nos abocaremos a escribir los registros internos del LM92, si es que deseamos cambiar los límites de trabajo de las alarmas respecto a los valores que el dispositivo trae programado por defecto al momento de inicializar su funcionamiento. Por este motivo, si deseamos trabajar con valores diferentes a los que trae el LM92 por “default”, dentro de la estructura de nuestro programa en el PIC, debemos escribir nuestros valores de trabajo.

LM92: Termómetro I2C de 12Bits

La escritura es muy sencilla y se divide en dos partes. Primero se le indica al “puntero” (Pointer) del LM92 el registro sobre el cual vamos a trabajar. Este trabajo se realiza “escribiendo” con la instrucción HBUSOUT seguida de la dirección (Address Byte) del LM92 dentro del bus y posteriormente del número de registro. Por ejemplo: para indicarle al puntero que trabajaremos sobre el registro T_LOW, escribiremos una instrucción {HBUSOUT Address Byte, [N° de Registro]}. De este modo, el LM92 se prepara para recibir una actividad en ese registro que puede ser de escritura o de lectura. En este caso será de escritura, pero del mismo modo podemos proceder para tomar lectura del valor almacenado en el registro cuando realicemos desarrollos más complejos con ventanas dinámicas de trabajo. Es decir, cuando el sistema se encargue de adecuar en forma automática los valores de la “ventana térmica” en función de las necesidades del diseño y del desarrollo del programa ejecutado por el PIC.

LM92: Termómetro I2C de 12Bits

Luego, escribimos el valor adecuado con el siguiente formato: {HBUSOUT Address Byte, N° de Registro, [Dato a escribir]}. De este modo, y como puedes ver en la imagen superior, se modifican los registros internos del LM92.  Al descargar y leer el listado que forma el programa observarás que donde dice “Escribo” en la imagen superior significa que el programa está indicando la dirección del LM92 dentro del Bus con el último bit (R/W) en cero para indicar escritura. Luego, cuando realicemos una lectura este bit cambiará a un uno lógico y la etiqueta cambiará de nombre. Por último, cuando todos los registros sean escritos, según nuestro criterio, cerraremos la comunicación I2C mediante la instrucción HBSTOP. De este modo, ya estamos en condiciones de comenzar a leer la temperatura obtenida mediante el LM92 y presentarla en un LCD o procesarla de acuerdo a las necesidades del hardware que estamos desarrollando. Este trabajo es tan sencillo como el anterior. La estructura es la misma y pasamos a leer el registro donde se almacena el valor obtenido mediante la instrucción HBUSIN. En el ejemplo mostrado abajo, “LEO” es la dirección (Address Byte) con el último bit habilitando el proceso de lectura.

LM92: Termómetro I2C de 12Bits

Veamos ahora como se organizan los dos bytes de datos y cómo haremos para extraer la información de temperatura o, en el proceso inverso, como hacemos para escribir un valor útil en cualquiera de los registros. Los datos vienen organizados en una palabra de dos bytes que vistos en forma lineal se presentan de la siguiente manera:

LM92: Termómetro I2C de 12Bits

En cualquiera de los registros encontramos que el bit de la posición D15 nos indicará el signo de la temperatura observada. Es decir, si es sobre cero D15 tendrá un valor bajo y si es bajo cero el LM92 nos devolverá en esa posición un uno lógico. Por otro lado, las posiciones D0, D1 y D2 nos devuelven el estado (Status) de las alarmas al momento de la lectura mientras que no intervienen al momento de la escritura de cualquiera de los demás registros. Luego de utilizar y descartar estos tres bits iniciales observamos que los bits útiles nos quedan comprendidos entre D3 (Bit 0) y D14 (Bit 11) y de esta manera queda alojada en 12 Bits la información de temperatura. Dentro de esta estructura, los cuatro bits de menos peso (LSB) se procesan de manera separada obteniendo de ellos los decimales de la medición. Recordemos que el LM92 ofrece “pasos” de 0,0625°C y por este motivo 15 pasos (4 bits) significarán 0,9375°C. Esto te permite apreciar la calidad de medición que nos ofrece el LM92. Finalmente, sobreviven las posiciones D7-D14 las que se tratan como un byte convencional y su valor expresado en decimal será el valor entero de la temperatura. Combinando la parte decimal con la entera llegamos al resultado final que mostramos en el LCD.

LM92: Termómetro I2C de 12Bits

Los términos TEMP, T6, T3, T1, T4 y T5 son las variables usadas para cargar los valores que el programa necesita y se declaran al inicio del mismo. Observando la imagen encontramos que existe un condicional IF que se encarga de determinar el valor que toma D15 (el bit del signo). Por su peso, D15 equivale a un decimal igual a 256, por lo tanto, si la variable supera el valor 255 será indicación de que el LM92 está registrando temperaturas bajo cero. Recuerda: si D15 adopta un valor igual a uno, la temperatura es bajo cero. A partir de esto, la presentación se transforma a lo que se conoce como “complemento a dos”. Al ver la hoja de datos puede parecer que todo el sistema enloquece y hay que reprogramar todo de diferente manera, sin embargo, la forma de manejar un “complemento a dos” es invirtiendo el valor obtenido y sumándole una unidad. Por ejemplo, si el byte 11100111 está expresado en “complemento a dos”, debemos invertirlo (00011000) y sumarle una unidad obteniendo el número 00011001. En lenguaje BASIC esto es muy sencillo de realizar con una única instrucción (T6 = ~T6 + 1). De este modo entonces, el LM92 nos ofrece los valores de temperatura bajo cero.

LM92: Termómetro I2C de 12Bits

Esta es la manera en que podemos escribir y leer los registros en el LM92. Sólo debemos comprender y aprovechar el uso de las herramientas que nos ofrece el lenguaje de programación utilizado y de este modo, sacaremos el mejor provecho del sistema. La última aclaración que vale indicar, y que es importante a la hora de realizar un proyecto con este dispositivo es saber que, mientras el microcontrolador “lee” el registro de temperatura, los indicadores de alarmas dejan de funcionar. Por más rápido que sea el bus I2C, o el lenguaje compilador utilizado, existe un vacío de indicación durante la adquisición del dato de temperatura. Para evidenciar este fenómeno, en nuestro programa de ejemplo, asignamos al LED amarillo una duración de encendido/apagado para que, contrastándola con la duración de la interrupción en la indicación de la/las alarma/s del LM92, se note la diferencia. Es decir, se observe este proceso de manera clara y se interprete mejor el funcionamiento. De este modo llegamos al fin al video donde te mostramos al LM92 en acción activando todas las alarmas y haciendo gala de sus características. No te lo pierdas:

Existen muchos circuitos integrados en el mercado que ofrecen la posibilidad de brindarnos su funcionamiento como medidores de temperatura, pero muy pocos ofrecen tantas funciones en un mismo encapsulado como lo hace el LM92. Un dispositivo muy útil para infinitas aplicaciones donde la precisión, exactitud y el control estricto de la temperatura deben ser los factores fundamentales del diseño. Te esperamos en el Foro de Electrónica de NeoTeo para que nos cuentes tus experiencias con el LM92. ¡Visítanos!


Avatar de Mario
Autor: Mario
  • Heliotropo

    Como siempre componentes que no se consiguen, esta muy bueno todo lo guardare para cuando pueda conseguirlos.

    • Digi-Key
    • quierotodoservido

      ni siquiera sabeis usar google?

    • Mario Sacco

      Hola Heliotropo!

      Si no deseas comprarlo como te han sugerido, puedes pedir muestras gratis al fabricante (National Semiconductor) mediante este enlace: http://www.national.com/mpf/LM/LM92.html#Order

      Todos los dispositivos que analizamos en NeoTeo se consiguen Heliotropo. Si así no fuera, nosotros no podríamos hacer los artículos ;)

      Saludos!
      Mario

      • Heliotropo

        Mario Saco, pues a mi pais no envian muestras gratis (Colombia), acaso creen que soy tan torpe de no saber que en Digikey, Farnel y algunos otros, venden esos componentes, ustedes creen que todos los que trabajamos con la electronica tenemos dinero para poseer una maldita tarjeta de credito y poder comprar en esos sitios, lo que mas enoja es la gente que trata de ignorante a alguien si siquiera conoserlo como "quierotodoservido", que es tan "GIL" que cree que todos tienen dinero para tarjetas de credito. Ademas si fuera el caso para comprar uno solo puedo usar el DS18S20, o el DS18B20 que se consiguen en Bogota a buen precio y para el dia siguiente.

      • Carlos Ochoa

        #9Cordial Saludo, estoy necesitando conseguir el sensor DS18B20 en Bogotá, por casualidad sabes en que almacén lo venden?

      • Mario Sacco

        Oye amigo, no hay que ponerse nervioso.

        Comprendo que la situación económica no es la misma para todos. De todos modos comprende tú también que no puedo saber y conocer qué componentes existen en un lado u otro, ni tampoco saber cuál es el que puedas tener disponible de manera sencilla.
        Por otro lado, intentamos hacer ensayos con componentes nuevos y con un desempeño mejor que los tradicionales.
        Es intentar algo mejor, míralo por ese lado. Lo mismo ocurre con microcontroladores y otros materiales. No podemos limitarnos. Debemos intentar superarnos a diario.

        Por último, ¿cómo es eso que a Colombia no envían Samples? Tengo muchos amigos Colombianos que reciben sin problemas muestras gratis. Recuerda, no uses mails populares (yahoo, hotmail, gmail, etc.), consigue alguno con dominio propio.

        El tema del dinero es algo que no puedo manejar lamentablemente. Esperemos poder satisfacerte con otro artículo pronto.

        Y recuerda, no te enojes ;)
        Saludos!
        Mario

      • Mario Sacco

        Hola de nuevo Heliotropo

        Mira este enlace.
        Amigos de Colombia que reciben Samples.
        http://www.neoteo.com/foro/f9/samples-en-electronica-1063/

        Saludos!
        Mario

      • Heliotropo

        Hola mario, la cosa no es con ud, de hecho puse que guardaria el articulo para cuando puediera conseguirlo, mi protesta es para aquellas personas que les gusta tratar de ignorantes a las personas que nisiquiera conosen.

  • cashnebula

    Saludos y felicidades gente de NEOTEO por seguir siempre con material tan interesante.
    Les quiero pedir un gran favor- He buscado ya un buen rato un video que pusieron aquí hace mas de un año o dos y no lo encuentro, parece que en las recomendaciones semanales.
    Trata sobre un robot que esta en una plaza comercial creo, sentado al lado de una máquina de refrescos pidiendo limosna, nadie le da y se levanta para disparar a un edificio que tiene el logo de apple o micorsoft no me acuerdo. No se como buscarlo en youtube. Y aqui ya le perdí la pista. Si me indicaran el camino se los agradecería

    • Mario Sacco

      Lamento no poder ayudarte con eso del video.
      Quizás Max lo recuerde y pueda ayudarte. Podrías consultar en el foro también. Allí se reúne mucha gente que puede saberlo.

      Ojalá lo encuentres.
      Saludos!
      Mario

  • Eduard

    Hola Mario, muy bueno el articulo, con respecto a la precisión sera mas eficiente leer la información del censor por medio de I2C o por conversión A/D? obviamente si el censor lo permite como el clasico LM35.

    • Mario Sacco

      Hola Eduardo! :))

      Creo que con el LM92 tenemos un componente que supera a muchos ADC. Habría que trabajar con ADC muy caros y difíciles de obtener para lograr mayor resolución que 12 Bits. Por supuesto que los hay pero no sé si en temperatura una variación menor a 0,0625°C sea útil o necesaria. Estamos hablando de 1/16 de grado centígrado!!!

      Por otro lado, los errores introducidos (por múltiples razones) en la comunicación entre el LM35 y el ADC pueden resultar en marcaciones muy fuera de valor.

      Aquí, con el LM92, todo está en un mismo encapsulado y no hay posibilidades de errores.

      Resumiendo:
      Sí, se podría lograr mayor resolución pero me parece innecesario y suceptible a presentar errores.
      Más seguro y listo para usar tenemos al LM92 :))

      Saludos!
      Mario

  • rele

    ¿Como se podrian montar varios sobre el mismo bus?

    Saludos Mario y demas amigos.

    • Mario Sacco

      Hola rele!

      La hoja de datos del LM92 explica que realizando combinaciones con A0 y A1 (pines 6 y 7 del LM92) entre Vcc y GND puedes lograr 4 combinaciones diferentes. Esto es, puedes colocar hasta 4 sensores conectados al mismo bus.

      Saludos!
      Mario

  • Aremberg

    Hola…
    Muchas gracias Mario…
    Muy interesante y directo a favoritos. Está muy bien este chip, y muy a tener en cuenta, pero le veo un problema que ya viene siendo habitual, el encapsulado. Si hubiera variante en PDip, mucho mejor. Probablemente se ha dicho antes, pero , si no te lo has hecho tú, ¿me puedes repetir algún sitio donde se pueda conseguir la plaquita conversora de Sop a Pdip?
    Muchas Gracias

  • rele

    Gracias Mario y de nuevo un saludo.

    Antonio.

    • Mario Sacco

      Gracias a tí Antonio!

      Saludos!
      Mario

  • Truko

    Excelente como siempre :D yo todavía tengo todo los articulo de I2c guardado probe con proteus y PIC-C ccs pero no lo he dominado del todo. Con respecto a los componentes es cierto alguno lugares no llegan las muestras gratis y si no es difícil conseguir es caro, de todo modo es para ponerse bravo o nervioso, lo importante es el conocimiento que el maestro mario no da en los articulo ejemplo el proyecto usando lo cabezales de un VHS, no hice ese proyecto pero entendí el principio de los cabezales y ese día quede muy contento como que había aprendido algo ese día =D

  • benjamin

    muy buenos los tutoriales!!!

  • jorge henao

    cordial saludo, tienes el codigo .asm porque no lo vi,, gracias

  • Enrique

    Muy buen articulo. ¿Cuantos metros como máximo de cable creis que podrian separar el sensor del microcontrolador?

  • luis

    el codigo asm que esta para descargar fue el que utilizaron para este proyecto ya que cuando lo compilo en mplab me envia demaciados errores T_T ayudaaaa