Aprende como realizar una conversión A/D con un microcontrolador PIC mediante lenguaje C, para crear un voltímetro de CD utilizando una resistencia variable.
clases de dinamica ejercicios preuniversitarios.pdf
TEMPIC-45 Práctica IV. Voltímetro de CD
1. Capacitación Certificada, Componentes & Soluciones en Electrónica y
Programación
Práctica IV
Voltímetro de CD
Revisión 2
www.novellius.com
contacto@novellius.com
2. www.novellius.com
Índice de Contenido
Objetivo...........................................................................................................................................................................................................4
Solución Propuesta................................................................................................................................................................................4
Material Requerido..................................................................................................................................................................................4
Software Necesario................................................................................................................................................................................4
Desarrollo del Programa de Control en Lenguaje C.......................................................................................................5
Acondicionamiento de la TEMPIC-45......................................................................................................................................14
Programación del Microcontrolador..........................................................................................................................................19
Comprobación del Funcionamiento del Programa de Control...............................................................................21
Prácticas Propuestas.............................................................................................................................................................................22
3. www.novellius.com
Índice de Figuras
Fig. 1 Creación de un archivo de código fuente C.......................................................................................................5
Fig. 2 Inserción de un nuevo manual de proyecto al archivo de código fuente C...............................5
Fig. 3 Diagrama de la lógica del programa de control..............................................................................................6
Fig. 4 Descripción de los fusibles implementados en el programa de control......................................7
Fig. 5 Expresión para obtener el tiempo ideal de la Conversión A/D...........................................................9
Fig. 6 Cálculo de la escala de Voltaje....................................................................................................................................10
Fig. 7 Expresión para obtener el Voltaje del Potenciómetro................................................................................10
Fig. 8 Desglose de la función “printf“ para la impresión en un Display LCD........................................... 11
Fig. 9 Muestra de un valor Entero sin Signo en la Pantalla LCD....................................................................... 11
Fig. 10 Mostrar un valor entero sin signo y un valor flotante en una Pantalla LCD............................... 12
Fig. 11 Compilación del programa de control................................................................................................................... 13
Fig. 12 Confirmación de éxito en la compilación............................................................................................................ 13
Fig. 13 Colocación del Microcontrolador en la TEMPIC-45..................................................................................... 14
Fig. 14 Conexión de la Pantalla LCD a la TEMPIC-45.................................................................................................. 14
Fig. 15 Comprobación de la conexión de la Pantalla LCD a la TEMPIC-45................................................. 15
Fig. 16 Conexión del programador de PICs a la TEMPIC-45.................................................................................. 15
Fig. 17 Alimentación deshabilitada desde el Programador de PICs................................................................. 16
Fig. 18 Configuración de la TEMPIC-45 para Alimentación mediante la Interfaz USB..................... 16
Fig. 19 Diagrama de conexión de una Pantalla LCD al PIC18F4550................................................................ 17
Fig. 20 Conexión de una Pantalla LCD a la TEMPIC-45............................................................................................. 17
Fig. 21 Diagrama de conexión de un Potenciómetro al pin RA0 del PIC18F4550................................. 18
Fig. 22 Conexión de un Potenciómetro al pin RA0 de la TEMPIC-45.............................................................. 18
Fig. 23 Ventana principal del PICKit 2® Programmer................................................................................................... 19
Fig. 24 Importación del archivo compilado del código fuente C......................................................................... 19
Fig. 25 Programación exitosa del Microcontrolador.....................................................................................................20
Fig. 26 Verificación del funcionamiento de la solución de control.................................................................... 21
4. www.novellius.com
4
Objetivo
Desarrollar un programa de control involucrando algunos tópicos intermedios de programación de
PICs, como el control de una Pantalla LCD de 16x2 caracteres, así como la implementación de una
Conversión Analógico/Digital (A/D).
Solución Propuesta
Este ejemplo consiste en realizar la conversión Analógico/Digital (A/D) de una señal proveniente
de un potenciómetro, alimentado con +5V como voltaje de referencia. Posteriormente mostrar en
el Display LCD de 16x2 caracteres, tanto el valor de la conversión A/D, como el voltaje asociado al
potenciómetro.
Material Requerido
1) Tarjeta Entrenadora TEMPIC-45.
2) Programador para Microcontroladores PIC (PICKit 2® o equivalente).
3) Microcontrolador PIC18F45501.
4) Oscilador de 20 MHz.
5) Cables Dupont.
6) Potenciómetro de 100 KΩ (o cualquier otro valor de tu elección).
7) Display LCD de 16x2 Caracteres.
Software Necesario
• Compilador CCS PCWH IDE (PIC C Compiler) o superior.
http://www.ccsinfo.com/downloads.php
• PICKit® 2 Programmer o equivalente.
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDoc-
Name=en023805
1 Se pueden implementar una diversa variedad de PICs. Véase el Manual de Usuario en la sección “Microcontro-ladores
Compatibles“.
5. www.novellius.com
5
Desarrollo del Programa de Control en
Lenguaje C
1) Crea un nuevo proyecto de control en PIC C Compiler y sálvalo bajo el nombre de “VoltimetroCD.c”.
Fig. 1 Creación de un archivo de código fuente C.
2) Añade un nuevo proyecto al archivo de código fuente, implementando el PIC18F45502.
Fig. 2 Inserción de un nuevo proyecto al archivo de código fuente C.
2 Se pueden implementar una diversa variedad de PICs. Véase el Manual de Usuario en la sección “Microcontro-ladores
Compatibles“.
6. www.novellius.com
3) A continuación se presenta un diagrama de flujo para comprender la secuencia lógica que debe
6
obedecer el programa de control.
Declaración de variables
necesarias Configuración de Puertos Configuración de la
Conversión A/D
¿La Conversión A/D ha Iniciar la Conversión A/D Ciclo Inifnito
terminado?
Mostrar el Voltaje y el
valor A/D
Fig. 3 Diagrama de la lógica del programa de control.
Incluir archivos cabecera
y librerías necesarios.
Configuración de fusibles
y reloj de procesamiento
Almacenar el valor
obtenido de la Conversión
A/D
Escalar el valor A/D a
Volts
Si
4) Captura el siguiente código sobre el archivo “VoltimetroCD.c”.
1. #include <18F4550.h>
2. #fuses HSPLL, NOWDT, NOPROTECT, PLL5
3. #use delay(clock=20MHz)
4. #include <lcd.c>
5. int8 valorAdc;
6. float valorEsc;
7. float k = 0.019607843137254;
8. void main(){
9. lcd_init();
10. setup_adc_ports(AN0);
11. setup_adc(ADC_CLOCK_DIV_16);
12. set_adc_channel(0);
13. delay_us(20);
14. while(true) {
15. read_adc(ADC_START_ONLY);
No
7. www.novellius.com
7
16. while (!adc_done());
17. valorAdc = read_adc(ADC_READ_ONLY);
18. valorEsc = valorAdc * k;
19. lcd_gotoxy(1,1);
20. printf(lcd_putc,”Valor ADC:%3u”,valorAdc);
21. lcd_gotoxy(1,2);
22. printf(lcd_putc,”Voltaje:%f”,valorEsc);
23. printf(lcd_putc,” V”);
24. delay_ms(100);
25. }
26. }
Código 1-2
1. #include <18F4550.h>
2. #fuses HSPLL, NOWDT, NOPROTECT, PLL5
La línea 1 importa el archivo cabecera del modelo de microcontrolador a implementar en
el proyecto. En la línea 2 se fijan los fusibles a utilizar al en nuestra solución, los cuales se
detallan a continuación.
HSPLL. High Speed Crystal/Resonator with
PLL enabled)
Cristal/Resonador (Oscilador) de Alta
Velocidad con Pre-escalador (PLL)
Habilitado
NOWDT. No Watch Dog Timer
Temporizador Perro Guardián Deshabilitado
NOPROTECT. Code not protected from
reading Código sin protección contra lectura.
PLL5. Divide By 5 (20MHz oscillator input) Pre-escalador habilitado con divisor de
frecuencia por 5, para osciladores de
20MHz.
Fig. 4 Descripción de los fusibles implementados en el programa de control.
Código 3-4
3. #use delay(clock=20MHz)
4. #include <lcd.c>
En la línea 3 se indica la frecuencia del cristal físico que se va a utilizar en la TEMPIC-45, esta
velocidad depende directamente del fusible PLLX hallado en la Línea 2. La línea 4 incluye en
el código, la librería con todas las funciones de control para la Pantalla LCD.
8. www.novellius.com
8
Código 5-7
5. int8 valorAdc;
6. float valorEsc;
7. float k = 0.019607843137254;
La línea 5 declara una variable entera de 8 bits denominada “valorAdc”, ésta va a almacenar
el resultado de la conversión A/D. La línea 6 declara una variable con punto flotante (o punto
decimal) llamada “valorEsc”, la cual va a guardar el valor A/D escalado (es decir convertido
a Volts). La línea 7 se trata de la declaración de una constante llamada “k”, ésta será parte
vital en el proceso de mostrar el valor A/D en Volts.
Código 8-9
8. void main(){
9. lcd_init();
La línea 8 establece el comienzo de la ejecución del programa. La línea 9 es la directiva
primaria para el manejo de una Pantalla LCD de 16x2 caracteres, pues inicializa y estabiliza el
Display LCD para comenzar a transmitir y mostrar los caracteres. Recuerda que al controlar
una Pantalla LCD esta directiva deberá ser siempre la primera que invoques en tu código.
9. www.novellius.com
9
Código 10-13
10. setup_adc_ports(AN0);
11. setup_adc(ADC_CLOCK_DIV_16);
12. set_adc_channel(0);
13. delay_us(20);
La línea 10 establece las entradas analógicas que se van a utilizar en la conversión A/D,
en este caso es la entrada cero (ubicada en RA0). En la línea 11 se ajusta la velocidad de la
conversión A/D.
El parámetro dentro de esta instrucción ADC_CLOCK_DIV_16, divide por 16 la velocidad del
cristal físico utilizado en el PIC. La hoja de datos del PIC18F4550, declara que la velocidad
adecuada para realizar una conversión A/D debe ser la más pequeña posible, pero siempre
mayor al mínimo requerido. Para el PIC18F4550 la velocidad mínima equivale a 0.7μs. La
elección del divisor por 16 como la velocidad adecuada, se comprueba fácilmente con la
siguiente expresión:
Fig. 5 Expresión para obtener el tiempo ideal de la Conversión A/D.
Como se puede observar al dividir el oscilador físico por 16, se obtiene la velocidad más
pequeña posible, pero superior al mínimo requerido para la conversión A/D, es decir,
0.8.μs > 0.7μs
La línea 12 declara el canal por el cual va a ser adquirida la señal, en este caso, el numero
cero. Por último la línea 13 crea un retardo de 20μs para estabilizar el conversor A/D.
10. www.novellius.com
10
Código 14-18
14. while(true) {
15. read_adc(ADC_START_ONLY);
16. while (!adc_done());
17. valorAdc = read_adc(ADC_READ_ONLY);
18. valorEsc = valorAdc * k;
La línea 14 presenta el comienzo de un ciclo infinito para continuamente realizar la
adquisición de la señal analógica. La línea 15 comienza la conversión A/D. Ya que la línea
15 nunca indica cuando la conversión A/D termina, la línea 16 crea un ciclo mientras la
conversión no haya finalizado. En caso de que la conversión A/D haya finalizado; la línea
17 lee el valor obtenido de la conversión y lo almacena en la variable “valorAdc”. El valor
obtenido de la conversión A/D oscila entre 0 y 255, debido a que usamos 8 bits de precisión
en la conversión (28=256, es decir desde 0 hasta 255), es por esto que es necesario escalar
el valor obtenido para convertirlo a Volts. Esto se logra a través de la siguiente expresión:
Fig. 6 Cálculo de la escala de Voltaje.
Con la expresión anterior, se deduce que si se obtuviera por ejemplo, el valor 128 de la
conversión A/D y se multiplicara por la escala, entonces se obtendría el voltaje del
potenciómetro:
Fig. 7 Expresión para obtener el Voltaje del Potenciómetro.
La línea 18 almacena el producto del valor proveniente de la conversión A/D multiplicado
por la escala en la variable “valorEsc”.
11. www.novellius.com
11
Código 19-23
19. lcd_gotoxy(1,1);
20. printf(lcd_putc,”Valor ADC:%3u”,valorAdc);
21. lcd_gotoxy(1,2);
22. printf(lcd_putc,”Voltaje:%f”,valorEsc);
23. printf(lcd_putc,” V”);
La línea 19 posiciona el cursor de la pantalla LCD en la columna 1, renglón 1. La línea 20 es
un conjunto de funciones para imprimir una secuencia de caracteres en una sola línea de
código, el cual se desglosan a continuación:
printf Función para imprimir un valor con un
formato especificado.
lcd_putc Función para escribir un sólo caracter en la
Pantalla LCD.
”Valor ADC:%3u”
Expresión que mostrará en la pantalla LCD el
mensaje “Valor ADC:”. La expresión ”%3u”
es el formato con el cual se va a presentar
el valor de la variable “valorAdc”, o sea, 3
dígitos de un entero sin signo.
Fig. 8 Desglose de la función “printf“ para la impresión en un Display LCD.
El resultado final deberá ser similar al siguiente:
Fig. 9 Muestra de un valor Entero sin Signo en la Pantalla LCD.
12. www.novellius.com
La línea 21 posiciona el cursor de la pantalla LCD en la columna 1 renglón 2. La línea 22
vuelve a recurrir a una impresión con formato, esta vez con el voltaje. El único cambio que se
observa de esta línea con respecto a la línea 20 es el formato de impresión ”%f”, el cual se
trata de un número con punto flotante. Éste por defecto imprime un entero más dos cifras
después del punto decimal. Finalmente la línea 23 concatena el caracter “V” para indicar
que las unidades son Volts.
12
El mensaje compuesto final se visualizará de la siguiente forma:
Fig. 10 Mostrar un valor entero sin signo y un valor flotante en una Pantalla LCD.
Código 24-26
24. delay_ms(100);
25. }
26. }
La línea 24 genera un retardo de 100μs para estabilizar el proceso de la adquisición de la
señal. La línea 25 indica el cierre del ciclo infinito declarado en la línea 14, y para finalizar
el código de la solución, la línea 26 establece el fin del método principal, o sea, el fin del
programa.
13. www.novellius.com
13
5) Pulsa sobre el botón Compile en la sección del mismo nombre.
Fig. 11 Compilación del programa de control.
6) Si el código se ha capturado sin errores, aparecerá la siguiente ventana confirmando que la
compilación ha sido exitosa; de lo contrario pulsa doble click sobre los errores que se listen y
verifica la sintaxis del código fuente.
Fig. 12 Confirmación de éxito en la compilación.
14. www.novellius.com
14
Acondicionamiento de la TEMPIC-45
1) Coloca y asegura el Microcontrolador en la Base ZIF de la TEMPIC-45.
Fig. 13 Colocación del Microcontrolador en la TEMPIC-45.
2) Ubica la Pantalla LCD de 16x2 caracteres en el Módulo de Conexión para Pantalla LCD de la
TEMPIC-45. Recuerda que este módulo alimenta la Pantalla LCD y ajusta automáticamente su
contraste.
Fig. 14 Conexión de la Pantalla LCD a la TEMPIC-45.
15. www.novellius.com
3) Asegúrate de que los pines 1 y 16 de la Pantalla LCD estén perfectamente alineados con el
15
Módulo de Conexión para Pantalla LCD de la tarjeta entrenadora.
Fig. 15 Comprobación de la conexión de la Pantalla LCD a la TEMPIC-45.
4) Coloca el programador de PICs en el Módulo de Programación, corroborando que los pines del
módulo coincidan con los del programador en perfecto orden.
Fig. 16 Conexión del programador de PICs a la TEMPIC-45.
16. www.novellius.com
16
5) Sitúa el jumper Selector de Alimentación desde el Programador en la posición “OFF”.
Fig. 17 Alimentación deshabilitada desde el Programador de PICs.
6) Ubica el Selector de Entrada de Alimentación en la posición “USB”. De esta forma la TEMPIC-45
se energizará a través de la Interfaz USB.
Fig. 18 Configuración de la TEMPIC-45 para Alimentación mediante la Interfaz USB.
17. www.novellius.com
7) Mediante cables Dupont realiza la conexión del Display LCD al PIC como se muestra en el
17
siguiente diagrama.
D6
D5
D4
D3
D2
LCD 16x2 Caracteres
D1
D0
RW
RS
Fig. 19 Diagrama de conexión de una Pantalla LCD al PIC18F4550.
8) Al terminar las conexiones correspondientes, el resultado deberá ser similar al siguiente.
Fig. 20 Conexión de una Pantalla LCD a la TEMPIC-45.
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-/CVREF
4
RA3/AN3/VREF+
5
RA4/T0CKI/C1OUT/RCV
6
RA5/AN4/SS/LVDIN/C2OUT
7
RA6/OSC2/CLKO
14
OSC1/CLKI
13
RB0/AN12/INT0/FLT0/SDI/SDA
33
RB1/AN10/INT1/SCK/SCL
34
RB2/AN8/INT2/VMO
35
RB3/AN9/CCP2/VPO
36
RB4/AN11/KBI0/CSSPP
37
RB5/KBI1/PGM
38
RB6/KBI2/PGC
39
RB7/KBI3/PGD
40
RC0/T1OSO/T1CKI
15
RC1/T1OSI/CCP2/UOE
16
RC2/CCP1/P1A
17
VUSB
18
RC4/D-/VM
23
RC5/D+/VP
24
RC6/TX/CK
25
RC7/RX/DT/SDO
26
RD0/SPP0
19
RD1/SPP1
20
RD2/SPP2
21
RD3/SPP3
22
RD4/SPP4
27
RD5/SPP5/P1B
28
RD6/SPP6/P1C
29
RD7/SPP7/P1D
30
RE0/AN5/CK1SPP
8
RE1/AN6/CK2SPP
9
RE2/AN7/OESPP
10
RE3/MCLR/VPP
1
PIC18F4550
D7
14
13
12
11
10
9
8
7
E
6
5
4
VSS
1
VDD
2
VEE
3
18. www.novellius.com
9) Realiza la conexión del Potenciómetro de 100 KOhm al pin RA0 de la TEMPIC-45, como se
18
indica en la siguiente figura.
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-/CVREF
4
RA3/AN3/VREF+
5
RA4/T0CKI/C1OUT/RCV
6
RA5/AN4/SS/LVDIN/C2OUT
7
RA6/OSC2/CLKO
14
OSC1/CLKI
13
RB0/AN12/INT0/FLT0/SDI/SDA
33
RB1/AN10/INT1/SCK/SCL
34
RB2/AN8/INT2/VMO
35
RB3/AN9/CCP2/VPO
36
RB4/AN11/KBI0/CSSPP
37
RB5/KBI1/PGM
38
RB6/KBI2/PGC
39
RB7/KBI3/PGD
40
RC0/T1OSO/T1CKI
15
RC1/T1OSI/CCP2/UOE
16
RC2/CCP1/P1A
17
VUSB
18
RC4/D-/VM
23
RC5/D+/VP
24
RC6/TX/CK
25
RC7/RX/DT/SDO
26
RD0/SPP0
19
RD1/SPP1
20
RD2/SPP2
21
RD3/SPP3
22
RD4/SPP4
27
RD5/SPP5/P1B
28
RD6/SPP6/P1C
29
RD7/SPP7/P1D
30
RE0/AN5/CK1SPP
8
RE1/AN6/CK2SPP
9
RE2/AN7/OESPP
10
RE3/MCLR/VPP
1
PIC18F4550
100KOhm
+5V
Fig. 21 Diagrama de conexión de un Potenciómetro al pin RA0 del PIC18F4550.
10) Una vez realizada la conexión del Potenciómetro, asegúrate que el resultado sea similar a la
siguiente figura.
Fig. 22 Conexión de un Potenciómetro al pin RA0 de la TEMPIC-45.
19. www.novellius.com
19
Programación del Microcontrolador
1) Ejecuta la aplicación PICKit 2® Programmer, ahora verifica que el programa reconozca el modelo
del Microcontrolador implementado en la TEMPIC-45.
Fig. 23 Ventana principal del PICKit 2® Programmer.
2) Importa el archivo llamado “VoltimetroCD.hex”, hallado en la ruta en la cual salvaste el archivo
de código fuente C.
Fig. 24 Importación del archivo compilado del código fuente C.
20. www.novellius.com
3) Programa el Microcontrolador pulsando sobre el botón Write. Al terminar el proceso corrobora
que la programación del PIC haya sido exitosa; de lo contrario, verifica el acondicionamiento de
la TEMPIC-45.
20
Fig. 25 Programación exitosa del Microcontrolador.
21. www.novellius.com
21
Comprobación del Funcionamiento del
Programa de Control
1) Observa como se muestra el voltaje del potenciómetro y al valor ADC asociado, una vez
completada la solución. Varía la resistencia del potenciómetro y comprueba como el voltaje y el
valor de la conversión A/D son desplegados en la Pantalla LCD de 16x2 caracteres.
Fig. 26 Verificación del funcionamiento de la solución de control.
22. www.novellius.com
22
Prácticas Propuestas
Los siguientes retos comprenden el contenido de esta Práctica, junto con el conocimiento adquirido
en las Prácticas I, II y III.
1) Realiza una mejora para controlar límites de voltaje en esta práctica, basándote en los siguientes
puntos.
a. Muestra en la primera línea de la Pantalla LCD el mensaje “Voltaje max = 3V“. Mientras
que en el segundo renglón solo deberá desplegarse el voltaje actual del potenciómetro.
Puedes mostrar el voltaje como prefieras, por ejemplo “V = 3.4”, “voltaje = 3.4V”, etc.
b. Conecta 2 botones en los pines RB4 y RB5, estos controlarán los tres niveles máximos
de voltaje. Los cuales son 3V, 4V y 4.5V.
c. El botón en RB4 se encargará del decremento del voltaje máximo y lo mostrará en el
renglón 1 de la Pantalla LCD alterando el mensaje original.
d. El botón conectado al pin RB5 deberá incrementar el voltaje máximo del potenciómetro,
igualmente mostrándolo en el Display LCD. Recuerda que ambos botones sólo pueden
ir cambiando los valores entre los 3 voltajes permitidos del punto b.
e. Cuando el voltaje máximo sea rebasado, enciende y mantén iluminados los LEDs
de RB0 a RB3. Una vez que el voltaje del potenciómetro se encuentre por debajo del
máximo, los LEDs deberán apagarse para indicar que la alerta ya no se encuentra activa.
2) En base al siguiente diagrama esquemático y material, programa e implementa un termómetro
digital.
Material
a. Sensor de Temperatura LM35.
b. Capacitor Electrolítico de 10uF.
c. Amplificador Operacional LM358N.
d. Resistencia de 5.1 KOhm.
e. Potenciómetro de 100 KOhm.
24. www.novellius.com
Para conocer la totalidad de cursos y productos en electrónica que ofrecemos visita:
www.novellius.com
o escríbenos todas tus inquietudes y comentarios a:
contacto@novellius.com
¿Tienes dudas acerca de esta Práctica?
Échale un vistazo a nuestro Curso Básico de Microcontroladores, el cual te impartimos a tu propio
ritmo, con instructores calificados y sin salir de tu escuela.
Para preguntas acerca de soporte técnico escríbenos a:
soporte@novellius.com