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.

Conversor A/D

Share:

Conversor A/D


PIC16F887A

O conversor analógico-digital (ADC) permite conversão de um sinal de entrada analógico para um binário de 10 bits. Este dispositivo utiliza entradas analógico, que são multiplexados em uma única amostragem. A saída da amostra está ligada à entrada do conversor. o conversor gera um resultado binária de 10 bits por meio de sucessivas aproximação e armazena o resultado da conversão(ADRESL e ADRESH).
 
A referência de tensão ADC é selecionável por software para ser gerados internamente ou externamente.
 
O ADC pode gerar uma interrupção, uma vez concluída uma conversão.

Configuração:
CONFIGURAÇÃO DAS PORTAS
O ADC não distingue entre tensões analógicas e digitais. Para evitar erros de medição ou estragos no chip, os pinos deve ser configurados como entradas analógicas, antes de iniciar a conversão. Estes registros são TRIS e ANSEL/ANSELH.

CONFIGURAÇÃO DO CANAL
Os bits CHS do registro ADCON0 determina qual canal estará conectado ao conversor.

CONFIGURAÇÃO DA TENSÃO DE REFERÊNCIA
Os bits VCFG do registro ADCON0 fornece controle independente da tensão de referência positivo e negativo. tensão de referência positivo pode ser VDD ou uma fonte de tensão externa. Da mesma forma, a tensão de referência negativa pode ser um VSS ou
fonte de tensão externa.

FONTE DE CLOCK DA CONVERSÃO
A fonte e clock do conversor é selecionável através dos bits ADCS do registo ADCON0. São quatro opções de clock possíveis: Fosc/2, Fosc/8, Fosc/32 e RC.



ADCON0

ADCS1:ADCS0 - Seleção do clock da conversão
00 - Fosc/2
01 - fosc/8
10 - Fosc/32
11 - RC

CHS3:CHS0 - Seleção do canal

GO/DONE - Status da conversão
0 - Conversão completa ou nao iniciada;
1 - Conversão iniciada. O bit é limpo automaticamante quando completar a conversão.

ADON - Habilita o módulo ADC
0 - Habilitado
1 - Desabilitado





ADCON1
ADFM - Formato do resultado da conversão
0 - Justificado para Esquerda
1 - Justificado para Direita



VCFG1 - Tensão de referência negativo
0 - VSS (interno)
1 - pino VREF- (externo)

VCFG0 - Tensão de referência positivo
0 - VDD (interno)
1 - pino VREF+ (externo)



ANSEL/ ANSELH

Configura os pinos:
1 - Analógico
0 - Digital




Iniciando a conversão:

1 - Configurar o pino como entrada;
2 - Configurar o pino como analógico;
3 - Selecione o clock da conversão ADC
4 - Configurar a tensão de referência 
5 - Selecione o canal de entrada ADC
6 - Selecionar o formato do resultado
7 - Ligue o módulo ADC
8 - Configurar a interrupção ADC (opcional):
  • Limpar flag de interrupção ADC
  • Habilitar interrupção ADC
  • Habilitar interrupção periférica
  • interrupção Ativar global
9 - Esperar o tempo de aquisição pretendido. (20 us)
10 - Iniciar a conversão, definindo o bit GO/DONE.
11 - Aguarde ADC conversão, até que:
  • GO/DONE for resetado ou
  • Aguardando a interrupção ADC (caso interrupção esteja ativada)
11 - Leia o resultado ADC
12 - Limpar o flag de interrupção ADC (caso interrupção esteja ativada)

Exemplo:
 Equivale a função ADC_Init() do MikroC PRO PIC
 pino RA0 como entrada
 TRISA = 0b00000001;
 define somente pino RA0 como analogico
 ANSEL = 0b00000001;

 ANSELH = 0;
 selecional o canal utilizado: Canal 0
 
ADCON0.CHS3 = 0;
 
ADCON0.CHS2 = 0;
 
ADCON0.CHS1 = 0;
 
ADCON0.CHS0 = 0;
 
selecionar o clock (RC)
 ADCON0.ADCS1 = 1;
 ADCON0.ADCS0 = 1;

 Seleciona a tensão de referencia
 ADCON1.VCFG1 = 0;
 ADCON1.VCFG0 = 0;
 Seleciona o formato do resultado(para direita)
 ADCON0.ADFM = 1;

 
 
Equivale a função ADC_Read() do MikroC PRO PIC
 habilita conversor
 ADCON0.ADON = 1;
 tempo de aquisição exigida
 delay_us(20);
 

 inicia a conversão
 ADCON0.GO_NOT_DONE = 1;
 espera a conversão terminar
 while(ADCON0.GO_NOT_DONE);
 
desabilita o conversor 
 ADCON0.ADON = 0;
 
habilita conversor
 ADCON0.ADON = 1;
 tempo de aquisição exigida
 delay_ms(20);

 Recupera o valor da conversão
 adc_rd = ((ADRESH <<8) + ADRESL);
return adc_rd;


Mais um exemplo:
unsigned long adc_rd; 

void main()
{
ADC_Init();
ANSEL = 1;//define somente pino RA0 como analógico
ANSELH = 0;

while(1)
{
adc_rd = ADC_Read(0);
delay_ms(100);
}
}

6 comentários:

  1. como faço para fazer uma saída analógica no pic? quero receber um sinal... tratar ele via software e colocar ele em um pino do microcontrolador...?

    ResponderExcluir
    Respostas
    1. acredito que vc irá precisar utilizar o recurso de PWM do microcontrolador PIC e usar também um conversor DAC, que vai converter o sinal que vc tratou e reproduziu como PWM em um sinal com as mesmas propriedades, só que analógico

      Excluir
    2. Usa o canal PWM juntamente com circuito integrador, a tensão de saída vai ser proporcional ao duty cicle do PWM.

      Excluir
  2. Não é possível a utilização de 2 portas ADC em um mesmo projeto?

    ResponderExcluir
    Respostas
    1. É possível sim, mas não ao mesmo tempo!

      Utilizando o PCC para um pic18f4550 fica assim.

      *************************
      void main()
      {
      setup_adc_ports(AN0_TO_AN1);
      setup_adc(adc_clock_div_16);

      while(true)
      {
      set_adc_channel(0);
      delay_us(10);
      variavel1=read_ADC();
      set_adc_channel(1);
      delay_us(10);
      variavel2=read_ADC();
      }
      }

      Para outros microcontroladores vc deve verificar como esta configurado o comando na pasta device o .h do componente

      Excluir
  3. quais as tensões máximas pode se usar no caso de referencias externa?

    ResponderExcluir