0% acharam este documento útil (0 voto)
287 visualizações31 páginas

Tutorial Modulo ADC

O documento descreve os principais componentes de um sistema embarcado, incluindo conversores analógico-digital (ADC) e digital-analógico (DAC). Explica que os ADC convertem sinais analógicos contínuos em valores digitais discretos através de uma função de transferência. Detalha diferentes tipos de ADC, incluindo FLASH, rampa e aproximações sucessivas, e parâmetros como resolução, erro de quantificação e tempo de conversão.

Enviado por

José Luís
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
287 visualizações31 páginas

Tutorial Modulo ADC

O documento descreve os principais componentes de um sistema embarcado, incluindo conversores analógico-digital (ADC) e digital-analógico (DAC). Explica que os ADC convertem sinais analógicos contínuos em valores digitais discretos através de uma função de transferência. Detalha diferentes tipos de ADC, incluindo FLASH, rampa e aproximações sucessivas, e parâmetros como resolução, erro de quantificação e tempo de conversão.

Enviado por

José Luís
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 31

Departamento de Engenharia Electrotécnica

Microprocessadores 2009/2010

DEPARTAMENTO DE ENGENHARIA ELECTROTÉCNICA


MICROPROCESSADORES
Tutorial - Módulo ADC

Introdução

O mundo real é no seu todo um sistema analógico; a maioria das grandezas e variáveis
envolventes aos sistemas embebidos têm uma natureza e/ou uma interface analógica de algum
tipo. A temperatura, a pressão, a luminosidade, a humidade, uma tensão ou corrente eléctrica,
etc., são todos exemplos de grandezas analógicas que rodeiam e interferem no funcionamento
dos sistemas embebidos.

Neste contexto, e dado que um sistema embebido, contrariamente a um computador de uso


comum, se destina a responder, monitorizar e a controlar a sua envolvente exterior, é então
imperativo que existam interfaces sensoriais e de actuadores que permitam fazer essa
transposição entre o mundo real analógico e o mundo digital perceptível e interpretável pelos
sistemas de processamento embebidos, sejam microcontroladores ou microprocessadores.

Por esta razão, a maioria dos microcontroladores existentes no mercado incluem nos seus
dispositivos periféricos internos módulos especiais que permitem esta interface de aquisição e
controlo analógico, que são respectivamente denominados por:

 Conversores analógico – digital, ou ADC, do inglês Analog to Digital Converter;


 Conversores digital – analógico, ou DAC, do inglês Digital to Analog Converter;

Conversor analógico – digital (ADC)

Um conversor analógico – digital (abreviado ADC) por definição é um dispositivo que converte
sinais analógicos contínuos em variáveis lógicas (digitais) discretas.

Tutorial - Módulo ADC Página 1 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Tipicamente, um ADC converte tensões ou correntes eléctricas numa dada correspondente


palavra digital interpretável por microcontroladores e/ou microprocessadores. A codificação
digital da variável analógica pode ser feita de acordo com diferentes esquemas, por exemplo,
codificação binária, códigos de Gray ou ainda codificação binária em código de complementos
de dois, sendo no entanto vulgarmente utilizada a codificação binária simples.

Neste caso, a variável digital de saída do conversor corresponde a uma palavra binária
directamente relacionada com o nível da grandeza analógica adquirida, seja tensão ou corrente
eléctrica.

A correspondência entre a variável analógica adquirida e o resultado digital da conversão é


normalmente definido através da chamada função de transferência do conversor ADC, que
define qual o código digital resultante da conversão em função da intensidade da variável
analógica adquirida, sendo um exemplo de uma função de transferência apresentado na Figura
1.

Figura 1 – Exemplo de uma função de transferência de um conversor A/D

Tal como se pode verificar através da Figura 1, o gráfico da função de transferência do ADC
não representa uma curva de correspondência contínua, mas antes uma curva discreta com
dados níveis bem definidos, que correspondem aos códigos resultantes da conversão.

Estes níveis definem o que é designado por resolução do conversor ADC, que é o número de
níveis ou códigos binários resultantes da conversão que o ADC consegue produzir ao longo de
uma dada gama de valores analógicos de entrada.

Tutorial - Módulo ADC Página 2 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Dado que o resultado de uma conversão é normalmente expresso numa dada palavra binária, a
resolução de um conversor ADC é normalmente definida através do número de bits que
constituem essa palavra. Em consequência, o número de níveis ou códigos binários possíveis
numa conversão analógico – digital é definida como sendo: 𝑁 = 2𝑏𝑖𝑡𝑠 . Por exemplo, no caso da
figura anteriormente apresentada (Figura 1), pode-se concluir que o conversor ADC
correspondente tinha uma resolução de 3 bits, dado que existem 𝑁 = 23 = 8 níveis diferentes
na função de transferência.

Facilmente se depreende que quanto maior for a resolução do conversor, mais níveis (mais
codificações possíveis) existirão para a codificação de uma dada grandeza analógica, pelo que a
conversão será mais exacta, e a respectiva função de transferência apresentará uma curva mais
contínua, aproximando-se mais do sinal analógico real.

A resolução de um conversor ADC pode igualmente ser definida em termos da grandeza


analógica em medição. Tomando o exemplo de um conversor ADC de tensão eléctrica, a
resolução, expressa em volt, é dada pela seguinte expressão:

𝑉𝑅𝐸𝐹+ − 𝑉𝑅𝐸𝐹− 𝑉𝑅𝐸𝐹+ − 𝑉𝑅𝐸𝐹−


𝐿𝑆𝐵 = =
2𝑏𝑖𝑡𝑠 𝑁

Nesta expressão, um LSB define o valor mínimo de tensão na entrada do conversor ADC que
pode ser convertido. Por outras palavras, define o valor em tensão a que corresponde cada bit da
palavra digital resultante da conversão.

O valor de um LSB está directamente relacionado com as chamadas tensões de referência,


𝑉𝑅𝐸𝐹+ e 𝑉𝑅𝐸𝐹−, que definem a gama de tensões de entrada admissíveis no conversor ADC, bem
como com a resolução em bits do conversor, isto é, o número de níveis existentes na codificação
binária da grandeza analógica.

