Posteado por: miguelio | julio 10, 2008

Control de temperatura con sensor LM35DZ

Desde hace un tiempo estoy mejorando un desarrollo a pedido de un dispositivo configurable y escalable que controle la temperatura de una cuba para descongelar objetos. Originalmente utilizaba el sensor NTC4K7, un termistor, pero desde que se proyectó agregar un display que indicara la temperatura en todo momento me pasé al LM35.

Este integrado entrega una tensión lineal ante el cambio de temperatura, lo cual es ideal para leerlo con el módulo AD. Opera en un rango de voltaje bastante extendido(4V a 30V) y su precisión es aceptable(aprox. 0.5ºC).

Viene en toda una familia de presentaciones, variando los empaquetados, la precisión y los rangos de temperatura. El que utilizé es el LM35DZ que ven en las imágenes; se trata de un empaquetado TO-92 de tres patas, dos para la alimentación y la restante para la señal entregada. Su rango de temperaturas va de 0ºC a 100ºC.

Es muy fácil leer la salida de este sensor utilizando el ADC del PIC(16F873A o cualquier 16F87xA). El LM35 hace variar la tensión 10mV/ºC. Si colocamos en la pata A3 una tensión de referencia de 2.56V para el módulo ADC(configurado en 10 bits) tendremos un valor nuevo cada 2,5mV, es decir, cada 0,25ºC; suficiente como para mostrar temperatura en un display con la precisión que entrega el integrado. Luego conectamos la salida del sensor a A0 para tomar las lecturas.

El código utilizado para inicializar el módulo ADC y sensar la temperatura es el siguiente(para CCS PCWH C Compiler) :

int16 value;
int16 temp;

void inicializar(){
setup_adc(ADC_CLOCK_DIV_8);
setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);
set_adc_channel(0);
}

void leer_temperatura() {
delay_ms(100);
value = Read_ADC();
//calculo la temperatura en centesimas de grado
temp = value * 25;

//luego la puedo pasar a un display para su visualización
//o controlar algo de acuerdo a la temperatura o lo que sea.
}


Respuestas

  1. Excelente artículo compañero!!
    Justamente estaba buscando eso por la terminación DZ teniamos dudas.

    Fue de mucha ayuda

    ahh y en el valor de la temperatura tengo dudas… no es
    temp = value * 100 ??? en lugar de *25?

    bueno, más que nada quería agradecer tu artículo 🙂

  2. Hola Karly, gracias por tus comentarios.

    Te cuento que es Temp = value * 25

    fijate que si la lectura en value es 4 por ejemplo, significa que el módulo ADC obtuvo una tensión de entrada de (2.56V / 1024) * 4 = 0.01V que corresponden a 1ºC.

    Entonces, al hacer temp = 4 * 25 el resultado es 100 centésimas de grado, es decir 1ºC. (fijate en mis comentarios que estoy calculando la temperatura en centésimas de grado).
    Es como hacer 4 * (2.56V / 1024) * 10000 para pasarlo a centésimas. Fijate que (2.56V / 1024) * 10000 = 25.

    Todo esto es así porque uso una tensión de referencia de 2.56V, con otro valor, todo cambiaría.

    Las fórmulas generales serían estas:

    Tensión_leida = (Vref / precisión) * valor_leido

    Temperatura(ºC) = Tensión_leida * 100

    Vref: tensión de referencia del módulo ADC, si no explicitas ningúna, suele ser 5V.

    precisión: cantidad de valores distintos que entrega el módulo ADC, si trabajas en 10 bits, es 1024, en 8 bits sería 256.

    valor_leido: es el valor de la lectura del módulo ADC.

    Espero que te sirva de ayuda

    saludos

    Miguel

  3. buen articulo

  4. gracias jorge

  5. Hola muy buena la data pero cuando lo compilo me tira este erro:
    Error 12 «Contador.c» Line 121(21,34): Undefined identifier AN11_VSS_VREF
    me podran ayuda???
    gracias


Deja un comentario

Categorías