Tutorial Xiii

10
TUTORIAL XIII OBJETIVOS Crear códigos en C de mayor complejidad. Aplicar Conversión Análogo/Digital a sensores. Realizar el Proyecto 13 y 14: Sensor de temperatura LM35 y Sensor Infrarrojo GP2D12. Repasar y reafirmar los conceptos vistos hasta el momento. PROYECTO 13: Sensor de Temperatura LM35 Para este proyecto vamos a sensar temperatura con el LM35 y la vamos a visualizar en ºC en tiempo real en la LCD haciendo uso de la Conversión Análogo/digital vista en tutoriales anteriores. El LM35 en particular devuelve un voltaje que es directamente proporcional a la temperatura en grados Celsius a razón de 10 mV/ºC Puede medir de -55ºC a 150ºC aunque para esta practica va a usar de 0ºC a 100ºC aprox. Se alimenta con un voltaje de 4V a 20 V. Dispone de 3 pines para conexionado: dos para alimentación y uno que da el voltaje de salida tal como se muestra en la figura a la izquierda. Como vamos a trabajar de 0 a 100ºC aprox. el máximo voltaje de salida del sensor será de 1 Volt aprox. Por tanto tenemos varias opciones para conectar y configurar el sensor al PIC16F877A: 1. Conectar directamente el pin 2 del LM35 a una de las entradas ANx del micro y usar como voltajes de referencia: Vref+ = VDD y Vref- = VSS, lo cual no requiere de ningún conexionado extra pero desperdicia un 80% aprox. de la escala de la conversión ya que de 1 V a 5 V no tendremos datos. En el micro el dato capturado de 10 bits lo multiplicamos por 5000 y lo dividimos por 1023 para traducirlo a milivoltaje y luego lo dividimos por 10 para traducir milivoltaje a Temperatura en ºC. Tales operaciones se muestran a continuación: Dato Capturado [binario] x __5000 mV__ x _ 1 ºC___ = Temperatura [ºC] 1023 [binario] 10 mV Los registros de configuración de la Conversión A/D quedarían así:

Transcript of Tutorial Xiii

Page 1: Tutorial Xiii

TUTORIAL XIII OBJETIVOS

• Crear códigos en C de mayor complejidad.

• Aplicar Conversión Análogo/Digital a sensores.

• Realizar el Proyecto 13 y 14: Sensor de temperatura LM35 y Sensor Infrarrojo GP2D12.

• Repasar y reafirmar los conceptos vistos hasta el momento. PROYECTO 13: Sensor de Temperatura LM35 Para este proyecto vamos a sensar temperatura con el LM35 y la vamos a visualizar en ºC en tiempo real en la LCD haciendo uso de la Conversión Análogo/digital vista en tutoriales anteriores.

El LM35 en particular devuelve un voltaje que es directamente proporcional a la temperatura en grados Celsius a razón de 10 mV/ºC Puede medir de -55ºC a 150ºC aunque para esta practica va a usar de 0ºC a 100ºC aprox. Se alimenta con un voltaje de 4V a 20 V. Dispone de 3 pines para conexionado: dos para alimentación y uno que da el voltaje de salida tal como se muestra en la figura a la izquierda.

Como vamos a trabajar de 0 a 100ºC aprox. el máximo voltaje de salida del sensor será de 1 Volt aprox. Por tanto tenemos varias opciones para conectar y configurar el sensor al PIC16F877A: 1. Conectar directamente el pin 2 del LM35 a una de las entradas ANx del micro y usar

como voltajes de referencia: Vref+ = VDD y Vref- = VSS, lo cual no requiere de ningún conexionado extra pero desperdicia un 80% aprox. de la escala de la conversión ya que de 1 V a 5 V no tendremos datos.

En el micro el dato capturado de 10 bits lo multiplicamos por 5000 y lo dividimos por 1023 para traducirlo a milivoltaje y luego lo dividimos por 10 para traducir milivoltaje a Temperatura en ºC. Tales operaciones se muestran a continuación: Dato Capturado [binario] x __5000 mV__ x _ 1 ºC___ = Temperatura [ºC] 1023 [binario] 10 mV Los registros de configuración de la Conversión A/D quedarían así:

Page 2: Tutorial Xiii

ADCON0=0b01000001; //Frec Conversión : Fosc/8 //Canal AN0 de conversión //Bit GO/DONE en cero: conversión no en progreso… // …Se pone en 1 cuando se vaya a convertir //Modulo de conversión A/D encendido

ADCON1=0b10001110; //Justificación a derecha //Frec Conversión : Fosc/8 //AN0 como entrada análoga, Vref+ = VDD, Vref- = VSS 2. Especificar Voltajes de referencia, es decir Vref+ = 1V y Vref- = VSS para aprovechar

al 100% la escala del conversor y tener un máximo de resolución. Tiene como desventaja el uso de un pin extra del micro, el AN3 (RA3 el pin 5 del PIC16F877A) al que se le debe llevar 1 V.

Una manera fácil de hacerlo es por medio de un divisor de voltaje, mostrado a la izquierda, en el que Vp = _ R2__ x 5V que para este caso Vp = 1V. R2+R1 Se seleccionan 2 resistencias tales que se cumpla la expresión, por

ejemplo: R1 = 100Ω y R2 = 400 Ω. Vp se conecta al pin RA3. En el micro el dato capturado de 10 bits lo multiplicamos por 1000 y lo dividimos por 1023 para traducir a milivoltios y luego lo dividimos por 10 para pasar de mV a ºC. Tales operaciones se muestran a continuación:

Dato Capturado [binario] x _1000 mV_ x _ 1 ºC__ = Temperatura [ºC] 1023 [binario] 10 mV

Los registros de configuración quedarían así:

ADCON0=0b01000001; //Lo mismo que para el caso 1

ADCON1=0b10000101; //Justificación a derecha //Frec Conversión : Fosc/8

//AN0 y AN1 entradas análogas, Vref+ = AN3, Vref- = Vss

3. Conectar el pin 2 del LM35 a un amplificador operacional, por ejemplo un LM358, para lograr una amplificación de 5 veces aprox. y luego la salida de este al PIC.

Tiene como ventaja el aprovechamiento del 100% de la escala del conversor A/D y el uso de un solo pin del micro, como desventaja el uso de circuiteria externa que sin embargo no es costosa. De las 3 opciones vistas vamos a trabajar con esta última.

Para esta configuración del amplificador (mostrada a continuación) Vsalida = Ventrada x (1+R1/R2) Como buscamos que Vsalida / Ventrada = 5, R1/R2 = 4,

R1 y R2 podrían ser por ejemplo 10KΩ y 2,2KΩ respectivamente.

Page 3: Tutorial Xiii

En el micro el dato capturado lo vamos a multiplicar por 5000 y dividir por 1023 para

traducirlo a milivoltaje, luego lo dividimos por el factor real de amplificación para obtener el milivoltaje real que entrega el sensor y luego dividimos por 10 para obtener los grados centígrados buscados. Tales operaciones se muestran a continuación: Dato Capturado [binario] x __5000 mV__ x _ _______1 ºC______ = Temp [ºC] 1023 [binario] Factor Ampl. x 10 mV

Para los valores de resistencias sugeridas el factor de amplificación R1/R2 +1 ≈ 5,5. En la operación para simplificar los cálculos supondremos que:

R1/R2 + 1 = 5,5 = 11/2 Además para este tercer caso los registros ADCON0 y ADCON1 los configuramos tal

cual para el caso 1.

Vamos a usar la LCD para visualizar la temperatura haciendo uso de las librerías lcd.c y lcd.h configuradas para que el bus de datos de la LCD sea el Puerto B del PIC y que los pines de control RS y EN sean respectivamente los pines RB4 y RB5, como ya se ha realizado en practicas anteriores.

El código en C para el proyecto aparece a continuación: #include <pic.h> #include <stdlib.h> #include "lcd.h" #include "delay.h" unsigned long adc=0, TEMP=0,centenas=0,decenas=0,unidades=0; void main(void) TRISB=0; //Puerto B como salida para LCD TRISA0=1; //Pin RA0 como entrada ADCON0=0b01000001; //Frec Conversión : Fosc/8

Page 4: Tutorial Xiii

