Você está na página 1de 13

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Conversor A/D do PIC

1.0 Introduo

Introduo
O PIC18F452 possui internamente 8 canais de A/D com resoluo de 10 bits cada.
Comu m conversor A/D com resoluo de 10 bits e tenso de referncia de 5V,
podemos obter um valor de 4,8876.. mV, pois 5V/ (2E10 - 1) = 4,8876... mV.
Os conversores A/D dos PICs utilizam uma tcnica de aproximao sucessivas,
normalmente com resoluo de 10 bits, com clock selecionvel pelo usurio e mltiplas
entradas multiplexadas.

Canais AD multiplexados
Os conversores A/D do nosso microcontrolador esto ligados nos pinos RA0 (AN0),
RA1 (AN1), RA2 (AN2), RA3 (AN3), RA5 (AN4), RE0 (AN5), RE1 (AN6), RE7
(AN7). Os registradores que participam da configurao do conversor A/D so:
ADCON0 e ADCON1.
Nosso A/D possui resoluo de 10 bits (8 + 2 bits), onde os valores das converses so
armazenados nos registradores ADRESH e ADRESL.

Registrador ADCON0:
vejamos o funcionamento de cada bit desse registrador:

ADCON0:
ADCS1
Bit7

ADCS0

CHS2

CHS1

CHS0

GO/DONE

Bit6

Bit5

Bit4

Bit3

Bit2

----- ADON
Bit1

Bit0

ADCS1 , ADCS2: Bits de seleo de velocidade de converso A/D

tabela 1.0
CHS2, CHS0: Bit de seleo de canal A/D

GO/DONE: Bit de status da converso A/D


0 - Converso A/D no est sendo realizada
1 - Converso A/D est sendo realizada

ADON: Liga ou desliga o A/D


0 - Conversor A/D desligado
1 - Conversor A/D ligado
Antes de configurarmos os registradores ADCS2, ADCS1 e ADCS0,
devemos levar em considerao a frequncia do cristal que estamos utilizando, pois
nosso conversor necessita de 1,6us para fazer a converso.
A tabela seguinte apresenta os valores de configurao dos registradores
ADCS2, ADCS1 e ADCS0 para as faixas de frquencia do cristal utilizado.

Registrador ADCON1:

vejamos o funcionamento de cada bit desse registrador:

ADCON1:
ADFM
Bit7

ADCS2

------

-----

PCFG3

PCFG2

PCFG1

PCFG0

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

ADFM : Ajusta o formato do resultado da converso A/D


0 - Justifica a direita
1 - Justifica a esquerda
ADCS2 : Bit de seleo da velocidade de converso

*consulte a tabela 1.0


PCFG3, PCFG2, PCFG1, PCFG0: bits configurao do A/D

tabela 2.0
O bit de ADFM tem a funo de organizar o resultado da converso A/D, de forma que
o os valores convertidos sejam justificados a direita ou a esquerda nos registradores
ADRESH e ADRESL. Caso venhamos configurar ADFM = 1, organizamos o valor da
converso a direita, ou seja, os oitos bits menos significativo ser armazendo em
ADRESL, e os 2 bits mais significativo sero armazenados em ADRESH.

Caso ADFM = 0, justificaremos a esquerda os valores de converso, desta forma os


oitos bits mais significativos ficaro em ADRESH e os 2 menos significativo ficar em
ADRESL.
Atravs dos bits PCFG3, PCFG2, PCFG1, PCFG0 informamos quais os pinos que
sero A/D ou I/O digital.
Exemplo (consulte tabela 2.0):
ADCON1 = 0 ; //programamos todos os pinos RA0, RA1 , RA2 , RA3, RA5, RE0, RE1,
RE2 como A/D
ADCON1 = 6 ; //programamos todos os pinos RA0, RA1 , RA2 , RA3, RA5, RE0, RE1,
RE2 como I/O de uso geral
ADCON1 = 14 ; //programamos os pinos RA1 , RA2 , RA3, RA5, RE0, RE1, RE2
como I/O de uso geral e somente RA0 como AD (referncia VDD).
ADCON1 = 4 ; //programamos os pinos RA2 , RA5, RE0, RE1, RE2 como I/O de uso
geral e RA0, RA1 e RA3 como AD (referncia VDD).
Nosso mdulo possui um conversor com resoluo mxima de 10 bits, ou seja, 1024
divises (0 a 1023 divises). Podemos configurar e determinar tenses de referncia
externa para nosso conversor A/D atravs dos pinos AN3 e AN2, ou selecionar a tenso
interna do chip (vcc e gnd) como referncia.
Frmula de converso analgico para digital:
Rad = ( Vin - Vref-) * 1023 / (Vref+ - Vref-)
onde:
Rad = Resultado da converso
Vref+ e Vref- = valor de tenso de referncia mxima e mnima
Vin = Tenso de entrada no pino A/D
obs: 1023 o valor mximo de converso do A/D, lembrando que o valor de 0 a 1023.
Analize o esquema eltrnico seguinte:

