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(AN0); //Configuración de puertos analógicos setup_adc(ADC_CLOCK_INTERNAL); //Sincronizado con el reloj interno
Definimos cuales puertos de Miuva 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:
// Constants used in SETUP_ADC_PORTS() are: // First argument: #define NO_ANALOGS 0x0F // None #define ALL_ANALOG 0x00 // A0 A1 A2 A3 A5 E0 E1 E2 B2 B3 B1 B4 B0 #define AN0_TO_AN11 0x03 // A0 A1 A2 A3 A5 E0 E1 E2 B2 B3 B1 B4 #define AN0_TO_AN10 0x04 // A0 A1 A2 A3 A5 E0 E1 E2 B2 B3 B1 #define AN0_TO_AN9 0x05 // A0 A1 A2 A3 A5 E0 E1 E2 B2 B3 #define AN0_TO_AN8 0x06 // A0 A1 A2 A3 A5 E0 E1 E2 B2 #define AN0_TO_AN7 0x07 // A0 A1 A2 A3 A5 E0 E1 E2 #define AN0_TO_AN6 0x08 // A0 A1 A2 A3 A5 E0 E1 #define AN0_TO_AN5 0x09 // A0 A1 A2 A3 A5 E0 #define AN0_TO_AN4 0x0A // A0 A1 A2 A3 A5 #define AN0_TO_AN3 0x0B // A0 A1 A2 A3 #define AN0_TO_AN2 0x0C // A0 A1 A2 #define AN0_TO_AN1 0x0D // A0 A1 #define AN0 0x0E // A0
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 en PIC C:
#include <18f4550.h> #device ADC = 10 //ADC de 10 bits #fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL2, CPUDIV1, VREGEN #use delay(clock=48M) #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(AN0); //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 } }
Conexiones
Observa el video demostrativo