Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

Utilizando o Comparador do PIC

Share:

Utilizando o Comparador do PIC



Os comparadores são usados ​​para fazer a interface de circuitos analógicos para um
circuito digital, comparando duas tensões analógicas e fornecendo uma indicação numérica das suas magnitudes relativas.

PIC16F877A
O módulo de comparação contém dois comparadores analógicos. As entradas para os comparadores são multiplexados com os pinos I/O  das portas RA0, RA1, RA2 e RA3, enquanto as saídas são multiplexados para os pinos RA4 e RA5.

A Interrupção é habilitado pelo registro PIE2.CMIE. Sua flag é PIE2.CMIF.




C2OUT: Bit de saída do Comparador 2
Caso C2INV = 0:
1 - C2Vin+ maior que  C2Vin-
0 - C2Vin+ menor que C2Vin-
Caso C2INV = 1:
1 - C2Vin+ menor que C2Vin-
0 - C2Vin+ maior que C2Vin-




C1OUT: Bit de saída do Comparador 1
Caso C1INV = 0:
1 - C1Vin+ maior que C1Vin-
0 - C1Vin+ menor que C1Vin-
Caso C1INV = 1:
1 - C1Vin+ menor que C1Vin-
0 - C1Vin+ maior que C1Vin-


C2INV: Inversão da saída do comparador 2
1 - Invertido
0 - Não Invertido


C1INV: Inversão da saída do comparador 1
1 - Invertido
0 - Não-Invertido


CIS: Pino de entrada do comparador

Caso CM2:CM0 = 110:
1 - C1Vin - Pino RA3
     C2Vin - Pino RA2

0 - C1Vin - Pino RA0
     C2Vin - Pino RA1


CM2:CM0: Modo do Comparador


O Registro CVRCON é usado quando a tensão de referência for interna ( CM2:CM0 = 110 ) usando o Módulo de Tensão de Referência do Comparador.




CVREN: Habilita Tensão de referência do comparador
1 - Habilitado
0 - Desabilitado


CVROE: Bit de saída do Comparador 1
1 - CVREF é conectado ao pino RA2
0 - CVREF é desconectado



CVRR: Seleção da gama de tensão de Referência CVref
1 - gama baixa
0 - gama alta


CVR3:CVR0: Valor da tensão VREF(0 a 15)
Caso CM2:CM0 = 110:
1 - C1Vin - Pino RA3
     C2Vin - Pino RA2

0 - C1Vin - Pino RA0
     C2Vin - Pino RA1




EXEMPLO:
void interrupt()
{
 PORTB.F0 = CMCON.C1OUT;
 PIR2.CMIF = 0;
}

void main()
{
 INTCON.GIE;    //habilita interrupção global
 INTCON.PEIE=1; //habilita interrupção periféricos
 PIE2.CMIE=1;      //habilita interrupção do comparador
 CMCON=0b00000011; //modo 011(dois comparadores independentes com saída)
 TRISA=0b00001111; //pinos RA5/RA4 output; RA3/RA2/RA1/RA0 input
 TRISB=0;
}




PIC16F887
O módulo de comparação do PIC16F887 posui as seguintes características:


  • Controle de comparação Independente;
  • Seleção de entrada programável;
  • Saída do comparador está disponível internamente / externamente;
  • Polaridade de saída programável;
  • Interrupção por mudança;
  • Wake-up de suspensão;
  • Desligamento do PWM; 
  • Porta Timer1 (habilitação da contagem);
  • Sincronização de saída para Timer1 entrada de clock;
  • Latch SR;
  • Referência de tensão programável e fixo.


COMPARADOR C1



C1ON: Habilita Comparador C1
1 - Habilitado
0 - Desabilitado

C1OUT: Bit de saída do Comparador 1
Caso C1POL = 0:
1 - C1Vin+ maior que C1Vin-
0 - C1Vin+ menor que C1Vin-
Caso C1POL = 1:
1 - C1Vin+ menor que C1Vin-
0 - C1Vin+ maior que C1Vin-


C1OE: Ativação da saída do Comparador C1
1 - Ativada
0 - Desativada


C1POL: Inversão da saída do Comparador C1
1 - Invertida
0 - Não-Invertida


C1R: Seleção da referência do Comparador C1
1 - A entrada C1Vin+ é ligada a tensão de referência C1Vref
0 - A entrada C1Vin+ é ligado ao pino C1IN+


C1CH1:C1CH0: Seleção do pino de entrada para C1Vin- do comparador C1
00 - C1Vin- é ligado ao pino C12IN0-
01 - C1Vin- é ligado ao pino C12IN1-
10 - C1Vin- é ligado ao pino C12IN2-
11 - C1Vin- é ligado ao pino C12IN3-


