INSTRUMENTACIN VIRTUAL
ALUMNOS: ERICK YSMAEL ROBLES PACHECO SAUL IBARRA ROSALES CHRISTIAN VALENTIN HERRERA ALCARAZ YAIR ESA LPEZ MEDINA
GRUPO: IMT-72
FECHA: 14/SEP./2012
INTRODUCCIN
Este reporte describe como lograr convertir una seal analgica de un sensor de temperatura (LM35) a una seal digital con el uso del ADC (Convertidor Analgico Digital) de un pic 16F887 mediante el lenguaje de programacin en C; Acoplando la seal convertida para que la muestre en un display LCD de una forma precisa y exacta; es decir, al final tendremos un termmetro digital el cual nos mostrara la temperatura ambiente de cualquier lugar con exactitud y precisin.
DESARROLLO
Materiales
Para la construccin del circuito es necesario de los siguientes materiales: PIC16F887 Display LCD de 2X16 (JHD162A SERIES) Potencimetro 10k Sensor LM35 Resistencias (3 10k, 2 2.2k) Capacitor 25v 100uf Cable UTP
La salida es lineal y equivale a 10mV/C por lo tanto: +1500mV = 150C +250mV = 25C -550mV = -55CG
Para hacernos un termmetro lo nico que necesitamos es un voltmetro bien calibrado y en la escala correcta para que nos muestre el voltaje equivalente a temperatura. El LM35 funciona en el rango de alimentacin comprendido entre 4 y 30 voltios. Podemos conectarlo a un conversor Analgico/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.
Pines 1, 2 y 3: Estos pines estn dedicados a la alimentacin y contraste del LCD. Efectivamente, el pin 1 (VSS) es el que se debe conectar al negativo (masa) de la alimentacin, 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.
Pines 4, 5, 6: Estos pines son de alguna manera los que controlan el funcionamiento del display. El pin 4, tambin 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 carcter para representar (cuando RS=1).
El pin 5 (R/W por Read/Write o Leer/Escribir) permite decidir si queremos envi ar 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 ms 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 programacin, supone un ahorro de 4 pines en el bus de datos, y esto en microcontroladores con pocos pines de I/O es muy til.
El pic tiene 40 pines de los cuales la mayora son de multipropsito como podemos observar en la figura 1.4.
Los pines a usar en este proyecto sern los siguientes: Pin 1 (MCLR): Este pin es usado para poner un botn para hacer un reset al pic. Pin 2 (AN0): Este pin es el que estar configurado para ser una entrada analgica, es decir aqu conectaremos la seal del sensor LM35. Pin 3 (-VREF) y 4 (+VREF): Estos pines sern utilizados para introducir el voltaje de referencia para la conversin de la seal analoga a digital. Pin 11 (Vdd) y 12 (Vss): Estos pines son la alimentacin del pic la cual debe ser de 5v y no mayor ya que si no se podra daar el pic.
Pin 33 (RB0), 34 (RB1) y 35 (RB2): Estos pines sern utilizados para la comunicacin del pic con el LCD en los pines de control del mismo. Pin 37-40 (RB4-RB7): Estos pines sern los 4 bits enviados al LCD para su interpretacin y prximo muestreo en pantalla.
Configuracin de puertos Una de las instrucciones principales es la configuracin de los puertos, para as decirle al pic cuales trabajaran como puertos de entrada y cuales como salida. Con la siguiente instruccin 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 instruccin para la configuracin del puerto A. (0x0D): Es el nmero hexadecimal que indica que pines sern activados como entradas.
Configuracin del ADC (Convertidor Analgico Digital) Antes de comenzar con la conversin 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 analgica y pin 3 y 4 como entrada de referencia. Donde: SETUP_ADC_PORTS: Es la instruccin para la configuracin de los pines que sern usados como analgicos y los pines de voltaje de referencia. (sAN0 | VREF_VREF): Son los pines que sern utilizados para la conversin, SAN0 es el pin de la entrada analgica y VREF_VREF son los pines de referencia.
Otra instruccin importante es el reloj con el que trabajara el ADC para su conversin y pertenece a la siguiente instruccin: 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 conversin en el ADC, para tener un mejor resultado se debe elegir 10 bits: #device adc=10 // esta instruccin configura el adc a 10 bits, poner al principio de todo el programa.
Calibracin de la seal convertida por el ADC Si tenemos que el sensor LM35 su temperatura mxima a censar es de 150 grados y por cada grado te entrega 10mv entonces obtenemos un voltaje mximo entregado por el sensor de: 10mv x 150 grados = 1.5V Para obtener una gran precisin en la conversin 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 conversin. Hacindola muy precisa. Para lograr poner como referencia 1.5v en los pines 4 y 5 se tuvo que implementar un divisor de tensin resistivo; el cual, como su nombre lo dice divide la tensin de entrada segn el arreglo de resistencias con las que cuente. El circuito 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.
Conversin del valor obtenido por el ADC a grados Una ves que ya tenemos con los bits que se va a trabajar para la conversin 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 centgrados. 1.5: Tensin de referencia en pines 4 y 5. 1024: Valor en decimal de los 10 bits del conversor ADC: Valor Ledo por el ADC del pin 2 (AN0). 0.01: Divisin para convertir de mV a Grados.
Ya calculado el valor de la temperatura en grados se da por terminado la etapa de conversin de la seal analgica entregada por el sensor LM35 a la seal digital entregada por el pic para su procesamiento y prximo muestreo.
#include <16F887.h> #device adc=10 #use delay(clock=8000000,RESTART_WDT) #include <lcd_portb.c> 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 tensin 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); // conversin 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 cdigo 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 delay_ms(100); printf(lcd_putc,"\f"); } } %2.1f C ",temp);