Módulo ADC

Autor: Santiago Gonzalez

Correo: santigoro en gmail.com

Entender la conversión Analógico-Digital: aqui

Aquí se muestran las funciones para trabajar con el modulo ADC 10 bits Interno de los PIC16F87X.

adc_init

Inicia el módulo ADC con la confiración establecida en los parametros de entrada: frecuencia de oscilador y configuración de entradas. El módulo ADC quedará configurado y listo para usar, pero será activado hasta que se habra un canal para evitar consumo innecesario de corriente.

	void adc_init(unsigned char set_fosc, unsigned char set_channel);
		

set_fosc Establece la frecuencia de adc.

Las posibles opcines son:


	FRECUENCIA DE OSCILADOR ADC:


	FOSC_DIV_2	// Frecuencia de oscilador del PIC / 2
	FOSC_DIV_4	
	FOSC_DIV_8	
	FOSC_DIV_16	
	FOSC_DIV_32	
	FOSC_DIV_64	
	FOSC_RC	// Oscilador interno del módulo ADC
		

set_channel Define que pines se usarán como entradas analógicas o como Vref externa. Cuando solo se define un pin como voltaje de referencia, este será Vref+, referencia positiva y estará en RA3, cuando se definen dos entradas como Vref la positiva será RA3 y la negativa RA2.

Las posibles opcines son:

	CONFIGURACION DE ENTRADAS Y Vref(PCFG en ADCON1) 
	
	A8_R0		// 8 entradas Analógicas y 0 como Vref (Vref+ = Vdd , Vref- = Ground)
	A7_R1		// 7 entradas analógicas y Vref+ en AN3
	A5_R0		 
	A4_R1	
	A3_R0	
	A2_R1	
	A0_R0	
	A6_R2		// 6 entradas Analógicas, Vref+ en AN3 y Vref- en AN2
	A6_R0
	A5_R1	
	A4_R2	
	A3_R2	
	A2_R2
	A1_R0	
	A1_R2	
		

Consultar el Datasheet del pic utilizado para ver canales diponibles, no se deben inicializar canales no implementados en el modelo de pic a usar, por ejemplo, el pic16f876a solo tiene 5 canales ADC, nunca usar A6_R0 en este pic.

adc_set_channel

Establece configuración de pines de entrada ADC y Vref

	void adc_set_channel(unsigned char set_channel);
		

set_channel Define que pines se usarán como entradas analógicas o como Vref externa. Cuando solo se define un pin como voltaje de referencia, este será Vref+, referencia positiva y estará en RA3, cuando se definen dos entradas como Vref la positiva será RA3 y la negativa RA2.

Las posibles opcines son las mismas que en adc_init: A2_R1 , etc.

adc_open

Abre canal seleccionado y activa módulo ADC

	void adc_open(unsigned char channel);
		

channel Establece el canal ADC a leer

Las posibles opciones son:

	CHANNEL_0  
	CHANNEL_1  
	CHANNEL_2  
	CHANNEL_3  
	CHANNEL_4  
	CHANNEL_5  
	CHANNEL_6  
	CHANNEL_7 
		

adc_read

Lee un canal previamente abierto

	unsigned int adc_read(void);
		

adc_close

Cierra módulo ADC.

	void adc_close(void);
		

La configuración queda tal como se inicializó la última vez, se puede volver a activar el módulo ADC mediante adc_open(channel), sin ejecutar adc_init()

Ejemplo de Módulo ADC

para compilar necesitas los siguientes comandos

Ejemplo de compilacion : ./compila.sh ej_adc_87Xa.c 16f877a
		

ej_adc_87Xa.c

/*
Ejemplo de utilización de las funciones del módulo ADC.
válido para la familia 16f87Xa,
Se utiliza el canal 0, 
conectar los voltajes a convertir a RA0,
conectar un led u otra salida a RB7.
RB7 se pondrá en estado alto (Vdd) cuando la tensión en RA0 sea mayor que 1/2 Vdd.
*/
#include <pic/p16f877a.h>
#include <adc.h>

int main(void) 
{	
	TRISAbits.TRISA0 = 1;			// A0 como entrada
	TRISBbits.TRISB7 = 0;			// B7 como salida

	adc_init( FOSC_DIV_32, A1_R0);		// Inicializa módulo ADC
	adc_open(CHANNEL_0);			// Abre canal 0 ADC

	while (1)
	{	
		if (adc_read() > 512 )
			PORTBbits.RB7 = 1;	// Enciende led
		else
			PORTBbits.RB7 = 0;	// Apaga led
	}	
}