En esta práctica utilizaremos otro recurso del PIC; el convertidor analógico a digital (ADC), este recurso es sumamente útil ya que nuestra tarjeta trabaja internamente con información digital, sin embargo casi todo en el mundo real tiene información analógica. El ADC del PIC18F4550 lo podemos configurar hasta para 10 bits.
Miuva recibirá un voltaje que puede estar entre 0 y 5V, y lo convertirá a un valor entre 0 y 1023 (10 bits). Por ejemplo:
0V -> 0
5V -> 1023
Para configurar el ADC de Miuva, utilizamos las siguientes líneas:
#device ADC = 10 //ADC de 10 bits
Definimos de cuantos bits será el ADC, esta línea tiene que estar después de la primer línea (donde definimos el PIC que vamos a utilizar).
setup_adc_ports(sAN0); //Configuración de puertos analógicos setup_adc(ADC_CLOCK_INTERNAL);
Definimos cuales puertos de Miuva 18 serán analógicos (ya que por defecto son digitales), la información que se utiliza en esta función para definir los puertos la podemos encontrar en la librería del PIC, y es la siguiente:
#define sAN0 0x00800000 //| A0 #define sAN1 0x01000000 //| A1 #define sAN2 0x02000000 //| A2 #define sAN3 0x04000000 //| A3 #define sAN4 0x08000000 //| A5 #define sAN5 0x00100000 //| E0 #define sAN6 0x00200000 //| E1 #define sAN7 0x00400000 //| E2 #define sAN8 0x00010000 //| B2 #define sAN9 0x00020000 //| B3 #define sAN10 0x00008000 //| B1 #define sAN11 0x00040000 //| B4 #define sAN12 0x00004000 //| B0 #define sAN13 0x00080000 //| B5 #define sAN14 0x00000100 //| C2 #define sAN15 0x00000200 //| C3 #define sAN16 0x00000400 //| C4 #define sAN17 0x00000800 //| C5 #define sAN18 0x00001000 //| C6 #define sAN19 0x00002000 //| C7 #define sAN20 0x00000001 //| D0 #define sAN21 0x00000002 //| D1 #define sAN22 0x00000004 //| D2 #define sAN23 0x00000008 //| D3 #define sAN24 0x00000010 //| D4 #define sAN25 0x00000020 //| D5 #define sAN26 0x00000040 //| D6 #define sAN27 0x00000080 //| D7 #define NO_ANALOGS 0 // None #define ALL_ANALOG 0x0FFFFFFF // A0 A1 A2 A3 A5 E0 E1 E2 B2 B3 B1 B4 B0 B5 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7
Por lo tanto de acuerdo a la información anterior y la línea que se describió se estaría habilitando el pin A0 como entrada digital.
Para la lectura del ADC utilizamos lo siguiente:
set_adc_channel(0); //Canal del ADC que se va a delay_us(20); //Retardo de 20 microsegundos q = read_adc(); //Leemos el valor del ADC
El retardo de 20 microsegundos es necesario cada vez que configuramos el canal que se va a leer del ADC, es importante recordar que si estamos trabajando con el ADC de 10 bits, la variable donde se almacena el valor leído del ADC (en este caso q) deberá ser un entero de 16 bits.
Para convertir este valor almacenado en voltaje necesitamos realizar una regla de 3 como se muestra a continuación:
5 -> 1023
voltaje -> valor_digital
voltaje = valor_digital * 5.0 / 1023.0
Voltaje deberá ser una variable de tipo flotante para que almacene el valor exacto de la conversión.
Con esto podemos crear el siguiente código.
Código del programa
#include <18f46K22.h> // la librería del PIC #device ADC = 10 #fuses HSM,NOWDT,PUT,BROWNOUT, MCLR,NOLVP,NOXINST,NOWRT,PLLEN #use delay (clock=48M) //Seleccionamos la frecuencia de reloj de 48MHz #include<MLCD.C> //Librería de la LCD void main(){ int16 q; //Entero de 16 bits para almacenar los 10 recibidos del ADC float p; //Flotante para convertir el valor recibido a voltaje setup_adc_ports(sAN0); //Configuración de puertos analógicos setup_adc(ADC_CLOCK_INTERNAL); lcd_init(); //Inicialización de la LCD while(true){ set_adc_channel(0); //Canal del ADC que se va a leer delay_us(20); //Retardo de 20 microsegundos q = read_adc(); //Leemos el valor del ADC p = 5.0*q/1024.0; //Convertimos el valor recibido a voltaje lcd_gotoxy(4,1); //Vamos a la posición 4,1 de la LCD printf(lcd_putc, "Miuva-LCD"); //Escribimos en la LCD printf(lcd_putc, "\nVoltage = %01.2fV", p); //Escribimos en la LCD delay_ms(100); //Retardo de 100 milisegundos } }