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