Pegando ainda no exemplo da Figura 1 e assumindo uma gama de funcionamento de 0 a 10V


10−0
para as entradas analógicas, então o LSB da conversão seria: 𝐿𝑆𝐵 = 23
= 1.25𝑉.

Tendo o valor do LSB definido, pode ser feita a conversão inversa, isto é, determinar o valor
medido da grandeza analógica em função do resultante código binário da conversão, que é
assim definida pelo número de LSBs medidos (resultado da conversão), em função da tensão
correspondente a cada LSB, ou seja:

𝑉𝑚𝑒𝑑𝑖𝑑𝑎 = 𝐶𝑜𝑑𝑖𝑔𝑜 × 𝐿𝑆𝐵

Tutorial - Módulo ADC Página 3 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

O LSB de um conversor ADC define igualmente o designado erro de quantificação de uma


conversão, e que é uma característica intrínseca de qualquer ADC, e que resulta da resolução
finita de um conversor.

O erro de quantificação máximo de um conversor é dado por metade de um LSB, e define que o
valor real da grandeza medida pode estar compreendido entre o valor medido e um erro com
uma amplitude total de 1 LSB, ou seja:

𝑉𝑟𝑒𝑎𝑙 = 𝑉𝑚𝑒𝑑𝑖𝑑𝑎 ± 0.5𝐿𝑆𝐵

Seguindo o exemplo da conversão apresentada na figura anterior, e assumindo um LSB de


1.25V, então o erro de quantificação define que para uma conversão que resultou num código
binário “010”, isto é, 2 em decimal, e que corresponde a um valor de tensão medido de 2.5V, o
valor real da tensão pode estar compreendido entre 2.5 ± 0.625𝑉 = 1.875𝑉; 3.125𝑉 .

Um outro parâmetro importante num conversor ADC e que depende directamente das
características do hardware e do tipo de implementação utilizado para a construção do ADC é o
chamado tempo de conversão, que define o período de tempo que decorre desde o inicio da
conversão até ser produzida a palavra digital correspondente. Em certas aplicações mais
exigentes, este parâmetro é um factor crítico a tomar em conta, pois pode influenciar o
desempenho do sistema, casos de sistemas que manipulem sinais de áudio e/ou vídeo.

Existem diferentes tipos de conversores ADC, cada um com características e especificações de


funcionamento próprias, dos quais se destacam as seguintes implementações:

 ADC de conversão directa ou FLASH ADC, que consiste num conjunto de


comparadores em paralelo, cada um referenciado para uma dada gama de LSBs da
conversão, e cujo resultado binário é dado pelas saídas dos comparadores, em função da
tensão de entrada:

Tutorial - Módulo ADC Página 4 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Figura 2 – Conversor ADC FLASH

 Comparador em rampa ou slope ADC, que consiste na geração sucessiva de códigos


binários possíveis para o resultado da conversão. Esses códigos são realimentados para
um conversor DAC interno, que os converte na tensão analógica correspondente. Essa
tensão é continuamente comparada com a tensão de entrada até ao ponto em que ambas
são iguais, resultando então a palavra de conversão obtida:

Figura 3 – Conversor ADC em rampa (Slope ADC)

 ADC de aproximações sucessivas, ou SAR do inglês Successive Approximation


Register ADC, que consiste em, sucessivamente e iterativamente, ir colocando o bit
mais significativo da conversão a „1‟ e, por meio de uma DAC, comparar o valor de

Tutorial - Módulo ADC Página 5 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

tensão obtido com essa palavra com a tensão de entrada. Se 𝑉𝐷𝐴𝐶 > 𝑉𝐼𝑛 , então o bit
correspondente da conversão deve manter-se a „1‟, caso contrário o bit deve ser
colocado a „0‟. Fixando o valor desse bit com esta comparação, a conversão continua
efectuando o mesmo procedimento para o próximo bit mais significativo da conversão,
até se ter atingido o número de bits do conversor ADC:

Figura 4 – Conversor ADC de aproximações sucessivas (SAR ADC)

Conversor digital – analógico (DAC)

Em antítese a um conversor ADC, que converte uma grandeza analógica numa dada palavra
digital, um conversor digital – analógico (abreviado DAC) é um dispositivo que converte uma
dada palavra digital num correspondente sinal analógico.

Tipicamente, um DAC converte uma dada palavra digital numa correspondente tensão ou
corrente eléctrica.

De uma forma semelhante ao caso dos conversores ADC, a codificação digital da variável
analógica pode ser feita de acordo com diferentes esquemas, por exemplo, codificação binária,
códigos de Gray ou ainda codificação binária em código de complementos de dois, sendo no
entanto vulgarmente utilizada a codificação binária simples.

A função de transferência de um conversor DAC define a correspondência entre um código


binário de entrada e o correspondente nível de saída da grandeza analógica.

Tutorial - Módulo ADC Página 6 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Um exemplo de uma função de transferência para um conversor DAC encontra-se representado


na Figura 5.

Figura 5 – Exemplo de uma função de transferência de um conversor D/A

Tal como acontece com um conversor ADC, um conversor DAC é igualmente caracterizado
pela resolução de conversão, que neste caso define o número de níveis (passos) de variação na
saída analógica em função da palavra digital de entrada.

Sendo a resolução da conversão definida no número de bits da palavra de entrada do conversor


DAC, então facilmente se concluí que o conversor consegue produzir 𝑁 = 2𝑏𝑖𝑡𝑠 níveis
diferentes de variação na respectiva saída analógica.

Caso o conversor DAC seja um conversor em tensão, então a resolução do mesmo pode
igualmente ser expressa em termos da tensão, através da seguinte expressão:

𝑉𝑅𝐸𝐹+ − 𝑉𝑅𝐸𝐹− 𝑉𝑅𝐸𝐹+ − 𝑉𝑅𝐸𝐹−


𝐿𝑆𝐵 = =
2𝑏𝑖𝑡𝑠 𝑁

Neste caso, um LSB define a variação de tensão na saída analógica do conversor que
corresponde à variação no bit menos significativo da palavra digital de entrada do conversor.

