Práctica 6 con Miuva. Conversión analógica a digital con PIC C

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

Descarga el proyecto en PIC C o Mikro C

Menú