COMPARADOR 2






C2ON: Habilita Comparador C2
1 - Habilitado
0 - Desabilitado

C2OUT: Bit de saída do Comparador C2
Caso C2POL = 0:
1 - C2Vin+ maior que C1Vin-
0 - C2Vin+ menor que C1Vin-
Caso C2POL = 1:
1 - C2Vin+ menor que C2Vin-
0 - C2Vin+ maior que C2Vin-


C2OE: Ativação da saída do Comparador C2
1 - Ativada
0 - Desativada


C2POL: Inversão da saída do Comparador C2
1 - Invertida
0 - Não-Invertida


C2R: Seleção da referência do Comparador C2
1 - A entrada C2Vin+ é ligada a tensão de referência C2Vref
0 - A entrada C2Vin+ é ligado ao pino C2IN+


C2CH1:C2CH0: Seleção do pino de entrada para C2Vin- do comparador C2
00 - C2Vin- é ligado ao pino C12IN0-
01 - C2Vin- é ligado ao pino C12IN1-
10 - C2Vin- é ligado ao pino C12IN2-
11 - C2Vin- é ligado ao pino C12IN3-


OUTRO REGISTRO

MC1OUT: Cópia do bit C1OUT

MC2OUT: Cópia do bit C2OUT

C1RSEL: Seleção da referência do Comparador C1
1 - CVref é usado como referência para Comparador C1
0 - Tensão fixa de 0.6V é usado como referência para Comparador C1

C2RSEL: Seleção da referência do Comparador C2
1 - CVref é usado como referência para Comparador C2
0 - Tensão fixa de 0.6V é usado como referência para Comparador C2

T1GSS: Seleção da porta do temporizador TMR1
1 - A porta do gate de TMR1 é T1G
0 - A porta do gate de  TMR é SYNC2OUT

C2SYNC: Sincronização da saída do Comparador C2
1 - A saída de C2 é sincronizada no flanco descendente do clock de TMR1
0 - A saída de C2 é assincrona

TENSÃO DE REFERÊNCIA
Módulo Fonte de Tensão de Referência


VREN: Ativação da tensão de referência de C1
1 - CVref ligado
0 - CVref desligado


VROE: Ativação da tensão de referência de C2
1 - CVref conectado ao pino RA2/AN2/VREF-/CVREF/C2IN+
0 - CVref desconectado do pino RA2/AN2/VREF-/CVREF/C2IN+


VRR: Seleção de Faixa
1 - gama alta
0 - gama baixa


VRSS: Seleção de Faixa de VRef do comparador
1 - CVRSRC = (VREF +) - (VREF-)
0 - CVRSRC = VDD - VSS



VR3:VR0: Seleção de valor para CVref (0 < VR < 15)
Caso VRR=1
CVREF = (VR(3:0)/24) * VDD

Caso VRR=0
CVREF = VDD/4 + (VR(3:0)/32) * VDD

5 comentários:

  1. ola poderia mostra o codigo como e feito noccs pois ja tentei de todas as formas que imaginei

    mais isso nao compila

    ResponderExcluir
  2. tambem tento fazer no pic 16f68a

    mas nao cosigo...se puder dar uma força agradeço

    ResponderExcluir
  3. Olá!! Não estou acostumado a utilizar o CCS, mas acho q o código ficaria desse jeito:

    void isr(){
    //código
    }

    void main(){

    setup_comparator(A0_A3_A1_A2);//dois comp. independentes(A0-A3 e A1-A2)
    setup_vref(FALSE);//desliga tensao de referencia
    enable_interrupts(INT_COMP);//ativa interrupcao do comparador
    enable_interrupts(GLOBAL);//ativa interrupcao global

    while(TRUE){
    //codigo
    }
    }

    ResponderExcluir
  4. Olá! você poderia dar uma dica de como obter o sinal de saída?

    Grato

    Francisco

    ResponderExcluir
  5. Oi Tiago, bom dia
    Tenho o seguinte problema em um programa de leitura analógica com o PIC 16f877, estou tentando realizar a leitura simultânea de dois canais (RA01 e RA02), porém, quando chega a leitura para mim o valor do canal 01 oscila com a do canal 02, ou seja, ora lê o valor de um, ora lê o valor do outro no no mesmo label, nao estou conseguindo separar os valores em label distintos para leitura no c++ buider 6, pode me ajudar aonde estou errando?

    ResponderExcluir