figura 01
Analizando o esquema eletrnico apresentado, vamos encontrar o valor analgico
convertido para digital:
Digamos que o valor da tenso Vin no momento de leitura do AN0 seja de 2V.
Nossa Frmula:
Rad = ( Vin - Vref-) * 1023 / (Vref+ - Vref-)
logo:
Rad = (2 - 1) *1023 / (3 - 1)
Rad = 1 * 1023 / 2
Rad = 511
OBS: A TENSO DE VREF EXTERNA NUNCA PODER ULTRAPASSAR A
TENSO DE ALIMENTAO DO MICROCONTROLADOR.

Trabalhando com o MikroC


No mikroC utilizamos os seguinte funo para leitura do conversor A/D do PIC:

sintaxe:
Adc_Read(canal_ AD);
onde:
Canal_AD: canal do conversor AD do PIC que desejamos ler. O nmero do canal AD
depende do tipo de PIC usado.
Exemplo:
int leitura_ad;
leitura_ad = Adc_Read(0);
varivel temp_res

//le canal ad0 do PIC e salva valor na

A funo adc_read salva o valor da converso AD (canal 0 - pino RA0) na varivel


leitura_ad.
Lembre-se que o valor da resoluo do AD do PIC18F452 de 10 bits, e por esse
motivo devemos utilizar uma varivel do tipo inteiro para armazenar o valor do A/D.
Estudo do registrador ADCON1:
O registrador ADCON1 responsvel por configurar o modo de trabalho dos pinos com
A/D. Atravs dos bits PCFG3, PCFG2, PCFG1, PCFG0 configuramos o pino como
A/D ou como I/O de uso geral.

Exemplo de programa:
Acompanhe o exemplo simples onde utilizamos um potenciometro a entrada RA0 e um
display LCD 16x2 para visualizarmos o valor da converso do AD.

Exemplo de programa:
/*********************************************************************
*******
Centro de Tecnologia Microgenios
Programa: Diplay_7_seg_01
Placa: KIT PICGENIOS
Objetivo: este programa tem por funo ler o canal AD0 e escrever no
lcd
o valor de converso
**********************************************************************
*********
*/
char texto[16];
int temp_res = 0;
void main() {
trisd = 0;
//define portd como saida
trise = 0;
//define porte como saida
trisa.f0 = 1;
//define pinos RA0 como entrada
ADCON1 = 0B00001110;
//configura pino RA0 como entrada analgica
e os demais com I/O digital
Lcd8_Config(&PORTE,&PORTD,2,1,4,7,6,5,4,3,2,1,0); //inicializa lcd
Lcd8_Cmd(Lcd_Clear);
//apaga lcd
Lcd8_Cmd(LCD_CURSOR_OFF);
//desliga cursor do lcd

Lcd8_Out(1, 1, "Canal AN0: ");


//escreve mansagem na linha 1,
coluna 1 do lcd
Delay_ms (10);
//delay 10 milisegundos
do
{
temp_res = Adc_Read(0);
//le canal ad0 do PIC e salva valor na
varivel temp_res
Delay_10us;
//delay de 10 microsegundos
wordToStr(temp_res, texto);
//converte valor da converso do
ad0 para string
lcd8_out(1,11,texto);
//escreve no lcd o valor da converso do
ad0
}while (1);
}

Detalhes do programa:
Primeiramente definimos as variveis globais do programa
char texto[16];
int temp_res = 0;

Depois iniciamos a funo main() e definimos o sentido dos ports que participam do
controle do LCD: Repare que programamos o registrador ADCON1 com o valor 2, pois
o porte do PIC utilizado como I/O para controlar o LCD.
trisd = 0;
//define portd como saida
trise = 0;
//define porte como saida
trisa.f0 = 1;
//define pinos RA0 como entrada
ADCON1 = 0B00001110;
//configura pino RA0 como entrada analgica
e os demais com I/O digital

Os comandos seguintes so utilizados para controle e escrita do display LCD.


Lcd8_Config(&PORTE,&PORTD,2,1,4,7,6,5,4,3,2,1,0); //inicializa lcd
Lcd8_Cmd(Lcd_Clear);
//apaga lcd
Lcd8_Cmd(LCD_CURSOR_OFF);
//desliga cursor do lcd
Lcd8_Out(1, 1, "Canal AN0: ");
//escreve mansagem na linha 1,
coluna 1 do lcd
Delay_ms (10);
//delay 10 milisegundos