Analisando ainda a expressão indicada, as tensões de referência 𝑉𝑅𝐸𝐹+ e 𝑉𝑅𝐸𝐹− definem agora
respectivamente os limites máximo e mínimo da tensão de saída do conversor DAC.

Assim sendo, o valor da tensão analógica de saída do conversor DAC é definida como sendo
directamente proporcional à palavra digital de entrada do conversor, sendo a unidade de
conversão o valor de tensão correspondente a um LSB, isto é:
Tutorial - Módulo ADC Página 7 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

𝑉𝑠𝑎í𝑑𝑎 = 𝐶𝑜𝑑𝑖𝑔𝑜 × 𝐿𝑆𝐵

Existem diferentes tipos de conversores DAC, cada um com características e especificações de


funcionamento próprias, dos quais se destacam as seguintes implementações:

 PWM DAC, que é um conversor DAC implementado através da modulação em largura


de pulso de um dado sinal digital. Esta modulação permite definir, através do duty-cycle
utilizado na modulação o valor médio de tensão do sinal resultante, que após a devida
filtragem resulta num sinal analógico puro;
 DAC R-2R, que utiliza uma cascata de resistências de valor R e 2R, comutadas através
do valor binário dos correspondentes bits da palavra de entrada para assim produzir uma
tensão analógica:

Figura 6 – Conversor DAC R-2R

 Binary-Weighted DAC, que consiste num esquema paralelo de resistências, todas elas
com um valor resistivo adequado ao peso do bit na palavra digital de entrada, e cuja
soma das correntes individuais produz, à saída do amplificador operacional, a tensão de
saída do conversor:

Tutorial - Módulo ADC Página 8 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Figura 7 – Conversor Binary-Weighted DAC

Módulo ADC no microcontrolador PIC18F4520

O microcontrolador PIC18F4520 integra nos seus dispositivos periféricos internos um módulo


conversor analógico digital (ADC) que permite a amostragem e aquisição de sinais analógicos
provenientes do exterior.

Este módulo ADC do microcontrolador possui as seguintes características funcionais:

 Conversor ADC interno de aproximações sucessivas (SAR);


 Resolução de 10 bits;
 Possibilidade de utilização de 13 entradas analógicas, multiplexadas com linhas de I/O
comuns;
 Possibilidade de utilização das tensões de alimentação do microcontrolador como
tensões de referência da conversão, ou utilização de tensões de referência diferentes de
acordo com a implementação, através das linhas 𝑉𝑅𝐸𝐹+ e 𝑉𝑅𝐸𝐹−-;

Um diagrama de blocos simplificado deste módulo ADC é apresentado na Figura 8.

Tutorial - Módulo ADC Página 9 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Figura 8 – Diagrama de blocos do módulo ADC do microcontrolador PIC18F45201

Ao módulo ADC do microcontrolador PIC18F4520 estão associadas 13 linhas de I/O que


correspondem respectivamente aos 13 canais de entradas analógicas oferecidas pelo módulo
ADC.

Estas linhas estão mapeadas nos pinos do microcontrolador da seguinte forma:

Pino Função
RA0/AN0 Canal 0 do módulo ADC
RA1/AN1 Canal 1 do módulo ADC
RA2/AN2/VREF- Canal 2 do módulo ADC / Tensão de referência negativa
RA3/AN3/VREF+ Canal 3 do módulo ADC / Tensão de referência positiva
RA5/AN4 Canal 4 do módulo ADC
RE0/AN5 Canal 5 do módulo ADC
RE1/AN6 Canal 6 do módulo ADC
RE2/AN7 Canal 7 do módulo ADC
RB2/AN8 Canal 8 do módulo ADC
RB3/AN9 Canal 9 do módulo ADC
RB1/AN10 Canal 10 do módulo ADC
RB4/AN11 Canal 11 do módulo ADC
RB0/AN12 Canal 12 do módulo ADC

1
Imagem retirada de [Link]
Tutorial - Módulo ADC Página 10 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Ao módulo ADC estão ainda associados os seguintes registos, que regulam e controlam o seu
funcionamento:

 ADCON0 (ADC Control Register 0) – Registo de controlo do módulo ADC, que


permite:
o A activação do módulo ADC;
o A selecção do canal em uso;
o Habilitar o início de uma nova conversão;

