En esta sección aprenderás a realizar diferentes aplicaciones, utilizando las diferentes configuraciones de los comparadores analógicos del microcontrolador PIC. Comparadores independientes con salida digital, comparadores con referencia común, comparadores con referencia de voltaje de módulo interno.
Comparador analógico
Un comparador analógico es un componente que compara dos señales analógicas y proporciona una salida que indica la relación entre las dos señales. En el caso de los microcontroladores PIC, los comparadores analógicos permiten comparar una tensión de referencia con una tensión analógica de entrada y generar una señal de salida en función de la relación entre ambas tensiones.

Los comparadores analógicos en los microcontroladores PIC se encuentran generalmente en los periféricos denominados «comparador de tensión analógico» o «comparador analógico». Estos comparadores suelen tener varias características comunes, como las siguientes:
Múltiples entradas: Los comparadores analógicos en los microcontroladores PIC suelen tener dos o más entradas analógicas que se pueden seleccionar para la comparación.
Tensión de referencia: Se puede establecer una tensión de referencia interna o externa que se utilizará como punto de comparación con la señal analógica de entrada.
Salida digital: El comparador genera una salida digital que indica la relación entre la señal de entrada y la tensión de referencia. Por lo general, esta salida es un valor binario (alto o bajo) que puede ser utilizado por el microcontrolador para tomar decisiones.
Histeresis: Algunos comparadores analógicos en los microcontroladores PIC ofrecen la opción de agregar histeresis, lo que ayuda a evitar cambios rápidos en la salida cuando la señal de entrada está cerca del valor de referencia.
Los detalles específicos sobre cómo configurar y utilizar los comparadores analógicos pueden variar según el modelo de microcontrolador PIC que estés utilizando. Para obtener información detallada y precisa, es recomendable consultar la hoja de datos y el manual de referencia del microcontrolador específico que estés utilizando.
Configuración de comparadores para el PIC18F4550.

Configuraciones
Un comparador independiente con salida digital.
setup_comparator(A0_A3_NC_NC_OUT_ON_A4);

Dos comparadores independientes con salidas digitales.
setup_comparator(A0_A3_A1_A2_OUT_ON_A4_A5);

Dos comparadores de referencia común con salidas digitales.
setup_comparator(A0_A3_A1_A3_OUT_ON_A4_A5);
Dos comparadores independientes.
setup_comparator(A0_A3_A1_A2);
Dos comparadores de referencia común.
setup_comparator(A0_A3_A1_A3);
Cuatro entradas multiplexadas a dos comparadores.
setup_comparator(A0_VR_A1_VR);
Cuatro entradas multiplexadas a dos comparadores.
setup_comparator(A3_VR_A2_VR);
Configuración del módulo de voltaje de referencia «CVref».
setup_vref(VREF_LOW | N°);
setup_vref(VREF_HIGH | N°);
Comparador con salida digital
Ejemplo:
Circuito de conexión
Procedimiento
Simplemente se habilita la función con la configuración del comparador que se utilizará.
Código
#FUSES NOMCLR
void main()
{
setup_comparator(A0_A3_NC_NC_OUT_ON_A4);
while(TRUE)
{
}
}
Registros C1OUT y C2OUT
Los registro C1OUT y C2OUT se pueden leer como si fueran una variable creada, el valor dependerá de la comparación de las entradas de voltaje analógico.
C1OUT //registro del comparador 1
C2OUT //registro del comparador 2
Ejemplo:
Circuito de conexión
Código ejemplo: Registros C1OUT y C2OUT
#FUSES NOMCLR
#define comp1 pin_d0
#define comp2 pin_d1
void main()
{
setup_comparator(A0_A3_A1_A2);
while(TRUE)
{
if(C1OUT) //si C1OUT es 1
{
output_bit(comp1,1);
}else //si C1OUT es 0
{
output_bit(comp1,0);
}
if(C2OUT) //si C2OUT es 1
{
output_bit(comp2,1);
}else //si C2OUT es 0
{
output_bit(comp2,0);
}
}
}
Invertir registros C1OUT y C2OUT
Se puede invertir el estado de los registros C1OUT y C2OUT.
CP1_INVERT //invierte el registro C1OUT
CP2_INVERT //invierte el registro C2OUT
Código ejemplo: Invertir registros C1OUT y C2OUT
#FUSES NOMCLR
#define comp1 pin_d0
#define comp2 pin_d1
void main()
{
setup_comparator(A0_A3_A1_A2 | CP1_INVERT | CP2_INVERT); //Registros C1OUT y C2OUT invertidos
while(TRUE)
{
if(C1OUT) //si C1OUT es 1
{
output_bit(comp1,1);
}else //si C1OUT es 0
{
output_bit(comp1,0);
}
if(C2OUT) //si C2OUT es 1
{
output_bit(comp2,1);
}else //si C2OUT es 0
{
output_bit(comp2,0);
}
}
}
Interrupción del comparador
La interrupción del comparador se activa por cualquier cambio en C1OUT y C1OUT.
enable_interrupts(GLOBAL);
enable_interrupts(INT_COMP);
Cuando se activa la interrupción, al final se debe resetear el comparador utilizado, para desactivar la interrupción.
#INT_COMP
void comparador()
{
setup_comparator(Ax_Ax_Ax_Ax...);
}
Código ejemplo: Interrupción del comparador
#FUSES NOMCLR
#define comp1 pin_d0
#define comp2 pin_d1
#INT_COMP
void comparador()
{
if(C1OUT) //si C1OUT es 1
{
output_bit(comp1,1);
}else //si C1OUT es 0
{
output_bit(comp1,0);
}
if(C2OUT) //si C2OUT es 1
{
output_bit(comp2,1);
}else //si C2OUT es 0
{
output_bit(comp2,0);
}
setup_comparator(A0_A3_A1_A2); //Resetea el comparador y la interrupcion
}
void main()
{
setup_comparator(A0_A3_A1_A2);
enable_interrupts(GLOBAL);
enable_interrupts(INT_COMP);
while(TRUE)
{
}
}
Módulo de voltaje de referencia
Para los comparadores:
setup_comparator(A0_VR_A1_VR);
setup_comparator(A3_VR_A2_VR);
se debe configurar el voltaje de referencia «CVref» del modulo interno del PIC.
El numero correspondiente al voltaje se elije en las tablas antes vistas.
setup_vref(VREF_HIGH | N°); // N° => voltaje de referencia
setup_vref(VREF_LOW | N°); // N° => voltaje de referencia
Ejemplo:
Circuito de conexión
Código ejemplo: Módulo de voltaje de referencia
#FUSES NOMCLR
#define comp1 pin_d0
#define comp2 pin_d1
void main()
{
setup_comparator(A0_VR_A1_VR);
setup_vref(VREF_HIGH | 0); // 1.25 volts de referencia
while(TRUE)
{
if(C1OUT) //si C1OUT es 1
{
output_bit(comp1,1);
}else //si C1OUT es 0
{
output_bit(comp1,0);
}
if(C2OUT) //si C2OUT es 1
{
output_bit(comp2,1);
}else //si C2OUT es 0
{
output_bit(comp2,0);
}
}
}
