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 puede configurarse hasta para 10 bits.
Miuva Pro recibirá un voltaje que puede estar entre 0 y 3.3V, y lo convertirá a un valor entre 0 y 1023 (10 bits). Por ejemplo:
0V -> 0
3.3V -> 1023
Para configurar el ADC de Miuva Pro, 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); //Sincronizado con el reloj interno
Definimos cuales puertos de Miuva Pro serán analógicos (ya que por defecto son digitales), la información que se utiliza en esta función para definir los puertos está se puede encontrar en la librería del PIC, y es la siguiente:
// Constants used in SETUP_ADC_PORTS() are: // First argument: // OR together desired pins #define sAN15 0x80 //| H7 #define sAN14 0x40 //| H6 #define sAN13 0x20 //| H5 #define sAN12 0x10 //| H4 #define sAN11 0x8 //| F6 #define sAN10 0x4 //| F5 #define sAN7 0x800000 //| F2 #define sAN4 0x100000 //| A5 #define sAN3 0x80000 //| A3 #define sAN2 0x40000 //| A2 #define sAN1 0x20000 //| A1 #define sAN0 0x10000 //| A0 #define NO_ANALOGS 0x0 // None #define ALL_ANALOG 0xdf00ff // A0 A1 A2 A3 A5 F1 F2 F3 F4 F5 F6 H4 H5 H6 H7
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 analógica.
Para la lectura del ADC utilizamos lo siguiente:
set_adc_channel(0); //Canal del ADC que se va a delay_us(50); //Retardo de 50 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 necesitaremos realizar una regla de 3 como se muestra a continuación:
3.3 -> 1023
voltaje -> valor_digital
voltaje = valor_digital * 3.3 / 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:
#include <18F87J50.h> #device adc = 10 //Definimos un ADC de 10 bits #fuses HSPLL, NOWDT, NOPROTECT, NODEBUG, PLL2 #use delay (clock=24M) #include<MPLCD.c> unsigned int16 adc_lectura; //Variable para almacenar valor del ADC float voltaje; //Variable para convertir valor a Voltaje void main(){ setup_adc_ports(sAN0); //Configuramos AN0 como analógico setup_adc(ADC_CLOCK_INTERNAL); //Configuramos la velocidad del ADC set_tris_a(0xFF); //Puerto A como entrada set_tris_f(0x00); //Puerto F como salida (Paso de Miuva Pro Rev B) lcd_init(); //Inicializamos la LCD set_adc_channel(0); //Definimos el canal a leer del ADC delay_us(50); //Retardo de 50 microsegundos set_tris_j(0x00); //Puerto J como salida while(true){ //Bucle infinito adc_lectura = read_adc(); //Leemos el valor del ADC voltaje = adc_lectura*3.3/1023.0; //Lo convertimos a voltaje output_j(adc_lectura); //Mostramos el valor del ADC en los leds lcd_gotoxy(2,1); //Vamos a la posición (2,1) de la LCD printf(lcd_putc, "INTESC Miuva"); //Escribimos printf(lcd_putc, "nV = %2.3f V", voltaje); //Escribimos en la LCD el Voltaje delay_ms(50); //Tiempo entre mediciones } }
NOTA: En la revisión B de Miuva Pro (esta información la puedes encontrar en la parte posterior de tu tarjeta), es necesario colocar el puerto F como salida al utilizar el ADC, ya que por las conexiones del acelerómetro, éste causa un offset al valor leído por el convertidor. Si tienes la revisión C entonces no será necesario este paso.
Imagen 1. Revisiones de Miuva Pro