sábado, 23 de noviembre de 2019

LABORATORIO NRO. 13

MICROCONTROLADORES

Laboratorio Nº 13

Lectura de Entradas analógicas

1. CAPACIDAD TERMINAL:
● Utilizar al microcontrolador en aplicaciones de control electrónico.
● Desarrollar y ejecutar programas en un microcontrolador PIC
● Programar y configurar interfaces básicas del microcontrolador.


2. COMPETENCIA ESPECÍFICA DE LA SESIÓN:
 Lecturas analógicas de un canal del PIC
● Configuración de un Sensor de Temperatura
● Lectura analógica en una pantalla LCD

3. CONTENIDOS A TRATAR: 
Entradas analógicas
● Sensor de Temperatura

4. RESULTADOS:

●Diseñan y optimizan sistemas y procesos para cumplir con las condiciones establecidas y gestionando adecuadamente los recursos materiales y humanos.

5. MARCO TEÓRICO:
ENTRADAS ANALÓGICAS:
El PIC 16F877A, entre sus varios periféricos, posee un conversor análogo a digital (CAD) para ello el PIC cuenta con pines por donde le llegará la señal analógica, el conversor analógico digital PIC cuenta con un circuito que carga un condensador interno al PIC con la tensión analógica que le está llegando a la entrada analógica, luego la tensión almacenada en el condensador lo convierte en un número binario de 10 bits que representará la tensión almacenada en el condensador, como la resolución que puede leer los voltajes presentes en los pines marcados como AN0 hasta AN7.




La lectura de estos se hace de forma multiplexada, una a la vez. Como buen sistema digital, las lecturas son tratadas como muestras tomadas a intervalos regulares de tiempo, las que son retenidas por un capacitor interno. La cantidad de muestras por segundo o velocidad de lectura son un submultiplo de la velocidad de oscilación del PIC por lo cual se debe cuidar que esta no resulte ser mayor que el tiempo que el capacitor interno demora en cargarse.

Una mala elección de velocidad de lectura, puede resultar en mediciones erróneas, por debajo de las magnitudes que se pretenden medir. Según Microchip, el tiempo de adquisición de los datos debe ser mayor a 19.72us.

Registros Involucrados en la conversión A/D:
La conversión análogo-digital, se configura y controla con los registros ADCON0 y ADCON1, donde es posible configurar aspectos como el canal (pin del PIC) en que se hará la lectura, velocidad de muestreo, estado de la conversión, pines análogos o digitales, entre otros. Por otro lado, la conversión resultante se alberga en los registros ADRESH y ADRESL La gráfica lo explica de mejor manera.


El bit ADFM y como leer el resultado:
El resultado de la conversión, finalmente será un numero de 0 a 1023 correspondiente a los 0 a 5 volts, tal como se muestra en la primera Imagen bajo el título principal. Este número al ser de 10 bits no cabe en un solo registro y es por eso que se utilizan dos (ADRESH y ADRESL) en binario puede parecer difícil de entender, pero en el lenguaje C de XC8 basta con sumar ambos registros y almacenar el resultado en un INT para tener el número entre 0 y 1023 correspondiente a la conversión.

6. TAREA GUIADA DENTRO DEL LABORATORIO:
1. Simule y pruebe en el entrenador el programa del LCD de acuerdo al circuito y código siguiente. Asegúrese que el PIN RW esté conectado a GND (jumper sin conectar) y que el LCD esté conectado al PUERTO D mediante interruptores rojos debajo del mismo:


//Desactivar dip switch de DISPLAYS para correcto funcionamiento.
//Entrada analógica en el puerto A3.

#include <16f877a.h>             // Incluimos archivo con PIC a utilizar
#device adc=8                    // Utilizamos 8 bits de RESOLUCION de lectura
#use delay (clock=20M)           // Indicamos al compilador que trabajaremos a 20Mhz
#fuses HS, NOPROTECT, NOWDT      // Configuración básica de los fusibles

#define LCD_ENABLE_PIN        PIN_D3   //Definimos los pines a ser utilizados por la
#define LCD_RS_PIN            PIN_D2   //pantalla LCD
#define LCD_RW_PIN            PIN_A0  
#define LCD_DATA4             PIN_D4
#define LCD_DATA5             PIN_D5
#define LCD_DATA6             PIN_D6
#define LCD_DATA7             PIN_D7 
#include <lcd.c>                 // Incluimos librería para manejar Pantalla LCD

int lectura=0;

