Módulo Comparadores. Autor: Santiago Gonzalez Correo: santigoro en gmail.com Aquí se muestran las funciones para trabajar con los dos comparadores internos de los PIC16F87X. comp_init Inicia el módulo comparadores void comp_init(unsigned char set_config)); set_config Define entradas analógicas y Vref, Las posibles opciones son: COMP_RESET COMP1_OUT // Comparador 1 con salida por RA4 TWO_COMP // Dos comparadores independientes TWO_COMP_OUT // Dos comparadores independientes, salidas por RA4 y RA5 TWO_COMP_COMREF // Dos comparadores con entrada común: RA3 TWO_COMP_COMREF_OUT // Dos comparadores, entrada común RA3, salidas RA4 RA5 TWO_COMP_MULTI4_VREF // Dos comparadores con Vref interna, 4 entradas multiplexadas COMP_OFF comp_set_multiplex Establece que entradas son conectadas en el modo multiplexado comp_set_multiplex(unsigned char set_switch); set_switch determina que canales son multiplexados. Las posibles opciones son: RA0_RA1 RA2_RA3 comp_set_vref Esta función cambia el valor de Vref inerna, si previamente ha sido iniciado el uso de Vref interna con: comp_vref_mode(). void comp_set_vref(unsigned char set_vref); set_vref determina el valor de Vref interna, en porcentaje de Vpp, por ejemplo: comp_Vref_mode(RA0_RA1, VREF_65) activa las entradas RA0 y RA1 con Vref interna común al 65% de Vpp. Son válidos valores entre VREF_0 y VREF_75 , aunque en la práctica no se obtendrán valores superiores a un 70% de Vdd y este módulo solo es capaz de generar 30 valores distintos de Vref, así que el porcentaje seleccionado se redondea al valor más próximo. La precisión es menor por debajo del 25% de Vdd. Para más detalles consultar el datasheet del pic utilizado. Para comprobar el funcionamiento y exactitud de Vref interna se puede activar el bit 6 CVROE de CVRCON, quedando conectada Vref a RA2: CVRCONbits.CVROE = 1; //ahora Vref está presente en RA2 Esta salida se puede usar como fuente variable de voltaje (D-A), aunque de alta impedancia, para conseguir mayor capacidad de corriente se puede usar un amplificador operacional como segidor de voltaje. comp_inv Invierte o no las salidas de los comparadores void comp_inv(unsigned char set_inv); set_inv define si las salidas de comparadores se invierten o no Las posibles opciones son: NO_INV C1_INV C2_INV C1_C2_INV comp1_read Esta función lee la salida del comparador 1, los posibles valores son 0 o 1. void comp1_read(); comp2_read Esta función lee la salida del comparador 2, los posibles valores son 0 o 1. void comp2_read(); comp_reset Esta función resetea el módulo Comparadores, el módulo queda activo pero la lecturá será 0. void comp_reset(void); comp_off Esta función apaga el módulo Comparadores, evitando el consumo innecesario de corriente. void comp_off(void); Ejemplo de Módulo Comparadores para compilar necesitas los siguientes comandos Ejemplo de compilacion : ./compila.sh ej_comp_87Xa.c 16f877a ej_comp_87Xa.c /* * Ejemplo de utilización de las funciones del módulo comparadores. * válido para la familia 16f87Xa, * En este ejemplo se utiliza el comparador 1 con Vref interna al 50% de Vdd, * conectar voltaje a comparar a RA0, * conectar un led u otra salida a RB7. * RB7 se pondrá en estado alto (Vdd) cuando la tensión en RA0 sea menor que el 50% de Vdd. */ #include <pic/p16f877a.h> #include <comp.h> int main(void) { TRISAbits.TRISA0 = 1; // A0 como entrada TRISAbits.TRISA3 = 1; // A3 como entrada TRISBbits.TRISB7 = 0; // B7 como salida comp_init( TWO_COMP_MULTI4_VREF ); // Inicia comparadores en modo multiplexado con Vref interna comp_set_vref( VREF_50 ); // Establece Vref en 50% Vdd while (1) { if ( comp1_read() == 1 ) // lee comparador 1 = comprueba bit C1OUT de registro CMCON PORTBbits.RB7 = 1; // Enciende led else PORTBbits.RB7 = 0; // Apaga led } }