//Canal AN0 de conversión //Bit GO/DONE en cero: conversión no en progreso //Modulo de conversión A/D encendido ADCON1=0b10001110; //Justificación a derecha //Frec Conversión : Fosc/8 //AN0 como entrada análoga, Vref+ = VDD, Vref- = VSS lcd_init(); //Inicia la LCD lcd_clear(); //Limpia la LCD lcd_puts("Temperatura:");//Envía mensaje al LCD while(1) //Ciclo Infinito ADGO=1; //Inicia conversión A/D while(ADGO==1) ; //Espera mientras finaliza conversión adc=(ADRESH<<8)+ADRESL; //Dato capturado TEMP=(2*5000*adc)/(1023*11); //Conversión a Temperatura centenas=TEMP/100; //Rutina de Visualización decenas=(TEMP-centenas*100)/10; unidades=TEMP-centenas*100-decenas*10; lcd_goto(0x44); lcd_putch(centenas+0x30); lcd_putch(decenas+0x30); lcd_putch('.'); lcd_putch(unidades+0x30); DelayMs(10);

Page 5: Tutorial Xiii

DIAGRAMA DE CONEXIONES

Page 6: Tutorial Xiii

PROYECTO 14: Sensor Infrarrojo GP2D12. Para este proyecto vamos a sensar distancia con el sensor SHARP GP2D12 y vamos a visualizar en la LCD, en cm, la distancia aproximada a la que el sensor detecta el obstáculo. Haremos uso de la Conversión Análogo/digital vista en tutoriales anteriores.

El GP2D12 se alimenta con un voltaje de -0,3V a 7 V. Dispone de 3 pines para conexionado según se muestra a la izquierda en la figura: 1. Salida señal análoga 2. Tierra 3. Vcc Este sensor devuelve un voltaje que, a diferencia del LM35, no es proporcional a la distancia sensada sino que sigue una curva característica que se suministra en la hoja de datos técnicos, y que además oscila entre 0 y 2,5 V aprox.

Tal comportamiento supone un desafío interesante para interpretar el voltaje que le llega al PIC en la conversión análogo/digital. Ya no es posible hacer una regla de tres para convertir voltaje a distancia (o a temperatura como se hacia con el LM35). Por tanto existen varias posibilidades para efectuar la lectura e interpretación del sensor:

1. Habilitar comunicación serial entre PIC y computador con el modulo USART, enviarle al computador el resultado de la conversión A/D y que este a través de una macro en Excel por ejemplo devuelva la distancia en cm para ser visualizada en la LCD, dado que en el computador se podría introducir con buena precisión la grafica de Voltaje Vs Distancia

Page 7: Tutorial Xiii

Se podría ajustar un curva polinómica a dicha grafica de tal manera que obtenga una función f(Voltaje) = distancia en cm. Programas como MATLAB, LabView o Excel están en capacidad de efectuar tal operación. Tal caso esta fuera del alcance de este tutorial. 2. Se podría efectuar un control sencillo por intervalos de distancia de los 10 cm a los 50 cm aprox. donde el voltaje de salida presenta cambios significativos. Es decir que el PIC sea capaz de determinar más o menos a que distancia se encuentra el obstáculo con una resolución de 5, 2 o 1 cm. Por ejemplo cuando un obstáculo reflectivo es colocado a 16,7 cm del sensor, se esperaría que el micro sea capaz, cuando menos, de entender que el obstáculo está entre 15 y 20 cm, ó entre 16 y 18 cm, ó entre 16 y 17 cm en el caso mas preciso. Para los objetivos de esta práctica este es el sistema que se va a implementar. Para lograr ese objetivo se debe elaborar una tabla en el PIC para que en el rango [10,50] cm se tenga la equivalencia entre voltaje de entrada y distancia aproximada. Esto se hace leyendo en la grafica Voltaje Vs Distancia en cm las coordenadas de los