void main ()
{
   lcd_init () ;                       // Inicializamos pantalla LCD
   printf (lcd_putc, "\fLECTURA ANALOGICA") ;  // Mandamos mensaje por única vez

   //Configuración del puerto analógico
   setup_adc_ports (AN0_AN1_AN3);
   setup_adc (ADC_CLOCK_INTERNAL);
   set_adc_channel (3); //lectura del canal analogico 3
   delay_us (20);
  
   WHILE (true)
   {
      lectura = read_adc ();        // Leemos Canal A0
      delay_ms (20) ;               // esperamos para una correcta lectura
      lcd_gotoxy(1,2);              // ubicamos cursos en LCD
      printf (lcd_putc, "Puerto A3: %4u", lectura); // imprimimos valor
      delay_ms(100);                // esperamos
     
    }
     }


2. Realice los cambios sugeridos a continuación y muestre sus resultados

a. Donde dice “#device adc=8” cambie por “#device adc=10”; convierta la variable “lectura” en entero de 16 bits y la línea printf cambie “%4u” por “%4lu”. ¿Cuál es el cambio mostrado en la pantalla LCD? ¿por qué?.
El cambio que se da, es que la pantalla LCD logrará mostrar el valor de todo el registro mediante la variación del potenciómetro, siendo en este caso de 0 a 1023 el valor mostrado, y el valor del registro es 210 = 0 a 1024.
Debido a que se está empleando un adc = 10, al ser mayor que 8 (int), se emplea el siguiente de 16 bits (int16). 


b.    Convierta el valor leído en valor de voltaje de 0 a 5 voltios. Para esto cambie la variable “lectura” a variable tipo float y configure su forma de mostrarse en el LCD. Luego, en la función While(true),  añada la instrucción “lectura = lectura /  204.6”. Cambie las instrucciones para que en la pantalla del LCD aparezca algo así “Tension: 3.456 v”. 





c.    Finalmente agregue una condición IF para que si el valor de voltaje supera 4.5   voltios, mostrar el mensaje “WARNING” en la primera línea del LCD.
     //Desactivar dip switch de DISPLAYS para correcto funcionamiento.
    //Entrada analógica en el puerto A3.



7. TAREA A SER EVALUADA:
TERMOSTATO DIGITAL CON CONTROL ON-OFF:
Se trata de un circuito que deberá controlar el encendido y apagado de un relé (el cual se supone que conecta/desconecta un elemento calefactor) dependiendo de la temperatura leída en el sensor y de la temperatura seteada por los pulsadores respectivos. La pantalla LCD y los leds muestran el estado del termostato.

Este proyecto deberá contar con las siguientes partes:


Textos a mostrar en la pantalla LCD:


Condiciones de funcionamiento:
  • La pantalla inicial deberá mostrarse al principio durante 2 segundos, luego deberá mostrarse la pantalla normal.
  • Para aumentar o disminuir la temperatura SET, deberá presionarse los pulsadores respectivos, pero aún no debe controlar la salida de relé, sino hasta presionar “aceptar”. El botón “cancelar” ejerce la función de RESET y detiene todo el proceso.
  • El sensor de Temperatura será emulado mediante un potenciómetro (RA3) y su rango será de 0 a 100 grados centígrados.
  • El rango de temperatura OK será de 10 grados. Ejemplo: si SET=80, el led verde debe encender si Temp varía entre 75 y 85 grados. (Opcional).


8. EVIDENCIA DE TRABAJO EN LABORATORIO:




Link del video: https://youtu.be/FLXDBQNQJU0

9. OBSERVACIONES:
  • Cada vez que se quiera escribir un texto diferente sobre la pantalla, es preferible borrar esa línea o limpiar todo el LCD, para de esta manera evitar la sobrescritura y combinación de textos o acoplamiento.
  • No es necesario realizar alguna configuración de comando de inicialización para emplear las luces LED. Su habilitación se da desde el mismo módulo físico.
  • Las variables empleadas antecedidas con "int" tendrán un registro de 8 bits (256 valores) por lo que se debe parametrizar y poner condiciones al momento de operar cada acción.
  • Pese a restricciones de que cuando el SET esté en un valor de cero no disminuya y se quede en ese valor, el programa procedía a mostrar un valor de 255, empleando tanto condicionales como: SET<0, SET<=0,SET<=1,entre otros.
10. CONCLUSIONES:
  • Se logró realizar la programación para realizar el control de un registro de temporizador, empleándolo para que ejecute la acción de un contador.
  • Se dan casos de errores al momento de probar la programación, no siempre el problema radica en la misma sino puede ser también en el software o en el módulo.
  • Se simuló el modo de control ON/OFF, siendo el operador quien manipule la variable de variación de la temperatura, y a su vez se programaron ciertos indicadores de acciones que tendrían una simbolización en lo físico, como el relé reemplazado por una luz LED.