Registo ADCON0
--- --- CHS3 CHS2 CHS1 CHS0 GO/*DONE ADON

 ADCON1 (ADC Control Register 1) – Registo de controlo do módulo ADC, que


permite:
o A selecção e configuração dos pinos como canais ADC;
o A definição das referências de tensão a utilizar pelo ADC;

Registo ADCON1
--- --- VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0

 ADCON2 (ADC Control Register 2) – Registo de controlo do módulo ADC, que


permite:
o A definição do formato do resultado da aquisição;
o A configuração do tempo de aquisição para cada amostra;
o A selecção da fonte de relógio para o módulo ADC;

Registo ADCON2
ADFM --- ACQT2 ACQT1 ACQT0 ADCS2 ADCS1 ADCS0

 ADRESH (ADC Result High Register) e ADRESL (ADC Result Low Register) –
Registos auxiliares que retornam o resultado obtido da conversão digital do sinal
analógico lido, contendo respectivamente o byte mais significativo e o byte menos
significativo da conversão.

Tutorial - Módulo ADC Página 11 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Sendo um conversor com 10 bits de resolução, a função de transferência do conversor ADC


interno do microcontrolador PIC18F4520 é apresentada na figura seguinte:

Figura 9 – Função de transferência do conversor A/D do microcontrolador PIC18F4520

A activação individual dos canais analógicos activos no microcontrolador, e passíveis de


conversão pelo módulo ADC, é feita através dos bits PCFG<3:0> do registo ADCON1, com a
correspondência apresentada na Figura 10.

Figura 10 – Configuração das linhas analógicas no registo ADCON1

Tutorial - Módulo ADC Página 12 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Assim sendo, o programador deverá configurar estes bits em conformidade com os canais
analógicos que pretende utilizar, garantindo que esses canais são configurados como entradas
analógicas. As restantes linhas, se não utilizadas pelo módulo ADC do microcontrolador,
deverão ser definidas como linhas digitais comuns.

Dada a possibilidade de multiplexagem de até 13 canais analógicos diferentes, a selecção do


canal a utilizar para a conversão no módulo ADC deverá ser feita através dos bits CHS<3:0>
do registo ADCON0. Esta operação de selecção do canal em uso deve ser efectuada sempre antes
de se dar uma nova ordem de conversão.

Para o correcto funcionamento do módulo ADC, é necessário que seja definido um relógio de
conversão, que define o período de tempo necessário para efectuar uma conversão de 1 bit.

Este período de tempo 𝑇𝐴𝐷 deve definido de tal forma a que seja no mínimo 0.7 us e, no
máximo, 25us.

Assim, e dado que podem ser utilizadas diferentes frequências de oscilador no


microcontrolador, o tempo de conversão do ADC 𝑇𝐴𝐷 deve ser devidamente configurado através
dos bits ADCS<2:0> do registo ADCON2 numa das seguintes configurações, garantido que o
tempo 𝑇𝐴𝐷 mínimo seja 0.7 us:

2
 𝑇𝐴𝐷 = 𝐹
𝑂𝑆𝐶
4
 𝑇𝐴𝐷 = 𝐹
𝑂𝑆𝐶

8
 𝑇𝐴𝐷 = 𝐹
𝑂𝑆𝐶

16
 𝑇𝐴𝐷 = 𝐹
𝑂𝑆𝐶

32
 𝑇𝐴𝐷 =
𝐹𝑂𝑆𝐶
64
 𝑇𝐴𝐷 =
𝐹𝑂𝑆𝐶
1
 𝑇𝐴𝐷 = 𝐹 , onde 𝐹𝑅𝐶 define a frequência do oscilador interno do módulo ADC. Neste
𝑅𝐶

caso, o tempo 𝑇𝐴𝐷 é tipicamente 1.2 us.

Tendo definido este tempo 𝑇𝐴𝐷 , e de acordo com as características do conversor ADC do
microcontrolador PIC, o tempo necessário até se obter os 10 bits resultantes da conversão é
definido como sendo 𝑇𝑐𝑜𝑛𝑣 = 11 × 𝑇𝐴𝐷 , ou seja, o tempo de conversão é igual ao número de

Tutorial - Módulo ADC Página 13 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

bits da resolução do conversor multiplicado pelo tempo de conversão de cada bit 𝑇𝐴𝐷 , mais um
tempo 𝑇𝐴𝐷 .

Na Figura 11 encontra-se representado o diagrama temporal exacto de uma conversão no


módulo ADC.

Figura 11 – Diagrama temporal da conversão A/D no microcontrolador PIC18F4520

Outro parâmetro importante a definir na configuração do módulo ADC reside na configuração


do tempo de aquisição, que define o período de tempo inserido entre a selecção e comutação de
um canal analógico para o conversor ADC e o inicio da conversão do referido canal.

A correcta definição deste tempo, que é essencialmente dependente da impedância de saída do


circuito fonte do sinal analógico em medição, é crucial para a aquisição e conversão do mesmo,
dado que define o tempo necessário para que o circuito de amostragem interno do conversor
ADC, o circuito de sample & hold, estabilize no valor de tensão da entrada analógica, mantendo
esse valor de tensão durante todo o processo de conversão.

O tempo de aquisição 𝑇𝐴𝐶𝑄 deve ser configurado para ser no mínimo 1.4us, sendo fornecidos ao
programador as seguintes opções de configuração, parametrizáveis através dos bits
ACQT<2:0> do registo ADCON2:

 𝑇𝐴𝐶𝑄 = 0𝑇𝐴𝐷
 𝑇𝐴𝐶𝑄 = 2𝑇𝐴𝐷
 𝑇𝐴𝐶𝑄 = 4𝑇𝐴𝐷
 𝑇𝐴𝐶𝑄 = 6𝑇𝐴𝐷
 𝑇𝐴𝐶𝑄 = 8𝑇𝐴𝐷
 𝑇𝐴𝐶𝑄 = 12𝑇𝐴𝐷

Tutorial - Módulo ADC Página 14 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

 𝑇𝐴𝐶𝑄 = 16𝑇𝐴𝐷
 𝑇𝐴𝐶𝑄 = 20𝑇𝐴𝐷

Nas configurações anteriormente apresentadas, a definição do tempo de aquisição como sendo


𝑇𝐴𝐶𝑄 = 0𝑇𝐴𝐷 implica que seja o programador a, manualmente, inserir um tempo de espera entre
a selecção do canal analógico a converter e a ordem de início de conversão, devendo este tempo
de espera ser definido de acordo com as especificações do sinal a adquirir.

Considerando agora este tempo de aquisição, então o tempo total de conversão, desde a selecção
do canal analógico até à obtenção do resultado da conversão é definido por:

𝑇𝑐𝑜𝑛𝑣 = 𝑇𝐴𝐶𝑄 + 11 × 𝑇𝐴𝐷

Ainda considerando este tempo, o diagrama temporal da conversão pode então ser representado
tal como na Figura 12.

Figura 12 – Diagrama temporal da conversão A/D no microcontrolador PIC18F4520

Uma das funcionalidades mais interessantes oferecidas pelo conversor ADC do


microcontrolador PIC18F4520 reside na possibilidade de selecção das tensões de referência do
conversor ADC, que foi uma das características anteriormente apresentadas.

Em condições normais, as entradas analógicas do microcontrolador PIC teriam de estar


compreendidas entre as gamas de tensão 𝐺𝑁𝐷; 𝑉𝐷𝐷 , isto é, tipicamente entre 0 e +5V, tal
implicando que o resultado da conversão seria referenciado entre estas tensões. Por outras
palavras, os 10 bits de resolução estariam compreendidos nesta gama de tensões.

Tutorial - Módulo ADC Página 15 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Figura 13 – Tensões de referência do módulo ADC do microcontrolador PIC18F45202

Ao oferecer a possibilidade de selecção de tensões de referência diferentes, o conversor ADC do


microcontrolador PIC fornece ao programador a possibilidade de, utilizando uma outra gama de
tensões mais adequadas ao sinal em medição, manter a mesma resolução de 10 bits de
resolução.

Tomemos em consideração uma dada entrada analógica cuja gama de tensões varia entre +1V e
+3V. Utilizando as tensões de referência do microcontrolador, então o LSB da conversão seria

5−0
𝐿𝑆𝐵 = 210
≅ 4.88𝑚𝑉, o que para a gama de variação do sinal analógico, equivale a uma
3 1
resolução de 4.88×10 −3 − 4.88×10 −3 ≅ 410 𝑝𝑎𝑠𝑠𝑜𝑠 = 8.68𝑏𝑖𝑡𝑠.

Contudo, utilizando as referências de tensão para referenciar a conversão para a gama de


3−1
variação possível da entrada analógica, então o LSB da conversão será 𝐿𝑆𝐵 = 210
≅ 1.95𝑚𝑉,

equivalendo a uma resolução efectiva de 1024 passos, ou seja, os 10 bits de resolução do


conversor.

As linhas de tensão de referência do conversor ADC estão mapeadas nas linhas de I/O
RA2/AN2/VREF- e RA3/AN3/VREF+, sendo que a linha 𝑉𝑅𝐸𝐹− corresponde ao limite inferior
(valor mínimo) e 𝑉𝑅𝐸𝐹+ corresponde ao limite superior (valor máximo) da gama de tensões a
referenciar para a conversão.

2
Imagem retirada de [Link]
Tutorial - Módulo ADC Página 16 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

A utilização destas linhas está contudo restrita às seguintes condições:

 𝑉𝑆𝑆 − 0.3𝑉 ≤ 𝑉𝑅𝐸𝐹− ≤ 𝑉𝐷𝐷 − 3.0𝑉


 𝑉𝑆𝑆 ≤ 𝑉𝑅𝐸𝐹+ ≤ 𝑉𝑅𝐸𝐹𝐻
 ∆𝑉𝑅𝐸𝐹 = 𝑉𝑅𝐸𝐹+ − 𝑉𝑅𝐸𝐹− ≥ 3.0𝑉

A configuração das referências de tensão na conversão do módulo ADC é feita através dos bits
VCFG1:VCFG0 do registo ADCON1, garantindo que as linhas AN2VREF- e AN3/VREF+ estão
devidamente configuradas como entradas analógicas por meio dos bits PCFG<3:0>, também
no registo ADCON1.

Após a conversão, o respectivo resultado será armazenado no par de registos ADRESH e


ADRESL. De forma a facilitar a manipulação e utilização deste resultado, o módulo ADC do
microcontrolador PIC fornece ainda a possibilidade de selecção do formato de apresentação do
resultado, através do bit ADFM do registo ADCON2, que assim pode ser:

 Resultado justificado à direita, ou seja, o bit menos significativo da conversão alinhado


com o bit menos significativo do registo ADRESL;
 Resultado justificado à esquerda, ou seja, o bit mais significativo da conversão alinhado
com o bit mais significativo do registo ADRESH;

A Figura 14 mostra a forma como o resultado é armazenado em função desta configuração.

Figura 14 – Formato de armazenamento do resultado da conversão A/D 3

3
Imagem retirada de [Link]
Tutorial - Módulo ADC Página 17 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Configuração e utilização do módulo ADC

Para configurar o módulo ADC, os seguintes passos devem ser realizados:

1. Configurar os pinos a utilizar como entradas analógicas, definindo a direcção de entrada nos
correspondentes tristate buffers;
2. Configurar as linhas de I/O como entradas analógicas, através do registo ADCON1;
3. Configurar quais as fontes das tensões de referência para o conversor ADC, se as tensões de
alimentação do microcontrolador, se as tensões nas linhas 𝑉𝑅𝐸𝐹+ e 𝑉𝑅𝐸𝐹−, através do registo
ADCON1;
4. Configurar o relógio de funcionamento do módulo ADC, através do registo ADCON2;
5. Configurar o tempo de aquisição no registo ADCON2;
6. Definir o formato de saída do resultado do ADC (justificado à direita ou à esquerda),
através do bit ADFM do registo ADCON2;
7. Habilitar o módulo ADC, através do bit ADON do registo ADCON0;

Após a configuração do módulo ADC, a conversão deve ser feita seguindo o seguinte
procedimento:

1. Seleccionar o canal ADC a adquirir, através do registo ADCON0;


2. Se o tempo de aquisição foi definido para 0 ciclos de 𝑇𝐴𝐷 , então o programador deverá
manualmente inserir um tempo de espera após a selecção do canal e o início da conversão,
para garantir que o circuito de sample & hold está preparado;
3. Dar a ordem de início de conversão, através do bit GO/*DONE do registo ADCON0;
4. Aguardar o fim da conversão, através da leitura do bit GO/*DONE ou da flag de
interrupção associada ao ADC ADIF. Se habilitar a flag ADIE então o fim de
conversão do ADC é assinalado através do despoletar de uma interrupção ao
processador;
5. Recolher o resultado da conversão através dos registos ADRESH e ADRESL;
6. Limpar a flag ADIF, para possibilitar reconhecimento de fim de conversão numa nova
conversão;

Tutorial - Módulo ADC Página 18 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

Configuração e utilização do módulo ADC (método


alternativo)

Paralelamente ao normal método de configuração e polling dos registos individuais do módulo


ADC existe um método alternativo para a sua configuração e utilização, que pode ser feito
através das bibliotecas do compilador C18 que fornecem uma API de alto nível que facilita ao
programador a tarefa de utilização do módulo ADC, sem necessidade de um conhecimento mais
aprofundado dos seus registos de configuração.

Esta biblioteca, que fica disponível ao programador através da inclusão do header file “adc.h”
providencia as seguintes funções:

Função Descrição
BusyADC Verifica se o conversor ADC está ocupado a realizar uma conversão.
CloseADC Desabilita o módulo ADC.
ConvertADC Dá a ordem para início de uma nova conversão no ADC.
OpenADC Configura e habilita o módulo ADC.
ReadADC Lê o resultado de uma conversão terminada do ADC.
SetChanADC Selecciona o canal ADC a utilizar.

Consulte a documentação das bibliotecas do compilador C18 para maior detalhe sobre como
utilizar as referidas funções.

Exemplo 1 – Configuração e utilização do módulo ADC para


aquisição de uma entrada analógica

O primeiro exemplo deste tutorial demonstra um possível modo de configuração e utilização do


módulo ADC do microcontrolador PIC18F4520 para fazer a aquisição de um sinal analógico,
calculando e apresentando o valor em tensão calculado para a entrada adquirida.

Tutorial - Módulo ADC Página 19 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

/**
* Departamento de Engenharia Electrotécnica - ESTG
* Microprocessadores
*
* Tutorial Módulo ADC - Exemplo 1
*
* - Configuração e aquisição de uma entrada analógica
*/

