COMO UTILIZAR O CONVERSOR AD DO MICROCONTROLADOR PIC



O CONVERSOR ANALÓGICO DIGITAL (AD)

Vivemos em um mundo analógico. Tudo à nossa volta é analógico. Todas as sensações que podemos experimentar são analógicas (audição, visão, olfato, paladar, tato, etc). E ainda todas as grandezas físicas que se fazem por vezes necessárias determinar, também são analógicas (tensão, corrente, temperatura, pressão, etc).

Porém os sistemas informatizados atuais como computadores, microprocessadores, microcontroladores e outros microsistemas no geral são digitais. Para coletar dados do mundo externo com estes sistemas, é preciso conhecer e compreender melhor o funcionamento dos conversores analógicos (ADCs).

Estes conversores transformam um sinal analógico qualquer em um sinal digital discreto, passivo de ser “processado” pelos computadores e microsistemas digitais atuais.

Para converter um sinal analógico qualquer, o conversor faz algumas amostragens e depois representa a leitura realizada através de um valor equivalente binário (digital), de acordo com a sua precisão. E esta é determinada pelo número de bits que um ADC pode usar em sua escala de conversão. Sendo assim, quanto maior o número de bits dentro da escala de conversão, maior será a precisão do conversor.

Um conversor ADC com 8 bits pode retornar valores dentro da faixa de 00H a FFH (0 a 255) e um ADC com 10 bits retornará valores de 0000H a 03FFH (0 a 1023).

Obs.: O “H” inserido ao lado dos números refere-se à adoção do sistema de numeração hexadecimal, um sistema muito usado em computação e eletrônica e que possui 16 valores – números de 0 a 9 e letras A, B, C, D, E, F, respectivamente, os valores de 10 a 15.

Assim para um mesmo valor de entrada, poderemos ter resoluções diferentes. Quanto menor o valor retornado em nossa resolução, maior será a precisão da medida realizada. A resolução é dada pela fórmula,

resolução = Vref / 2n

onde:

Vref = tensão de entrada no conversor
n = número de bits do conversor (quantidades de bits que compõe um degrau)

Para exemplificar ainda mais, na tabela abaixo você tem o comparativo do valor da resolução para uma conversão do valor de 5 Volts com ADC’s de 8 e 10 bits.

Tabela – Resolução para ADC’s de 8 e 10 bits de precisão

ADC de 8 bits ADC de 10 bits
Valor a ser convertido = 5V

Resolução = Entrada / 28 - 1 = 5V / 256 - 1 = 0,0196 V

Resolução = 19,6 mV
Valor a ser convertido = 5V

Resolução = Entrada / 210 - 1 = 5V / 1024 - 1  = 0,00488 V

Resolução = 4,88 mV

Assim, um sinal analógico variante no tempo é agora desmontado em pequenos degraus durante uma conversão digital. Ou seja, nosso conversor vai de zero até o valor máximo de referência (valor mais alto admitido pelo conversor ADC em sua entrada), em degraus dados pela resolução.

Nota-se que com um ADC de 8 bits podemos representar um valor de 0 a 5VDC em degraus com 0,0196 V cada, e com um ADC de 10 bits podemos representar o mesmo valor em degraus com 0,00488 V cada. Obtemos assim, para o último caso, uma precisão muito maior.

Note que o valor que obteremos do conversor não será o valor de 0,0196V ou 0,00488V, por exemplo, para conversores de 8 e 10 bits respectivamente. O conversor ADC enviará um valor binário dentro da sua escala que representa a grandeza analógica em sua entrada. Cabe a nós desenvolvedores operarmos o "milagre da conversão” do valor binário para um valor decimal dentro da escala desejada. Isso será feito internamente no microcontrolador, através de equações matemáticas previamente definidas no programa.

Um outro ponto importante a respeito é que a informação está dividida em degraus, e se o valor ficar entre um degrau e outro, por exemplo, o ADC poderá enviar uma leitura flutuante hora enviando o primeiro degrau dentro da faixa de leitura, hora o segundo. Mas nunca um valor intermediário entre dois degraus. Os valores dos degraus são sempre fixos!

Vamos a um exemplo bem simples. Digamos que durante uma experiência qualquer, com dois conversores ADC diferentes, um com 8 e outro com 10 bits de precisão, medindo uma tensão com 3,41VDC obtivemos os seguintes resultados:

ADC 8 bits => 10101101 binário = 173 decimal

ADC 10 bits => 1010111010 binário = 698 decimal

Se você multiplicar os valores pela resolução calculada para cada um, obteríamos:

ADC 8 bits => 173 x 19,3 mV = 3,33 V

ADC 10 bits => 698 x 4,88 mV = 3,40 V

No exemplo fica claro o fator precisão no exemplo. Variando apenas um único bit na mesma o valor informado pelo ADC de 8 bits ficou fora da faixa. Já para o ADC de 10 bits a diferença não foi tão grande assim. Some o valor “1” a ambos os valores demonstrados e refaça os calculos. Para ambos os ADC’s o valor retornado será o mesmo. Agora some “2” aos valores retornados. Teremos então, 175 para o ADC de 8 bits e 700 para o ADC de 10 bits. O valores agora obtidos serão 3,43VDC para o ADC de 8 bits e 3,416 para o ADC de 10 bits. Portanto, numa possível “flutuação” durante a conversão, um numero maior de bits na precisão poderá ajudar no resultado final obtido.



O CONVERSOR ADC DO MICROCONTROLADOR PIC

Alguns microcontroladores PIC possuem conversores ADC internos, outros não. É preciso selecionar um que possua conversor ADC interno para poder utilizá-lo. Vamos selecionar o PIC16F877 apenas para fins de exemplo. O conversor ADC deste microcontrolador possui a seguintes características:

- Pode trabalhar com 8 ou 10 bits de precisão;
- Possui 8 canais para conversão;
- Quatro tipos de referência: VDD ou VSS (interna), VREF+ ou VREF- (externa);
- Freqüência de conversão baseada no clock interno do microcontrolador ou através de cristal externo (pode operar no modo sleep);
- Três divisores para a freqüência (clock interno da máquina);
- Dois tipos de justificação do resultado: direita e esquerda;
- Uma interrupção para avisar sobre o término da conversão.

Apesar do modelo possuir 8 canais para conversão, ele só possui um único conversor. Os canais são na verdade entradas ligadas através de uma “chave” que pode ser selecionada internamente através do programa. Assim, apenas uma única conversão pode ser feita por vez.



CONFIGURANDO O PIC PARA LEITURAS ANALÓGICAS

OS REGISTRADORES ADCON1 E TRIS

A primeira coisa a fazer é definir o número de canais necessários para o projeto que você tem em mãos. Após isso é necessário configurar os pinos de I/O onde os canais estão ligados como entradas analógicas (os microcontroladores PIC muitas vezes compartilham vários recursos através de um único pino de I/O, como é feito também em muitos outros microcontroladores). Para configurar os canais analógicos é necessário alterar os bits <PCFG3 : PCFG0> no registrador ADCON1. Veja a tabela abaixo.

Tabela – Seleção dos canais analógicos, VREF+ e VREF-

PCFG3:
PCFG0
AN7
RE2
AN6
RE1
AN5
RE0
AN4
RA5
AN3
RA3
AN2
RA2
AN1
RA1
AN1
RA0
VREF+
VREF-
Canais
ADC
Ref.
Externa
0000
A
A
A
A
A
A
A
A
VDD
VSS
8
0
0001
A
A
A
A
VREF+
A
A
A
RA3
VSS
7
1
0010
D
D
D
A
A
A
A
A
VDD
VSS
5
0
0011
D
D
D
A
VREF+
A
A
A
RA3
VSS
4
1
0100
D
D
D
D
A
D
A
A
VDD
VSS
3
0
0101
D
D
D
D
VREF+
D
A
A
RA3
VSS
2
1
0110
D
D
D
D
D
D
D
D
VDD
VSS
0
0
0111
D
D
D
D
D
D
D
D
VDD
VSS
0
0
1000
A
A
A
A
VREF+
VREF-
A
A
RA3
RA2
6
2
1001
D
D
A
A
A
A
A
A
VDD
VSS
6
0
1010
D
D
A
A
VREF+
A
A
A
RA3
VSS
5
1
1011
D
D
A
A
VREF+
VREF-
A
A
RA3
RA2
4
2
1100
D
D
D
A
VREF+
VREF-
A
A
RA3
RA2
3
2
1101
D
D
D
D
VREF+
VREF-
A
A
RA3
RA2
2
2
1110
D
D
D
D
D
D
D
A
VDD
VSS
1
0
1111
D
D
D
D
VREF+
VREF-
D
A
RA3
RA2
1
2

Pinos configurados como I/O digital (D)


Pinos configurados como entrada analógica (A)

Além do registrador ADCON1, os registradores TRISA e TRISE (para o caso do PIC16F877) devem ser configurados corretamente. Os pinos que serão utilizados como entradas analógicas devem ser configurados como entradas através dos referidos registradores (fazendo o bit = 1).



JUSTIFICAÇÃO DO RESULTADO – CONVERSÕES PARA 8 E 10 BITS

Agora que já temos informações sobre a seleção dos canais analógicos vamos falar sobre a “justificação” do resultado obtido. Esta pode ser feito de duas maneiras: à direita ou à esquerda. Para isso basta configurar o bit <ADFM> no registrador ADCON1 conforme a tabela 3.

Tabela – Seleção da justificação em ADCON1

ADFM
Justificação
0
Justificado a esquerda. O resultado da conversão utiliza todos os bits (0 a 7) de ADRESH e somente dois bits (7 e 6) de ADRESL
1
Justificado a direita. O resultado da conversão utiliza todos os bits (0 a 7) de ADRESL e somente dois bits (7 e 6) de ADRESH

A justificação ajuda quando desejamos trabalhar com apenas 8 bits na conversão ao invés de 10. Neste caso justificamos a esquerda onde utilizaríamos todos os bits em ADRESH e desprezaríamos os bits em ADRESL.



TENSÂO DE REFERÊNCIA

O valor apresentado pelo ADC leva em conta, sempre, a referência selecionada. Ou seja, quando a referência VREF+ selecionada for VDD, por exemplo, a conversão máxima 5VDC será representada pelo valor 1024.

Porém se você optar por utilizar os pinos RA3 e/ou RA2 como entrada para diferentes tensões de referência, a máxima conversão retornada como 1024 terá exatamente o valor inserido no pino RA3 ou ainda a diferença entre RA3 e RA2, caso VREF- tenha sido selecionado também. De qualquer maneira, é necessário observar os valores máximos e mínimos para trabalhar com tensões de referência externas no PIC. Veja a tabela abaixo.

Tabela – Valores máximos e mínimos p/ tensões de ref. externas

Referência
Valor Mínimo (V)
Valor Máximo (V)
VREF+
VDD – 2,5
VDD + 0,3
VREF-
VSS – 0,3
VREF+ + 2,0
(VREF+ - VREF-)
2,0
VDD + 0,3


VELOCIDADE DE AMOSTRAGEM E SELEÇÃO DO TAD

Um outro detalhe muito importante sobre o conversor analógico interno do PIC diz respeito a sua velocidade. Toda amostragem feita é realizada pelo processo Sample and Hold (amostra e congela). O conversor possui um capacitor interno (120 pF) que é ligado ao canal analógico selecionado durante a amostragem do sinal. Assim, ele é carregado com a tensão presente na entrada. Quando um processo de conversão tem inicio, o capacitor é desligado do canal selecionado, mantendo assim a tensão anteriormente presente na entrada. Assim, mesmo que a tensão na entrada sofra pequenas variações, estas não afetarão a conversão que agora está em andamento internamente.

Devido a este fato você deve tomar muito cuidado durante suas “medidas analógicas” com o PIC. Digamos que entre uma leitura e outra o capacitor se descarregue por completo. Para que uma nova conversão possa ser feita de maneira adequada, é necessário esperar pela carga total do capacitor. Assim é necessário que entre uma leitura e outra haja um tempo (tempo de adequação do capacitor). Recomenda-se que na pior das hipóteses este não seja inferior a 40 us (40 x 10-6 segundos).

A adequação do capacitor interno também dependerá da temperatura e da impedância inserida na entrada. Valores entre 50k Ohm e 10k Ohm são os indicados. Quanto menor o valor da impedância inserida na entrada, menor será o tempo de adequação do capacitor.

O tempo de adequação do capacitor também está intimamente ligado ao clock selecionado para o conversor ADC. Podemos chamar este tempo (período) de TAD e este será equivalente ao tempo de conversão de 1 bit. Como o conversor do PIC tem 10 bits teremos 10 x TAD . É preciso acrescentar dois períodos neste total, sendo um para a adequação do capacitor e outro para o inicio da conversão. Temos então 12  x TAD. O valor de TAD dependerá então do valor da freqüência do clock selecionada para o conversor.

Obs.: é recomendável acrescentar mais 2 TAD no total calculado, pois ao final da conversão o flag da interrupção é marcado e o capacitor será religado.



REGISTRADOR ADCON0

SELEÇÃO DA FREQUENCIA PARA O CONVERSOR

Agora você tem algumas informações que o ajudarão a calcular melhor o tempo de adequação do capacitor e assim evitar medidas errôneas. Para isso será necessário selecionar a freqüência de trabalho para o conversor. Esta será feita em dois bits <ADCS1:ADCS0> do registrador ADCON0. Veja a tabela abaixo.


Tabela – Seleção da Freqüência

ADCS1
ADCS0
Freqüência
0
0
FOSC / 2
0
1
FOSC / 8
1
0
FOSC / 32
1
1
RC interno

Vamos a um pequeno exemplo. Digamos que o cristal externo no PIC seja de 20 MHz e a opção selecionada seja FOSC / 2, então temos:

TAD = 2 / 20.000.000 = 100 x 109 => 100ns

Este tempo é bastante pequeno, se considerarmos que cada ciclo de máquina nesta situação terá 200 ns. Assim o mesmo não é recomendado.

A escolha correta para este caso seria FOSC / 32. Com este valor obteríamos um TAD de 1,6 us aproximadamente. Multiplicando o total obtido nosso tempo total seria de aproximadamente 22 us. Se a cada leitura entre um ou mais canais, um tempo de 40 us fosse dado, estaríamos mais que dentro dos nossos limites.

Obs.: A escolha correta da freqüência de trabalho do conversor representa a diferença entre o sucesso e o fracasso no uso deste periférico.

Outros bits importantes no registrador ADCON0 são: <CH2:CH0>, <ADON> e <GO/DONE>. O bit <ADON> liga o sistema de conversão. Os bits <CHS2:CHS0> são utilizados para selecionar o canal que desejamos trabalhar ADCON0. Veja a tabela abaixo.

Tabela – Seleção do canal

CHS2:CHS0
Canal selecionado
000
Canal 0 (AN0/RA0)
001
Canal 1 (AN0/RA1)
010
Canal 2 (AN0/RA2)
011
Canal 3 (AN0/RA3)
100
Canal 4 (AN0/RA5)
101
Canal 5 (AN0/RE0)
110
Canal 6 (AN0/RE1)
111
Canal 7 (AN0/RE2)

