INSTITUTO TECNOLÓGICO
DE LÁZARO CÁRDENAS
PRÁCTICA 2.3.
ALUMNOS: JAIME HUMBERTO GARCÍA VALLE 20560102
ARTURO JOREL AYALA CRUZ 20560024
CARRERA: INGENIERÍA ELECTRÓNICA
PROFESOR: M.C. JULIO CÉSAR GALLO SÁNCHEZ
MATERIA: APLICACIONES DE MICROCONTROLADORES
UNIDAD 2: EL CONVERTIDOR ANALÓGICO A DIGITAL
CD Y PTO. LÁZARO CÁRDENAS MICHOACÁN JUEVES, 05 DE OCTUBRE DE 2023
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
ÍNDICE
Introducción .......................................................................................................................... 1
Material ................................................................................................................................. 2
Equipo .................................................................................................................................... 2
Desarrollo .............................................................................................................................. 3
Funcionamiento del código ................................................................................................. 3
Prueba del programa ........................................................................................................... 7
Código del programa .......................................................................................................... 11
Conclusión ........................................................................................................................... 13
Bibliografía .......................................................................................................................... 14
i
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Introducción
Este informe presenta el desarrollo de la práctica 3 perteneciente a la unidad 2 de la materia
de Microcontroladores de Ingeniería Electrónica. El propósito de esta práctica es aplicar los
conocimientos que se han adquirido en los dos trabajos anteriores y a lo largo de las clases
de la unidad para desarrollar un indicador de temperatura utilizando un LM35, la temperatura
se mostrará en la pantalla LCD en grados Celsius y Fahrenheit, el diagrama del circuito se
muestra en la Figura 1.
La práctica se desarrollará de manera muy parecida a la del medidor de voltaje, pero con
algunas consideraciones que debemos de tener en cuenta acerca del sensor. El LM35 ofrece
una salida de voltaje correspondiente a 10mV por cada grado centígrado por lo que no resulta
necesario el desplegar varios decimales, con imprimir solamente el entero puede llegar a ser
suficiente, esta característica del LM35 determina el factor de conversión que se le aplicará
al voltaje medido por el ADC (el cual ya se había aprendido a calcular en la práctica anterior),
este factor de conversión es 1°C/10mV= 100 °C/V, es decir, bastará con solo multiplicar el
voltaje medido por 100 y obtendremos el valor de la temperatura en grados Celsius, para
pasar a Fahrenheit simplemente aplicamos la fórmula que relaciona estos dos. También será
necesario el realizar “ciclos” de medición de hasta 50 veces para determinar el valor
promedio de la temperatura, ya que, si la fuente de voltaje o el LM35 tienen muchas
variaciones, estas se verán reflejadas en el valor desplegado y no será agradable a la vista del
usuario.
1
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
5V
RESET 5V
39kΩ
5V
LM35 10kΩ
1 2 3 MCLR/Vpp/RE3 1 40 RB7
RA0 2 39 RB6
RA1 3 38 RB5
RA2 4 37 RB4
5V
RA3 5 36 RB3
PIC18F45K50
RA4 6 35 RB2
RA5 7 34 RB1 220Ω
RE0 8 33 RB0
RE1 9 32 VDD 5V 5V
RE2 10 31 VSS
VDD 11 30 RD7
VSS 12 29 RD6 VSS VDD V0 RS RW E D0 D1 D2 D3 D4 D5 D6 D7 A K
5V
RA7 13 28 RD5
RA6 14 27 RD4
RC0 15 26 RC7
RC1
RC2
16
17
25
24
RC6
D+
LCD 16X02
VUSB3V3 18 23 D-
RD0 19 22 RD3
RD1 20 21 RD2
Figura 1.- Diagrama eléctrico propuesto para la práctica.
Material
1. Tarjeta de evaluación µvva (Miuva) con PIC18F45K50.
2. Cable Dupont.
3. Cable Micro USB.
4. LCD de 16x2.
5. LM 35.
6. Cable calibre 22.
7. Protoboard
Equipo
1. Computadora con los softwares MPLAB IDE, CCS y PICkit 2 instalados.
2
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Desarrollo
Funcionamiento del código
El programa se inicia con las líneas que se han estado utilizando a lo largo de la unidad,
donde configuramos el ADC con conversión en 10 bits para aprovechar su máxima
resolución.
#include "18F45k50.h"
#device adc = 10
#fuses NOWDT
#use delay(internal=48MHz)
A continuación, se definen los puertos de conexión de la LCD y se le da el nombre requerido
para que la librería los reconozca y opere con ellos. Se agrega dicha librería para poder hacer
uso de la LCD con funciones básicas.
#define LCD_ENABLE_PIN PIN_D4
#define LCD_RS_PIN PIN_D5
#define LCD_RW_PIN PIN_C2
#define LCD_DATA4 PIN_D0
#define LCD_DATA5 PIN_D1
#define LCD_DATA6 PIN_D2
#define LCD_DATA7 PIN_D3
#include "lcd.c"
Se declaran las variables necesarias para realizar las operaciones y cálculos en el programa.
La variable “tempsp” es necesaria para guardar las conversiones que estará haciendo el ADC,
aquí se irán acumulando las 50 lecturas para después hacer el promedio. Las variables tipo
“float” serán utilizadas en el cálculo de la temperatura y en las de tipo “char” la variable “i”
se usará para iterar en un FOR, “lect” para registrar cuantas mediciones se han hecho y
“grado” guarda el número 223 para poder imprimir el símbolo “°” en la LCD (código ASCII).
3
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
unsigned long tempsp=0;
float tempc=0,tempf=0;
char i=0,lect=0,grado=223;
Como se hizo en la práctica anterior, se procede a iniciar la función principal y se despliegan
algunos datos sobre la práctica en la LCD, se configura y selecciona el canal 0 del ADC, se
habilitan las interrupciones globales y del ADC y por último se inicia la primera conversión
del ADC.
void main(void)
{
output_drive(PIN_B0);
output_low(PIN_B0);
lcd_init();lcd_putc("\f PRACTICA 2.3");
delay_ms(2000);
lcd_putc("\f S. Temperatura");
delay_ms(2000);
lcd_putc('\f');
setup_adc(ADC_CLOCK_DIV_8|ADC_TAD_MUL_4);
setup_adc_ports(sAN0);
set_adc_channel(0);
enable_interrupts(INT_AD); //se activa la
interrupción del adc
enable_interrupts(GLOBAL); //Para usar cualquier
interrupción se requiere la global
read_adc(ADC_START_ONLY);
Se inicia el ciclo infinito y se coloca un IF que estará checando cuando las lecturas (indicadas
por “lect”) lleguen a 50 y se requiera sacar el promedio, cuando esto ocurra se apagará el
ADC para no mantenerlo encendido mientras se realizan los siguientes cálculos, el valor de
“tempsp” que contiene la suma de las 50 mediciones se multiplica por “0.00995” que
proviene de la multiplicación del factor de conversión del valor digital a voltaje (5.09V/1023)
y el factor de voltaje a temperatura (100 °C/V), de esta manera ya contiene la lectura en
grados Celsius y se guarda en “tempc”. Es necesario resetear “tempsp” en 0 para volver a
acumular el valor de solo 50 mediciones y no más. Por último la variable “tempf” que
4
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
contendrá los grados Fahrenheit se calcula utilizando el valor calculado de “tempc” y la
fórmula: F= C*1.8 + 32.
for(;;)
{
if(lect>=50)
{
setup_adc(ADC_OFF);
tempc=tempsp*0.00995;
tempsp=0;
tempf=tempc*(1.8)+32.0;
Los valores calculados anteriormente se despliegan en las dos líneas de la LCD con
solamente un decimal, aquí se hace uso de la variable “grado” para imprimir el símbolo “°”.
El indicador de lecturas “lect” se reinicia a 0 para volver a comenzar y se vuelve a encender
el ADC con las configuraciones de frecuencia que se han utilizado. Con esto hecho se cierra
el IF.
printf(lcd_putc,"C: %0.1f %cC ",tempc,grado);
printf(lcd_putc,"\nF: %0.1f %cC ",tempf,grado);
lect=0;
setup_adc(ADC_CLOCK_DIV_8|ADC_TAD_MUL_4);
}
Antes de cerrar el FOR infinito se coloca un pequeño delay dividido en 3 iteraciones de 5ms,
solamente para añadir un poco de estabilidad al valor desplegado en la LCD, ya que las 50
mediciones del ADC pueden realizarse de manera muy rápida. Por último, se inicializa la
lectura del ADC con el objetivo de que cada vez que realice una conversión y guarde el valor
se vuelva a comenzar la otra con la misma configuración y en el mismo canal, y se cierra el
ciclo infinito.
5
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
for(i=0;i<=2;i++)delay_ms(5);
read_adc(ADC_START_ONLY);
}
}
Por último, se escribe la directiva de la interrupción del ADC y se crea la función que se
ejecutará cuando esta ocurra. Cada vez que la conversión del ADC termine la variable
“tempsp” se incrementará en el valor correspondiente al resultado medido, se incrementará
la variable “lect” en señal de que se ha registrado una nueva conversión y por último se
retorna al ciclo infinito donde se checará el número de lecturas y se iniciará de nueva cuenta
la lectura del ADC.
#int_ad
void Adc_Int()
{
tempsp+=read_adc(ADC_READ_ONLY);
lect++;
return;
}
6
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Prueba del programa
Primeramente, se descarga el programa en la tarjeta Miuva, mostrada la Figura 2, y se realizan
las conexiones correspondientes para comprobar su funcionamiento empleando la LCD
16x02 (Figura 3) y el transductor de temperatura LM35 (Figura 4), tal como se muestran en
la Figura 5.
Figura 2.- Tarjeta de evaluación µvva (Miuva) con PIC18F45K50.
Figura 3.- LCD 16X02.
7
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Figura 4.- Transductor LM35.
Figura 5.- Esquema de conexiones de Miuva con LCD y LM35.
8
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Se procede a realizar una medición de la temperatura con base a la tensión que entrega el
transductor al canal 0. Como se muestra en la Figura 6, se despliega en el LCD la medición
de 32 °C y 89.7 °F respectivamente, la cual corresponde a la temperatura ambiente.
Figura 6.- Medición de temperatura ambiente con el programa desarrollado.
Después se le coloca el dedo al LM35 para incrementar un poco la medición por medio de la
temperatura corporal dando un valor de 34.3 °C y 93.8 °F como se muestra en la Figura 7.
9
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Figura 7.- Medición de temperatura corporal.
Por último, se checó si la temperatura mostrada en la LCD correspondía realmente con el
valor de voltaje entregado por el LM35 midiéndolo directamente con un multímetro. Como
se observa en la Figura 8 la medición indicaba y el voltaje de por lo que este último
efectivamente es la centésima parte del valor de temperatura indicado.
Figura 8.- Comparación temperatura-voltaje.
10
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Código del programa
#include "18F45k50.h"
#device adc = 10
#fuses NOWDT
#use delay(internal=48MHz)
#define LCD_ENABLE_PIN PIN_D4
#define LCD_RS_PIN PIN_D5
#define LCD_RW_PIN PIN_C2
#define LCD_DATA4 PIN_D0
#define LCD_DATA5 PIN_D1
#define LCD_DATA6 PIN_D2
#define LCD_DATA7 PIN_D3
#include "lcd.c"
unsigned long tempsp=0;
float volm=0,tempc=0,tempf=0;
char i=0,lect=0,grado=223;
void main(void)
{
output_drive(PIN_B0);
output_low(PIN_B0);
lcd_init();lcd_putc("\f PRACTICA 2.3");
delay_ms(2000);
lcd_putc("\f S. Temperatura");
delay_ms(2000);
lcd_putc('\f');
setup_adc(ADC_CLOCK_DIV_8|ADC_TAD_MUL_4);
setup_adc_ports(sAN0);
set_adc_channel(0);
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);
read_adc(ADC_START_ONLY);
for(;;)
{
if(lect>=50)
{
setup_adc(ADC_OFF);
tempc=tempsp*0.00995;
tempsp=0;
tempf=tempc*(1.8)+32.0;
lcd_gotoxy(1,1);
printf(lcd_putc,"C: %0.1f %cC
",tempc,grado);
printf(lcd_putc,"\nF: %0.1f %cC
",tempf,grado);
lect=0;
11
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
setup_adc(ADC_CLOCK_DIV_8|ADC_TAD_MUL_4);
}
for(i=0;i<=2;i++)delay_ms(5);
read_adc(ADC_START_ONLY);
}
}
#int_ad
void Adc_Int()
{
tempsp+=read_adc(ADC_READ_ONLY);
lect++;
return;
}
12
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Conclusión
Esta práctica ha servido para aprender a medir otras variables físicas diferentes al voltaje con
el microcontrolador con el uso del ADC y de sensores especiales para el tipo de variable
necesaria. Aunque en esta ocasión se utilizó un sensor sencillo cuyo paso mínimo de
medición es el doble de la resolución del ADC, permitió poder identificar los principales
pasos sobre el uso de bastantes de los transductores que entregan señal de voltaje, los cuales
son la medición del nivel de voltaje por medio del ADC y posteriormente su conversión al
valor deseado para mostrar al usuario u operar alguna función dentro del microcontrolador,
no obstante se entiende que en muchas ocasiones los sensores pueden llegar a tener
variaciones de respuestas con un valor inferior a la resolución del ADC o que varían en otro
parámetro eléctrico (corriente, resistencia, frecuencia, etc.) para los cuales es importante
hacer un acoplamiento.
En la práctica se han resuelto algunos problemas que han permitido comprender aún mejor
el funcionamiento y creación de un programa de medición de alguna variable física, por
ejemplo, el hecho de que la fuente de alimentación no sea estable y afecte la medición es un
problema que se aprendió a corregir por medio de dos técnicas: sacar la media aritmética de
cierta cantidad de mediciones antes de desplegarlas o utilizarlas en el resto del programa y
utilizar el módulo de voltaje de precisión FVR del microcontrolador como referencia del
ADC. Otro de los problemas importantes consistía en encender y apagar el ADC de manera
repetitiva y provocando una inestabilidad en las mediciones, realizar operaciones complejas
de variables flotantes cuando simplemente no eran necesarias y provocaban un retraso muy
grande en la ejecución del programa y también el error de no realizar exactamente las 50
mediciones para promediar por la forma en la que se iban contabilizando estas. Todos estos
errores mencionados provocaban una lectura con un error considerable, pero con ayuda del
profesor fueron corregidos y el error se redujo significativamente.
13
Reporte Práctica 2.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Bibliografía
1. Fabricante: Microchip.
Título: PIC18(L)F2X/45K50 Datasheet.
Editorial: Microchip.
2. Autor: Julio Cesar Gallo Sánchez.
Título: Programando el Microcontrolador PIC18F4550 en Leguaje C con el
compilador CCS en MPLAB.
Edición: 1era Edición.
3. Autores: Eduardo García Breijo.
Título: Compilador C CCS y simulador PROTEUS para Microcontroladores PIC.
Edición: Primera Edición.
Editorial: Alfaomega.
14
Reporte Práctica 2.3