#include <p18f4520.h>
#include <stdio.h>
#include <adc.h>
#include <delays.h>

#include "xlcd.h"

/* relógio proveniente de um oscilador externo */


#pragma config OSC = EC
/* desactiva Watch Dog Timer */
#pragma config WDT = OFF

/** Comando para trocar para a linha 1 */


#define LINE1 0x80
/** Comando para trocar para a linha 2 */
#define LINE2 0xC0
/** Comando para limpar o LCD */
#define CLEAR 0x01

/**
* Calcula o valor de tensão na entrada analógica em função
* do resultado da respectiva conversão, e em função dos
* limites para a entrada.
*
* @param min Valor mínimo de tensão na conversão.
* @param max Valor máximo de tensão na conversão.
* @param read Resultado da conversão da entrada analógica.
*
* @return O valor da tensão na entrada analógica.
*/
static float scale(float min, float max, unsigned int read)
{
float res;

res = ((max - min) * (float)(read / 1024.0F)) + min;

return res;
}

/**
* Imprime o valor da tensão na entrada analógica
* no ecrã LCD.
*
* @param val Valor, em tensão, da entrada analógica.
*/
static void print_lcd(float val)
{
Tutorial - Módulo ADC Página 20 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

int unit;
int decimal;
char str[5];

/*
* a função 'sprintf' das bibliotecas do compilador C18
* não suporta a conversão de valores em vírgula flutuante, com
* os literais '%f' e/ou "%lf", logo temos de manualmente fazer
* essa conversão
*/
unit = (int)val;
decimal = (int)((float)(val - (float)unit) * 100.0F);

/* actualiza display LCD */


WriteCmdXLCD(LINE2 + 8);
while (BusyXLCD());
sprintf(str, "%01d.%02d", unit, decimal);
putsXLCD(str);
while (BusyXLCD());

return;
}

