Laboratorio 16: Proyecto Pastillero - Parte B

Laboratorio 07: Lectura de Entradas Analógicas - Módulo ADC

CURSO DE PROGRAMACIÓN DE MICROCONTROLADORES PIC
PARTE A: Programación de Microcontroladores PIC de MICROCHIP.
LECTURA DE ENTRADAS ANALÓGICAS - MÓDULO ADC

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.
COMPETENCIA ESPECIFICA DE LA SESION
  • Conocer el Display LCD y su funcionamiento
  • Programar eficientemente el LCD
CONTENIDOS A TRATAR
  • Lecturas analógicas de un canal del PIC
  • Configuración de un Sensor de Temperatura
  • Lectura analógica en una pantalla LCD
RESULTADOS
  • Diseñan y optimizan sistemas y procesos para cumplir con las condiciones establecidas y gestionando adecuadamente los recursos materiales y humanos.
MATERIALES Y EQUIPO
  • CCS Compiler instalado.
  • Entrenador de PICS
  • PIC16F877A
  • Guía de Laboratorio. El trabajo se desarrolla de manera GRUPAL.
  • PC con Software de simulación.
DIAGRAMA ESQUEMÁTICO:


CÓDIGO 01 DE PROGRAMACIÓN EN PIC C COMPILER

// NOMBRE: JHOJAN ANDRES LERMA ACHOMA
#INCLUDE <16F877A.H>
#device adc=8
#USE DELAY(CLOCK=4000000) // Cristal externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <lcd.c>

int lectura=0;

void MAIN()
{
   LCD_INIT(); // Inicializa el 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 A3
      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
   } // Cierra WHILE true
}


CÓDIGO 02 DE PROGRAMACIÓN EN PIC C COMPILER

// NOMBRE: JHOJAN ANDRES LERMA ACHOMA
#INCLUDE <16F877A.H>
#device adc=10
#USE DELAY(CLOCK=4000000) // Cristal externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <lcd.c>

int16 temperatura=0;
int setpoint=25;

void MAIN()
{
   LCD_INIT (); // Inicializa el LCD
   // 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)
   {
      temperatura = read_adc (); // Leemos Canal A3
      temperatura = temperatura / 2.046;
      delay_ms (20); // esperamos para una correcta lectura
      
      lcd_gotoxy (1, 1); // ubicamos cursos en LCD
      printf (lcd_putc, "TEMPERATURA: %3u", setpoint); // imprimimos valor
      
      lcd_gotoxy (1, 2); // ubicamos cursos en LCD
      printf (lcd_putc, "Valor: %3lu grados", temperatura); // imprimimos valor
      delay_ms (100); // esperamos
      
      IF (!input (PIN_A4))
      {
         setpoint++;
         WHILE (!input (PIN_A4)) {}
      }

      IF (!input (PIN_A5))
      {
         setpoint--;
         WHILE (!input (PIN_A5)) {}
      }
   } // Cierra WHILE true
}


IMÁGENES DE FUNCIONAMIENTO

Aplicando el Código 01

Aplicando el Código 02
Aplicando el Código 02

VÍDEO EXPLICATIVO


RETO DE LA SEMANA:

Convierta el sistema de Termómetro a TERMOSTATO

CÓDIGO DEL RETO:

// NOMBRE: JHOJAN ANDRES LERMA ACHOMA
#INCLUDE <16F877A.H>
#device adc=10
#USE DELAY(CLOCK=4000000) // Cristal externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <lcd.c>

int16 temperatura=0;
int setpoint=25;

void MAIN()
{
   LCD_INIT (); // Inicializa el LCD
   // Configuración del puerto analógico
   setup_adc_ports (AN0_AN1_AN3);
   setup_adc (ADC_CLOCK_INTERNAL);
   set_adc_channel (3); // lectura del canal analógico 3
   delay_us (20);

   WHILE (TRUE)
   {
      temperatura = read_adc (); // Leemos Canal A3
      temperatura = temperatura / 2.046;
      delay_ms (20); // esperamos para una correcta lectura
      
      lcd_gotoxy (1, 1); // ubicamos cursos en LCD
      printf (lcd_putc, "TEMPERATURA: %3u", setpoint); // imprimimos valor
      
      lcd_gotoxy (1, 2); // ubicamos cursos en LCD
      printf (lcd_putc, "Valor: %3lu grados", temperatura); // imprimimos valor
      delay_ms (20); // esperamos
      
      IF (!input (PIN_A4)) // SUBIR
      {
         setpoint++;
         WHILE (!input (PIN_A4)) {}
      }

      IF (!input (PIN_A5)) // BAJAR
      {
         setpoint--;
         WHILE (!input (PIN_A5)) {}
      }
      
      IF (temperatura > setpoint) // SALIDA
      {
         output_low (PIN_B0) ;
      }

      ELSE
      {
         output_high (PIN_B0) ;
      }
   } // Cierra WHILE true
}      
 

IMÁGENES DE FUNCIONAMIENTO DEL RETO

Aplicando el Código del Reto
Aplicando el Código del Reto

OBSERVACIONES
  • Se tuvieron que aplicar algunas operaciones matemáticas para obtener los resultados deseados.
  • Para el reto de la semana usamos 10 bits en nuestro módulo ADC.
  • Si queremos observar el voltaje del sensor de temperatura podemos conectar un voltímetro a su salida.
  • Las conexiones de nuestro LCD al PIC 16F877A a comparación de nuestro laboratorio anterior son iguales.
  • En el código se debe indicar el canal analógico de lectura que se va a utilizar.
CONCLUSIONES
  • Logré configurar un sensor de temperatura para el uso conjunto con un LCD.
  • Concluyo que se pueden visualizar datos de dispositivos analógicos en un Display LCD usando un PIC 16F877A.
  • Las conversiones de ciertos datos son necesarios para poder cambiar lo que visualizamos en el LCD.
  • Logré programar todas las tareas asignadas en este laboratorio con éxito.

Comentarios