Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

Práctica 6 con Miuva 18. 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(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
   }
}

Funcionamiento