O bit <GO/DONE> determina o estado do ADC: 0 indica que a conversão terminou, 1 conversão em andamento. Se o bit for forçado a “zero” lógico, a conversão é finalizada e os valores presentes em ADRESH e ADRESL não são afetados.

Observados as configurações, vamos a um pequeno segmento de código que o ajudara a compreender melhor o que foi dito até aqui. O mesmo foi montado na linguagem assembly Microchip (Assembler é compilador!!!). Este demonstrará como utilizar apenas um único canal analógico (AN0-RA0), com VREF+ igual a VDD (5VDC) e VREF- igual a VSS (GND). Veja o código a seguir:


pic_init:
bsf STATUS,RP0                      ; muda para banco 1
movlw b'00001110'                  ; faz porta A digtal
                                           ; exceto RA0 (AN0)
movwf ADCON1                        ; valor justificado a esquerda
movlw 0x01                                  ; ajusta os bits em A como saída
movwf TRISA                             ; exceto RA0
                                           ; (AN0 - entrada analógica)
bcf STATUS,RP0                       ; volta para banco 0
movlw b'01000001'                    ; liga ADC canal 0
movwf ADCON0                         ; fosc/8

Esta primeira parte do código deve ser inserida no inicio do seu programa, no ponto de configuração do PIC. Veja que o registrador ADCON1 é setado de acordo com o indicado na segunda tabela apresentada, para os bits PCFG3:PCFG0. Apenas RA0 é utilizado como entrada analógica. O bit ADFM é setado de acordo com a terceira tabela (justificação à esquerda).

O registrador TRISA também é configurado conforme descrito: apenas RA0 é entrada, e o restante dos bits será utilizado como saída. É importante notar que estes registradores encontram-se no banco 1, e assim é necessário fazer a troca de bancos antes de qualquer tentativa de acessar os registradores descritos.

No segmento de código demonstrado o registro ADCON0 é carregado com o valor binário “01000001”. Isso nos dá a seguinte configuração, conforme tabela abaixo:

Tabela – Configuração no registrador ADCON0

Bit
Nome do Bit
Valor inserido
7
ADCS1 – Freqüência do conversor
0
6
ADCS0 – Freqüência do conversor
1
5
CHS2 – Canal selecionado
0
4
CHS1 – Canal selecionado
0
3
CHS0 – Canal selecionado
0
2
GO/DONE – Estado do ADC
0
1
Não utilizado
0
0
ADON – Liga conversor analógico
1

A leitura do canal seria feita então, da seguinte maneira:


loop:
bsf ADCON0,2          ; colhe dado do canal analógico

espera_ad:
btfsc ADCON0,2        ; testa para ver se dado pronto
goto espera_ad        ; dado ainda não pronto
                      ; continua teste
movf ADRESH,W         ; carrega valor da conversão em "W"
call _40us            ; temporiza 40 us
goto loop             ; faz eternamente

Neste segmento de código, quando a conversão é finalizada, o valor de ADRESH é inserido em W. Em seguida é realizado uma “espera” e uma nova leitura é realizada.

O comando “goto loop” pode ser retirado e no lugar deste inserido as rotinas de conversão do valor obtido. Neste caso a temporização poderá ser retirada também, dependendo do período que esta conversão ocupar (desde que esta não tenha um tempor de execução menor ao TAD total calculado). Você também poderá ativar a interrupção para “leitura/conversão realizada”. Para isso é necessário seguir os seguintes passos:

- Limpar o bit <ADIF> no registrador PIR1;
- Ligar a interrupção do ADC através do bit <ADIE> no registrador PIE1;
- Ligar as interrupções para periféricos através do bit <PEIE> no registrador INTCON;
- Ligar as interrupções (gerais) através do bit <GIE> no registrador INTCON.


CONCLUSÃO

As informações passadas neste artigo apenas preparam a utilização do conversor ADC do microcontrolador PIC Microchip. Um exemplo de uso pode ser encontrado neste site, no projeto Voltímetro PIC. Bom estudo e até a próxima.



Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.