O comando seguinte l o canal AN0 do PIC e salva o valor na varivel temp_res.

temp_res = Adc_Read(0);
varivel temp_res

//le canal ad0 do PIC e salva valor na

A funo abaixo tem pertence ao compilador mikroC e tem por objetivo converter o
valor de uma varivel numrica do tipo word em string. Esta converso necessria
pois iremos escrever o valor numrico da varivel temp_res, resultado da converso
AN0, e escrever no LCD. A varivel que assimilar o valor convertido em string
chamada de "texto".
wordToStr(temp_res, texto);
para string

//converte valor da converso do ad0

Em seguida enviamos para o LCD o valor da varivel texto.


lcd8_out(1,11,texto);

//escreve no lcd o valor da converso do ad0

Projeto: Leitura do sensor de Temperatura LM35


Para solidificarmos a teoria de leitura do A/D do PIC, vamos efetuar a leitura de sensor
de temperatura LM35 conectado ao canal AN1 e de um trimpot conectado ao canal AN0
do PIC. O valor da converso dever ser escrito no LCD:
Esquema eltrico:

Programa:
/*********************************************************************
*******
Centro de Tecnologia Microgenios
Programa: Diplay_7_seg_01
Placa: KIT PICGENIOS
Objetivo: este programa tem por funo ler o canal AD0 e AD1 e
escrever no lcd
o valor de converso
**********************************************************************
*********
*/
char texto[16];
int leitura_an0 = 0;
int leitura_an1 = 0;
void main() {
trise = 0;
//define portb como saida
trisd = 0;
//define portd como saida
ADCON1 = 0b00000100;
//habilita canal A/D 0 e A/D1 do
PIC
trisa = 0b00001111;
//define pinos como entrada
Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1); //inicializa lcd
Lcd8_Cmd(Lcd_Clear);
//apaga lcd
Lcd8_Cmd(LCD_CURSOR_OFF);
//desliga cursor do lcd

Lcd8_Out(1, 1, "Canal AN0: ");


coluna 1 do lcd
delay_ms (10);
Lcd8_Out(2, 1, "Canal AN1: ");
coluna 1 do lcd
delay_ms (10);

//escreve mansagem na linha 1,


//delay de 10ms
//escreve mensagem na linha 2,
//delay 10 milisegundos

do
{
leitura_an0 = Adc_Read(0);
//le canal ad0 do PIC e salva
valor na varivel leitura_an0
wordToStr(leitura_an0, texto);
//converte valor da converso do
ad0 para string
lcd8_out(1,11,texto);
//escreve no lcd o valor da
converso do ad0
leitura_an1 = Adc_read(1);
//l canal ad1 do PIC e salva
valor na varivel leitura_an1
leitura_an1 = leitura_an1 / 2.048; //ajusta a escala de converso
do sensor de temperatura
wordToStr(leitura_an1, texto); //converte valor da converso do
ad1 para string
lcd8_out(2,11,texto);
//escreve no lcd o valor da
converso do ad1
}while (1);
}

O o sensor de temperatura utilizado em nosso projeto o LM35 fabricado pela empresa


National Semicondutores. Este circuito integrado um sensor de temperatura linear cujo
valor de saida de tenso diretamente proporcional temperatura. Sua escala j
calibrada em graus celsius com saida de 10mV / C no ranger minim de - 55 C a +150
C.
A resoluo do A/D de nosso microcontrolador de 10 bits e em nosso programa
utilizamos a tenso de referencia interna do A/D (5V).

Calculo para leitura correta do sensor de temperatura:


Resoluo do PIC:
Tenso de referencia (resoluo do AD - 1) = resoluo
5V (1024 - 1) = 4,8876 mV
A resoluo do A/D do PIC para tenso de referencia de 5V de 4,8876mV
Resoluo do sensor LM35:
10mV/C (dado fornecido pelo fabricante)

Logo teremos
10 / 4,8876 = 2,048
Em nosso programa arrendondamos o valor 2.046 para 2 para que nosso programa no
ultrapasse o valor limite demo do compilador (2Kbyte).
leitura_an1 = adc_read(1);
//l canal ad1 do PIC e salva valor
na varivel leitura_an1
leitura_an1 = leitura_an1 / 2.048; //ajusta a escala de leitura do
sensor lm35.

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao


em C
Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou
integral desse material sem prvio aviso. Maiores informaes:
suporte@microgenios.com.br

Você também pode gostar