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: