umento
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
tabela 1.0
CHS2, CHS0: Bit de seleo de canal A/D
Registrador ADCON1:
ADCON1:
ADFM
Bit7
ADCS2
------
-----
PCFG3
PCFG2
PCFG1
PCFG0
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
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.
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.
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
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
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
temp_res = Adc_Read(0);
varivel temp_res
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
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
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);
}
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.