Practica #2
Control Digital
Convertidor Analógico Digital Integrado.
Objetivo
Lograr comprobar experimentalmente el funcionamiento de un convertidor
analógico digital que emplea el método de conversión de aproximaciones sucesivas
y realizará la programación del microcontrolador PIC16F690 para hacer uso del
módulo de conversión analógico digital.
Equipo y material
1 Fuente de voltaje bipolar
1 Generador de funciones
1 Multímetro
1 Osciloscopio
1 Microcontrolador PIC16F690 o adaptar la configuración y programación para usar
otro PIC
1 Motor de CD (ventilador) de 12V
1 LM35D Sensor de temperatura de precisión
1 LM358 Amplificador operacional de baja potencia
1 Transistor TIP31
1 Pantalla LCD de 16x2 (JHD-162A)
1 Resistencia de 82 Ω a ½ W
2 Resistencias de 1 KΩ a ½ W
1 Resistencia de 10 KΩ a ½ W
1 Resistencia de 39 KΩ a ½ W
1 Resistencia de 100 Ω a ½ W
1 Potenciómetro de 5 KΩ
1 Capacitor de 1 µF
1 Push Button normalmente abierto
Procedimiento
Construir el siguiente circuito.
Imagen 1
Programar el PIC con el siguiente código. El resultado de la conversión de voltaje
deberá mostrase en la pantalla LCD.
// Directivas de preprocesado
#include <16F690.h> // Definición del µC.
#device adc = 10 // Resolución del convertidor A/D
#fuses INTRC_IO, MCLR // Fuses principales.
#fuses NOWDT, NOBROWNOUT, PUT, NOIESO, FCMEN // Fuses de reset
#fuses NOCPD, NOPROTECT // Fuses de protección de códigos
#use delay(clock=8M) // Frecuencia del reloj interno.
#use fast_io(A) /* Directiva que habilita el
puerto A como I/O digital. */
#include <flex_lcd.c> /* Driver de control para la
pantalla LCD */
void main() {
/* --- Declaración de variables --- */
int unidades; // Dato entero, se emplea con el selector.
long dato; /* Dato de 16 bits, almacena el resultado
de la conversión de 10 bits. */
float voltaje; /* Dato flotante, guarda el valor calculado
del voltaje de entrada. */
float temperatura; /* Dato flotante, guarda el valor calculado
de la temperatura con decimales. */
/* --- Configuración de periféricos y módulos --- */
set_tris_A(0x03); /* Configura los pines RA0 y RA1 como
entradas. */
// Configuración del convertidor A/D:
setup_adc_ports(sAN0); // Canal analógico AN0.
setup_adc(ADC_CLOCK_INTERNAL); // Reloj interno de conversión.
lcd_init(); // Inicializa y prepara el LCD.
unidades = 0; // Inicializa la variable que indica las unidades
/* --- Ciclo de conversiones A/D --- */
while (TRUE) {
set_adc_channel(0); /* Inicia la conversión A/D por el
canal 0. */
delay_us(20); /* Tiempo de espera para obtener la
conversión. */
dato = read_adc(); /* Guarda el resultado de la
conversión en 'dato'. */
voltaje = (dato * 5.0) / 1023.0; // Convierte el dato a voltaje.
temperatura = (voltaje / (5.0 * 0.010)); /* Calcula la temperatura
en grados Celsius. */
if (temperatura >= 32.0) // Activa el ventilador si la temp.
output_high(pin_A5); // excede el valor establecido.
else // Si la temperatura es baja, el
output_low(pin_A5); // ventilador se mantiene apagado
printf(lcd_putc, "\fADC=%4lu", dato); /* Muestra el valor de
conversión A/D. */
printf(lcd_putc, " V=%1.2fV", voltaje); /* Muestra el valor de
voltaje equivalente */
}
}
if (input(pin_A1) == 1) // Comprueba si se presionó el botón
{
unidades++;
while (input(pin_A1) == 1) // Retardo para evitar rebotes
{
delay_ms(5);
}
}
// Selección de unidades de temp.
switch (unidades) {
case 0: // Caso para grados Celsius (°C)
printf(lcd_putc, "\n Temp=%3.2f°C", temperatura, 223);
delay_ms(100);
break;
case 1: // Caso para grados Fahrenheit (°F)
temperatura = (1.8 * temperatura) + 32.0;
printf(lcd_putc, "\n Temp=%3.2f°F", temperatura, 223);
delay_ms(100);
break;
case 2: // Reinicia en grados Celsius.
unidades = 0;
break;
}
// Fin del 'switch'.
// Fin del ciclo 'while'.
// Fin de la función 'main'.
Sustituir el potenciómetro P2 por el circuito de la siguiente imagen, el cual
proporcionará una señal de voltaje directamente proporcional a la temperatura
medida por el sensor LM35D con una ganancia Av = 5. Con esta modificación se
obtiene un circuito que funciona como un termómetro digital.
Imagen 2
Realizar las mediciones de temperatura en diferentes escalas, las cuales deberán
cambiar cada vez que se presione el botón. Modificar el código mostrado
anteriormente para que el sistema sea capaz de mostrar el dato de temperatura en
una de las distintas escalas.