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.




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




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


C2INVInversão da saída do comparador 2
1 - Invertido
0 - Não Invertido


C1INVInversã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:CM0Modo 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.




CVRENHabilita Tensão de referência do comparador
1 - Habilitado
0 - Desabilitado


CVROEBit 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



C1ONHabilita Comparador C1
1 - Habilitado
0 - Desabilitado

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


C1OEAtivação da saída do Comparador C1
1 - Ativada
0 - Desativada


C1POLInversão da saída do Comparador C1
1 - Invertida
0 - Não-Invertida


C1RSeleçã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:C1CH0Seleçã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






C2ONHabilita Comparador C2
1 - Habilitado
0 - Desabilitado

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


C2OEAtivação da saída do Comparador C2
1 - Ativada
0 - Desativada


C2POLInversão da saída do Comparador C2
1 - Invertida
0 - Não-Invertida


C2RSeleçã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:C2CH0Seleçã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

MC1OUTCópia do bit C1OUT

MC2OUTCópia do bit C2OUT

C1RSELSeleçã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

C2RSELSeleçã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

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

C2SYNCSincronizaçã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


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


VROEAtivaçã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+


VRRSeleção de Faixa
1 - gama alta
0 - gama baixa


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



VR3:VR0Seleçã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