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 } }