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

    }	

}