puntos de la forma (X cm +∆X cm, Y voltios) donde ∆X cm es igual a 5, 2 ó 1 cm. También se puede obtener manualmente con multímetro y regla para una calibración en casos especiales. Se debe tener cuidado con la resolución ya que una muy baja implica una tabla de muchos valores y por tanto un gasto de memoria innecesario. En cuanto a la conversión A/D se tienen las mismas consideraciones que para el LM35 en cuanto a que se podría usar una amplificación de 2 antes de la entrada al PIC o de una manera mas precisa (pero menos optima) el uso de voltajes de referencia (de 0 y 2,5 V aprox.) También se podría hacer uso de la opción más sencilla de conectar simplemente el sensor y hacer uso de la escala del conversor al 50% de perdida ya que de 2,6 a 5 V no recibiríamos nunca una señal del sensor pero aun así le tendríamos asignados valores dentro de los 1023 posibles. Esto ya no es tan crítico como en el de temperatura ya que de todas formas se tendrán alrededor de 500 valores posibles para denotar los voltajes de 0 a 2,5 V, y además no se hará uso de un control exigente de la distancia, sino muy aproximado como ya se dijo.

Vamos a usar la LCD para visualizar la temperatura haciendo uso de las librerías lcd.c y lcd.h configuradas para que el bus de datos de la LCD sea el Puerto B del PIC y que los pines de control RS y EN sean respectivamente los pines RB4 y RB5 como se ha visto en tutoriales anteriores. El código en C para nuestro proyecto aparece a continuación:

Page 8: Tutorial Xiii

#include <pic.h> #include <stdlib.h> #include "lcd.h" #include "delay.h" unsigned long adc=0, DIST=0,centenas=0,decenas=0,unidades=0; void distancia(unsigned long VOLT) //Función que calcula la distancia aprox. lcd_goto(0x40); // Y la despliega en la LCD lcd_puts("DistAprx:"); lcd_goto(0x4B); if (VOLT>=232) // Tabla de Valores lcd_puts("10"); // Voltaje(V) vs Distancia (cm) if ((VOLT>=163)&(VOLT<232)) // 2,32 10 lcd_puts("15"); // 1,63 15 if ((VOLT>=128)&(VOLT<163)) // 1,28 20 lcd_puts("20"); // 1,05 25 if ((VOLT>=105)&(VOLT<128)) // 0,90 30 lcd_puts("25"); // 0,80 35 if ((VOLT>=90)&(VOLT<105)) // 0,68 40 lcd_puts("30"); // 0,63 45 if ((VOLT>=80)&(VOLT<90)) // 0,50 50 lcd_puts("35"); if ((VOLT>=68)&(VOLT<80)) lcd_puts("40"); if ((VOLT>=63)&(VOLT<68)) lcd_puts("45"); if ((VOLT>=50)&(VOLT<63)) lcd_puts("50"); lcd_goto(0x4D); lcd_puts("cm"); void main(void) TRISB=0; //Puerto B como salida para la LCD TRISA0=1; //Pin RA0 como entrada ADCON0=0b01000001; //Frec Conversión : Fosc/8 //Canal AN0 de conversión //Bit GO/DONE en cero: conversión no en progreso //Modulo de conversión A/D encendido ADCON1=0b10001110; //Justificación a derecha //Frec Conversión : Fosc/8 //AN0 como entrada análoga, Vref+ = VDD, Vref- = VSS lcd_init(); //Inicializa LCD lcd_clear(); //Limpia la LCD lcd_puts("Voltaje:"); //Envía mensaje al LCD while(1) //Ciclo infinito ADGO=1; //Inicia conversión A/D

Page 9: Tutorial Xiii

while(ADGO==1) ; //Espera mientras finaliza conversión adc=(ADRESH<<8)+ADRESL; //Dato capturado DIST=(500*adc)/1023; //Conversión a Voltaje centenas=DIST/100; //Rutina Visualización de Voltaje decenas=(DIST-centenas*100)/10; unidades=DIST-centenas*100-decenas*10; lcd_goto(0xA); lcd_putch(centenas+0x30); lcd_putch('.'); lcd_putch(decenas+0x30); lcd_putch(unidades+0x30); lcd_putch('V'); DelayMs(10); //Retardo entre visualización y visualización distancia(DIST); //Llama a función de calculo y visualización de distancia DelayMs(10); //Retardo entre visualización y nueva conversión

Page 10: Tutorial Xiii

DIAGRAMA DE CONEXIONES