/**
* Ponto de entrada da aplicação.
*/
void main(void)
{
unsigned int read;
float volt;

/*
* inicialização dos portos de I/O
*/

/*
* linha RA0 como entrada analógica (CH0)
* restantes linhas não usadas
*/
TRISA = 0xFF;
/* porto B não usado */
TRISB = 0xFF;
/* porto C não usado */
TRISC = 0xFF;
/* porto D utilizado para o LCD */
TRISD = 0;
/* porto E não usado */
TRISE = 0x07;

/*
* inicialização do LCD
*/
OpenXLCD(FOUR_BIT & LINES_5X7);
while (BusyXLCD());
WriteCmdXLCD(DON & CURSOR_OFF & BLINK_OFF);
Tutorial - Módulo ADC Página 21 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

while (BusyXLCD());
WriteCmdXLCD(SHIFT_CUR_RIGHT);
while (BusyXLCD());
/* limpa LCD */
WriteCmdXLCD(CLEAR);
while (BusyXLCD());

/*
* configuração do módulo ADC
*
* - relógio de conversão configurado para Fosc/4 -> TAD = 1us
* - resultado da conversão justificado à direita
* - tempo de aquisição (sample & hold) de 4 ciclos do relógio
* de conversão TACQ = 4us
*
* - selecção inicial do canal 0 (AN0/CH0)
* - desactivação da interrupção de fim de conversão ADIF
* - VREF+ a VDD (+5V) e VREF- a GND (0V)
*
* - Port Cfg Bits = 0x0E (CH0 analógica, restantes digitais)
*/
OpenADC(ADC_FOSC_4 & ADC_RIGHT_JUST & ADC_4_TAD,
ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS,
0x0E);

/* escreve linha 1 */
WriteCmdXLCD(LINE1);
while (BusyXLCD());
putrsXLCD("Conversao A/D CH0");
while (BusyXLCD());

/* escreve linha 2 */
WriteCmdXLCD(LINE2);
while (BusyXLCD());
putrsXLCD("Valor = -.--[V]");
while (BusyXLCD());

/*
* ciclo infinito
*/
while (1) {
/*
* não é necessário fazer a selecção de canal, dado que
* só estamos a adquirir uma entrada analógica,
* previamente seleccionada na chamada a OpenADC.
* Assim sendo, é só necessário dar a ordem de
* início de conversão
*/
ConvertADC();
/* aguarda fim da conversão */
while (BusyADC());
/* faz a leitura do resultado da conversão */
read = ReadADC();
/*
* limpa a flag de interrupção manualmente,
* para futuras chamadas a BusyADC
Tutorial - Módulo ADC Página 22 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

*/
[Link] = 0;

/* converte o valor da conversão em tensão */


volt = scale(0.0F, 5.0F, read);

/* actualiza display LCD */


print_lcd(volt);

/* aguarda 500 ms */
Delay10KTCYx(50);
}

Exemplo 2 – Configuração e utilização do módulo ADC para


aquisição de diversas entradas analógicas

Este exemplo demonstra um possível modo de configuração e utilização do módulo ADC do


microcontrolador PIC18F4520 para fazer a aquisição de dois sinais analógicos, fazendo a
selecção, aquisição e conversão dos mesmos, apresentando qual o valor em tensão calculado
para cada uma das entradas analógicas lidas.

/**
* Departamento de Engenharia Electrotécnica - ESTG
* Microprocessadores
*
* Tutorial Módulo ADC - Exemplo 2
*
* - Configuração e aquisição de várias entradas analógicas,
* fazendo a selecção e conversão alternada das mesmas
*/

#include <p18f4520.h>
#include <stdio.h>
#include <adc.h>
#include <delays.h>

#include "xlcd.h"

/* relógio proveniente de um oscilador externo */


#pragma config OSC = EC
/* desactiva Watch Dog Timer */
#pragma config WDT = OFF
Tutorial - Módulo ADC Página 23 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

/** Comando para trocar para a linha 1 */


#define LINE1 0x80
/** Comando para trocar para a linha 2 */
#define LINE2 0xC0
/** Comando para limpar o LCD */
#define CLEAR 0x01

/**
* Calcula o valor de tensão na entrada analógica em função
* do resultado da respectiva conversão, e em função dos
* limites para a entrada.
*
* @param min Valor mínimo de tensão na conversão.
* @param max Valor máximo de tensão na conversão.
* @param read Resultado da conversão da entrada analógica.
*
* @return O valor da tensão na entrada analógica.
*/
static float scale(float min, float max, unsigned int read)
{
float res;

res = ((max - min) * (float)(read / 1024.0F)) + min;

return res;
}

/**
* Imprime o valor da tensão na entrada analógica
* no ecrã LCD.
*
* @param val1 Valor, em tensão, da entrada analógica do canal CH0.
* @param val2 Valor, em tensão, da entrada analógica do canal CH1.
*/
static void print_lcd(float val1, float val2)
{
int unit;
int decimal;
char str_ch0[5];
char str_ch1[5];

/*
* a função 'sprintf' das bibliotecas do compilador C18
* não suporta a conversão de valores em vírgula flutuante, com
* os literais '%f' e/ou "%lf", logo temos de manualmente fazer
* essa conversão
*/
unit = (int)val1;
decimal = (int)((float)(val1 - (float)unit) * 100.0F);
sprintf(str_ch0, "%01d.%02d", unit, decimal);

unit = (int)val2;
decimal = (int)((float)(val2 - (float)unit) * 100.0F);
sprintf(str_ch1, "%01d.%02d", unit, decimal);

Tutorial - Módulo ADC Página 24 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

/* actualiza display LCD */


WriteCmdXLCD(LINE1 + 12);
while (BusyXLCD());
putsXLCD(str_ch0);
while (BusyXLCD());
WriteCmdXLCD(LINE2 + 12);
while (BusyXLCD());
putsXLCD(str_ch1);
while (BusyXLCD());

return;
}

/**
* Ponto de entrada da aplicação.
*/
void main(void)
{
unsigned int read_ch0;
unsigned int read_ch1;
float volt_ch0;
float volt_ch1;

/*
* inicialização dos portos de I/O
*/

/*
* linha RA0 como entrada analógica (CH0),
* linha RA1 como entrada analógica (CH1),
* restantes linhas não usadas
*/
TRISA = 0xFF;
/* porto B não usado */
TRISB = 0xFF;
/* porto C não usado */
TRISC = 0xFF;
/* porto D utilizado para o LCD */
TRISD = 0;
/* porto E não usado */
TRISE = 0x07;

/*
* inicialização do LCD
*/
OpenXLCD(FOUR_BIT & LINES_5X7);
while (BusyXLCD());
WriteCmdXLCD(DON & CURSOR_OFF & BLINK_OFF);
while (BusyXLCD());
WriteCmdXLCD(SHIFT_CUR_RIGHT);
while (BusyXLCD());
/* limpa LCD */
WriteCmdXLCD(CLEAR);
while (BusyXLCD());
Tutorial - Módulo ADC Página 25 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

/*
* configuração do módulo ADC
*
* - relógio de conversão configurado para Fosc/4 -> TAD = 1us
* - resultado da conversão justificado à direita
* - tempo de aquisição (sample & hold) de 4 ciclos do relógio
* de conversão TACQ = 4us
*
* - selecção inicial do canal 0 (AN0/CH0)
* - desactivação da interrupção de fim de conversão ADIF
* - VREF+ a VDD (+5V) e VREF- a GND (0V)
*
* - Port Cfg Bits = 0x0D (CH0 analógica, CH1 analógica,
* restantes digitais)
*/
OpenADC(ADC_FOSC_4 & ADC_RIGHT_JUST & ADC_4_TAD,
ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS,
0x0D);

/* escreve linha 1 */
WriteCmdXLCD(LINE1);
while (BusyXLCD());
putrsXLCD("Valor CH0 = -.--[V]");
while (BusyXLCD());

/* escreve linha 2 */
WriteCmdXLCD(LINE2);
while (BusyXLCD());
putrsXLCD("Valor CH1 = -.--[V]");
while (BusyXLCD());

/*
* ciclo infinito
*/
while (1) {
/* selecciona o canal CH0 */
SetChanADC(ADC_CH0);
/*
* não é necessário aguardar para a entrada estabilizar,
* dado que já foi definido um tempo de aquisição
* (Tacq) de 4Tad...
*/
/* inicia conversão */
ConvertADC();
/* aguarda fim da conversão */
while (BusyADC());
/* faz a leitura do resultado da conversão */
read_ch0 = ReadADC();
/*
* limpa a flag de interrupção manualmente,
* para futuras chamadas a BusyADC
*/
[Link] = 0;

/* converte o valor da conversão em tensão */

Tutorial - Módulo ADC Página 26 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

volt_ch0 = scale(0.0F, 5.0F, read_ch0);

/* selecciona o canal CH1 */


SetChanADC(ADC_CH1);
/*
* não é necessário aguardar para a entrada estabilizar,
* dado que já foi definido um tempo de aquisição
* (Tacq) de 4Tad...
*/
/* inicia conversão */
ConvertADC();
/* aguarda fim da conversão */
while (BusyADC());
/* faz a leitura do resultado da conversão */
read_ch1 = ReadADC();
/*
* limpa a flag de interrupção manualmente
* para futuras chamadas a BusyADC
*/
[Link] = 0;

/* converte o valor da conversão em tensão */


volt_ch1 = scale(0.0F, 5.0F, read_ch1);

/* actualiza display LCD */


print_lcd(volt_ch0, volt_ch1);

/* aguarda 500 ms */
Delay10KTCYx(50);
}

Exemplo 3 – Configuração e utilização do módulo ADC para


aquisição de uma entrada analógica, utilizando as linhas
AN2/VREF- e AN3/VREF+ para definir as referências de
tensão na conversão

O último exemplo apresentado neste documento tutorial mostra o modo de configuração e


utilização do módulo ADC do microcontrolador PIC18F4520 para fazer a aquisição de um sinal
analógico, mas utilizando as linhas AN2/VREF- e AN3/VREF+ para definir quais as tensões de
referência para o conversor A/D, calculando e apresentando o valor em tensão calculado para a
entrada adquirida, em função das tensões de referência e do resultado da conversão obtido.
Tutorial - Módulo ADC Página 27 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

/**
* Departamento de Engenharia Electrotécnica - ESTG
* Microprocessadores
*
* Tutorial Módulo ADC - Exemplo 3
*
* - Aquisição de uma entrada analógica, configurando as linhas
* AN2/VREF- e AN3/VREF+ como tensões de referência para a
* entrada analógica
*/

#include <p18f4520.h>
#include <stdio.h>
#include <adc.h>
#include <delays.h>

#include "xlcd.h"

/* relógio proveniente de um oscilador externo */


#pragma config OSC = EC
/* desactiva Watch Dog Timer */
#pragma config WDT = OFF

/** Comando para trocar para a linha 1 */


#define LINE1 0x80
/** Comando para trocar para a linha 2 */
#define LINE2 0xC0
/** Comando para limpar o LCD */
#define CLEAR 0x01

/**
* Calcula o valor de tensão na entrada analógica em função
* do resultado da respectiva conversão, e em função dos
* limites para a entrada.
*
* @param min Valor mínimo de tensão na conversão.
* @param max Valor máximo de tensão na conversão.
* @param read Resultado da conversão da entrada analógica.
*
* @return O valor da tensão na entrada analógica.
*/
static float scale(float min, float max, unsigned int read)
{
float res;

res = ((max - min) * (float)(read / 1024.0F)) + min;

return res;
}

/**
* Imprime o valor da tensão na entrada analógica
* no ecrã LCD.

Tutorial - Módulo ADC Página 28 de 31


Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

*
* @param val Valor, em tensão, da entrada analógica.
*/
static void print_lcd(float val)
{
int unit;
int decimal;
char str[5];

/*
* a função 'sprintf' das bibliotecas do compilador C18
* não suporta a conversão de valores em vírgula flutuante, com
* os literais '%f' e/ou "%lf", logo temos de manualmente fazer
* essa conversão
*/
unit = (int)val;
decimal = (int)((float)(val - (float)unit) * 100.0F);

/* actualiza display LCD */


WriteCmdXLCD(LINE2 + 8);
while (BusyXLCD());
sprintf(str, "%01d.%02d", unit, decimal);
putsXLCD(str);
while (BusyXLCD());

return;
}

/**
* Ponto de entrada da aplicação.
*/
void main(void)
{
unsigned int read;
float volt;

/*
* inicialização dos portos de I/O
*/

/*
* linha RA0 como entrada analógica (CH0),
* linha RA2 como tensão de referência negativa (VREF-),
* linha RA3 como tensão de referência positiva (VREF+),
* restantes linhas não usadas
*/
TRISA = 0xFF;
/* porto B não usado */
TRISB = 0xFF;
/* porto C não usado */
TRISC = 0xFF;
/* porto D utilizado para o LCD */
TRISD = 0;
/* porto E não usado */
TRISE = 0x07;
Tutorial - Módulo ADC Página 29 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

/*
* inicialização do LCD
*/
OpenXLCD(FOUR_BIT & LINES_5X7);
while (BusyXLCD());
WriteCmdXLCD(DON & CURSOR_OFF & BLINK_OFF);
while (BusyXLCD());
WriteCmdXLCD(SHIFT_CUR_RIGHT);
while (BusyXLCD());
/* limpa LCD */
WriteCmdXLCD(CLEAR);
while (BusyXLCD());

/*
* configuração do módulo ADC
*
* - relógio de conversão configurado para Fosc/4
* - resultado da conversão justificado à direita
* - tempo de aquisição (sample & hold) de 4 ciclos
* do relógio de conversão
*
* - selecção inicial do canal 0 (AN0/CH0)
* - desactivação da interrupção de fim de conversão ADIF
* - AN2 como VREF-, AN3 como VREF+
*
* - Port Cfg Bits = 0x0B (CH0, CH1, CH2 e CH3 analógicas,
* restantes digitais)
*/
OpenADC(ADC_FOSC_4 & ADC_RIGHT_JUST & ADC_4_TAD,
ADC_CH0 & ADC_INT_OFF & ADC_REF_VREFPLUS_VREFMINUS,
0x0B);

/* escreve linha 1 */
WriteCmdXLCD(LINE1);
while (BusyXLCD());
putrsXLCD("Conversao A/D CH0");
while (BusyXLCD());

/* escreve linha 2 */
WriteCmdXLCD(LINE2);
while (BusyXLCD());
putrsXLCD("Valor = -.--[V]");
while (BusyXLCD());

/*
* ciclo infinito
*/
while (1) {
/*
* não é necessário fazer a selecção de canal, dado que
* só estamos a adquirir uma entrada analógica,
* préviamente seleccionada na chamada a OpenADC.
* Assim sendo, é só necessário dar a ordem de início
* de conversão
*/
Tutorial - Módulo ADC Página 30 de 31
Departamento de Engenharia Electrotécnica
Microprocessadores 2009/2010

ConvertADC();
/* aguarda fim da conversão */
while (BusyADC());
/* faz a leitura do resultado da conversão */
read = ReadADC();
/*
* limpa a flag de interrupção manualmente,
* para futuras chamadas a BusyADC
*/
[Link] = 0;

/*
* converte o valor da conversão em tensão
* dado que usamos AN2 e AN3 para VREF- e VREF+, os
* limites de tensão são então definidos pelas tensões
* nessas linhas, que são respectivamente 1V e 4V.
*/
volt = scale(1.0F, 4.0F, read);

/* actualiza display LCD */


print_lcd(volt);

/* aguarda 500 ms */
Delay10KTCYx(50);
}

Tutorial - Módulo ADC Página 31 de 31

Você também pode gostar