REPORTE SENSOR DE TEMPERATURA DIGITAL INSTRUMENTACIÓN INSTRUMENTACIÓN VIRTUAL
PROFESOR:
CESAR ALBERTO GOMEZ GUZMAN
ALUMNOS:
ERICK YSMAEL ROBLES PACHECO SAUL IBARRA ROSALES CHRISTIAN VALENTIN HERRERA ALCARAZ YAIR ESAÚ LÓPEZ MEDINA
GRUPO:
IMT-72
FECHA: 14/SEP./2012
INTRODUCCIÓN
Este reporte describe como lograr convertir una señal analógica de un sensor de temperatura (LM35) a una señal digital con el uso del ADC (Convertidor Analógico Digital) de un pic 16F887 mediante el lenguaje de programación en C; Acoplando la señal convertida para que la muestre en un display LCD de una forma precisa y exacta; es decir, al final tendremos un termómetro digital el cual nos mostrara la temperatura ambiente de cualquier lugar con exactitud y precisión.
DESARROLLO
Materiales Para la construcción del circuito es necesario de los siguientes materiales: PIC16F887 Display LCD de 2X16 (JHD162A SERIES) Potenciómetro 10k Sensor LM35 Resistencias (3 10k, 2 2.2k) Capacitor 25v 100uf Cable UTP
Descripción y funcionamiento del sensor LM35 El LM35 es un sensor de temperatura con una precisión calibrada de 1°C y un rango que abarca desde -55° a +150°C. El sensor se presenta en diferentes encapsulados pero el mas común es el to-92 de igual forma que un típico transistor con 3 patas, dos de ellas para alimentarlo y la tercera nos entrega un valor de tensión proporcional a la temperatura medida por el dispositivo. Observando la figura 1.1 podemos ver la configuración de los pines.
Figura 1.1 Configuración Pines LM35
La salida es lineal y equivale a 10mV/°C por lo tanto: +1500mV = 150°C +250mV = 25°C -550mV = -55°CG
Para hacernos un termómetro lo único que necesitamos es un voltímetro bien calibrado y en la escala correcta para que nos muestre el voltaje equivalente a temperatura. El LM35 funciona en el rango de alimentación comprendido entre 4 y 30 voltios. Podemos conectarlo a un conversor Analógico/Digital y tratar la medida digitalmente, almacenarla o procesarla con un microcontrolador o similar. Que es exactamente de la manera en que se hará en este proyecto.
Distribución de pines y funcionamiento del Display LCD 2X16 Veamos que función cumple cada uno de los pines del display:
Pines 1, 2 y 3: Estos pines están dedicados a la alimentación y contraste del LCD.
Efectivamente, el pin 1 (VSS) es el que se debe conectar al negativo (masa) de la alimentación, y el pin 2 (Vdd/Vcc) es el que va unido al positivo (5 voltios). El pin 3 permite el ajuste del contraste del panel. Ver figura 1.2.
Figura 1.2 Pines alimentación LCD
Pines 4, 5, 6: Estos pines son de alguna manera los que controlan el funcionamiento del
display. El pin 4, también llamado RS (Registration Select) es el que le indica al controlador interno del LCD que el valor presente en el bus de datos es un comando (cuando RS=0) o bien un carácter para representar (cuando RS=1).
El pin 5 (“R/W” por “Read/Write” o “Leer/Escribir”) permite decidir si queremos enviar
datos al display (R/W=0) o bien nos interesa leer lo que el display tiene en su memoria o conocer su estado (R/W=1). Por ultimo, el pin 6 (E por “Enable” o “habilitado”) es el que selecciona el display a utilizar. Es decir, podemos tener varios LCD conectados a un mismo bus de datos (pines 7-14) de control, y mediante E seleccionar cual es el que debe usarse en cada momento.
Pines 7, 8, 9, 10, 11, 12, 13, 14: Estos ocho pines son el “bus de datos” del controlador de
la pantalla. Llamados DB0-DB7 son los encargados de recibir (o enviar) los comandos o datos desde o hacia el display. DB0 es el bit de menor peso y DB7 es el más significativo.
Funcionamiento 8 y 4 bits:
Estos displays soportan dos modos de trabajo: en uno de ellos reciben en DB0-DB7 los 8 bits del dato, y en el otro, llamado “modo de 4 bits” reciben los datos en dos mitades
(nibbles) por los pines DB4-DB7, en dos pasos sucesivos. Si bien esto puede complicar ligeramente la programación, supone un ahorro de 4 pines en el bus de datos, y esto en microcontroladores con pocos pines de I/O es muy útil.
Figura 1.3 Esquema de posición y función de pines LCD
Funcionamiento y distribución de pines a usar en PIC 16F887
El pic tiene 40 pines de los cuales la mayoría son de multipropósito como podemos observar en la figura 1.4.
Figura 1.4 Distribución de pines y función PIC 16F887
Los pines a usar en este proyecto serán los siguientes: Pin 1 (MCLR): Este pin es usado para poner un botón para hacer un reset al pic. Pin 2 (AN0): Este pin es el que estará configurado para ser una entrada analógica, es decir
aquí conectaremos la señal del sensor LM35. Pin 3 (-VREF) y 4 (+VREF): Estos pines serán utilizados para introducir el voltaje de
referencia para la conversión de la señal analogía a digital. Pin 11 (Vdd) y 12 (Vss): Estos pines son la alimentación del pic la cual debe ser de 5v y no
mayor ya que si no se podría dañar el pic.
Pin 33 (RB0), 34 (RB1) y 35 (RB2): Estos pines serán utilizados para la comunicación del pic
con el LCD en los pines de control del mismo. Pin 37-40 (RB4-RB7): Estos pines serán los 4 bits enviados al LCD para su interpretación y
próximo muestreo en pantalla.
Instrucciones clave para la conversión de la señal analógica a digital en C
Configuración de puertos
Una de las instrucciones principales es la configuración de los puertos, para así decirle al pic cuales trabajaran como puertos de entrada y cuales como salida. Con la siguiente instrucción se configuran los pines que necesitamos como entrada los cuales son RA0, RA2 y RA3: SET_TRIS_A (0x0D); // RA0, RA2 y RA3 como entradas y las sobrantes como salidas. Donde:
SET_TRIS_A: Es la instrucción para la configuración del puerto A. (0x0D): Es el número hexadecimal que indica que pines serán activados como entradas.
Configuración del ADC (Convertidor Analógico Digital)
Antes de comenzar con la conversión se tiene que configurar el ADC para su correcto funcionamiento para esto se utilizan las siguientes instrucciones: SETUP_ADC_PORTS (sAN0 | VREF_VREF); // Pin AN0 como entrada analógica y pin 3 y 4
como entrada de referencia. Donde: SETUP_ADC_PORTS: Es la instrucción para la configuración de los pines que serán usados
como analógicos y los pines de voltaje de referencia. (sAN0 | VREF_VREF): Son los pines que serán utilizados para la conversión, SAN0 es el pin
de la entrada analógica y VREF_VREF son los pines de referencia.
Otra instrucción importante es el reloj con el que trabajara el ADC para su conversión y pertenece a la siguiente instrucción: SETUP_ADC (ADC_CLOCK_DIV_8); // se inicializa el ADC y se selecciona el reloj a utilizar
Fosc/8 Fosc=4Mhz. Se define los bits a utilizar para la conversión en el ADC, para tener un mejor resultado se debe elegir 10 bits: #device adc=10 // esta instrucción configura el adc a 10 bits, poner al principio de todo el
programa.
Calibración de la señal convertida por el ADC
Si tenemos que el sensor LM35 su temperatura máxima a censar es de 150 grados y por cada grado te entrega 10mv entonces obtenemos un voltaje máximo entregado por el sensor de: 10mv x 150 grados = 1.5V Para obtener una gran precisión en la conversión tenemos que poner el mismo voltaje como referencia; es decir, tenemos que poner un voltaje de referencia entre los pines 4 y 5 de 1.5V para así ese valor dividirlo entre los bits del ADC entonces tenemos que: 1.5V/1024= 0.001464 Entonces tendremos un salto de 0.001464 por cada bit que se tomara en cuenta en la conversión. Haciéndola muy precisa. Para lograr poner como referencia 1.5v en los pines 4 y 5 se tuvo que implementar un divisor de tensión resistivo; el cual, como su nombre lo dice divide la tensión de entrada según el arreglo de resistencias con las que cuente. El circuito es el siguiente:
Figura 1.5 Circuito divisor de tensión resistivo
Y su formula para calcular el voltaje de salida es el siguiente:
Con la ayuda de esta formula podemos dividir el voltaje a 1.5v y el Voltaje de salida conectarlo al pin 5 y el pin 4 a GND.
Conversión del valor obtenido por el ADC a grados
Una ves que ya tenemos con los bits que se va a trabajar para la conversión en el ADC y con el voltaje de referencia de 1.5v en los pines 4 y 5, se emplea la siguiente formula para obtener el valor en grados y así ya enviarlo al LCD para mostrarlo en pantalla.
) ( Donde: Temperatura: Valor en grados centígrados. 1.5: Tensión de referencia en pines 4 y 5. 1024: Valor en decimal de los 10 bits del conversor ADC: Valor Leído por el ADC del pin 2 (AN0). 0.01: División para convertir de mV a Grados.
Ya calculado el valor de la temperatura en grados se da por terminado la etapa de conversión de la señal analógica entregada por el sensor LM35 a la señal digital entregada por el pic para su procesamiento y próximo muestreo.
Circuito sensor de temperatura digital
Figura 1.6 Sensor de temperatura digital
Código en C para la programación del PIC16F887
#include <16F887.h> #device adc=10 #use delay(clock=8000000,RESTART_WDT) #include void init_io() { // Configurar Puerto A, Entrada y Salidas SET_TRIS_A(0x0D); // bit 0 = output, 1 = input } void init_adc() { // Configurar RA0 como entrada analogica, usar pines de VREF // Como tensión de referencia SETUP_ADC_PORTS(sAN0 | VREF_VREF); SETUP_ADC(ADC_CLOCK_DIV_8); } float leer_temp() { int16 adc; float temp; if (adc_conversion.new_flag == 1) { adc=adc_conversion.value; adc_conversion.new_flag=0; } temp=(((1.5/1024.0)*adc)/0.01); // conversión del valor del ADC a grados return temp;
} void main() { // Inicializar variables globales float temp adc_conversion.value = 0; adc_conversion.new_flag = 0; init_io(); init_adc(); //Configuraciones del pic ENABLE_INTERRUPTS(GLOBAL); // Habilitar todo los interruptores en general ENABLE_INTERRUPTS(INT_RTCC); // Habilitar interruptor 0 lcd_init(); setup_oscillator(OSC_8MHZ|OSC_INTRC); setup_spi(FALSE); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); //Inicio de código del programa //Instrucciones a mostrar en pantalla LCD lcd_gotoxy(1,1); printf(lcd_putc,"MECATRONICA IMT72"); delay_ms(700); lcd_gotoxy(1,1); printf(lcd_putc," SENSOR \n LA TURBIA "); delay_ms(700); lcd_gotoxy(1,1); printf(lcd_putc,"INICIANDO... "); delay_ms(700); printf(lcd_putc,"\f");
while (1) { temp=leer_temp(); lcd_gotoxy(1,1); printf(lcd_putc,"TEMPERATURA ACT.\n
%2.1f C
",temp);
delay_ms(100); printf(lcd_putc,"\f"); } }
Imagen del circuito real funcionando
Figura 1.7 Circuito elaborado en protoboard