Você está na página 1de 20

Módulo ADC

- Conversor de 10 bits por aproximação sucessiva;


- 14 entradas analógicas;
- Tensões de referência interna ou externa.

Modo ADC e registradores:


- ADRESH – byte alto do resultado da conversão
- ADRESL – byte baixo do resultado da conversão
- ADCON0 – registrador de controle 0;
- ADCON1 – registrador de controle 1.
ADC: Esquema interno
Registradores de conversão
O resultado da conversão é armazenado em dois registradores, podendo ser
justificado a direita ou a esquerda. O bit ADFM determina o formato do resultado da
conversão.
Requisitos da conversão
- Para funcionar corretamente, é necessário um certo delay entre a escolha de um
canal e o início da conversão. Esse tempo é chamado tempo de aquisição e
depende da impedância da fonte.
- Existe uma equação para calcular o tempo de aquisição, mas no pior caso, esse
tempo é 20us.

- O tempo para o ADC completar a conversão de 1 bit é definido como TAD.


- O TAD deve ser no mínimo 1,6us.
- A conversão dos 10 bits leva 11 períodos TAD.
Clock do ADC
A configuração do clock do ADC é feita com os bits ADCS1 e ADCS0
Referência de tensão
Registrador ADCON0

ADCS1, ADCS0 – Bits de seleção de clock de conversão do A/D


Registrador ADCON0
CHS3-CHS0 – Bits de seleção do canal analógico
Registrador ADCON0
GO/DONE – Bit de Status da conversão do A/D
1 – a conversão A/D está em progresso
0 – a conversão A/D está completa. Esse bit é limpo automaticamente pelo hardware
quando a conversão A/D é completa.

ADON – Bit de habilitação do A/D


1 – conversão A/D está habilitada;
0 – conversão A/D está desabilitada.
Registrador ADCON1
Registrador ADCON1

ADFM – bit de seleção de formato do resultado do A/D

1 – resltado da conversão justificado a direita.


0 – resultado da conversão justificado a esquerda.

VCFG1 – bit de seleção de tensão da referencia negativa do conversor A/D

1 – referência negativa é aplicada no pino Vref- ;


0 – Vss é usado como referência negativa.

VCFG0 – bit de seleção de referência positiva do conversor A/D

1 – referência positiva é aplicada ao pino Vref+ ;


0 – Vdd é usado como referência positiva.
Resumindo
Passo 1 – Configuração da porta:

Escreva nível lógico um (1) no bit correspondente do registrador TRIS para configurar como
entrada;
Escreva nível lógico um (1) no correpondente bit do registrador ANSEL para configurar como
entrada analógica.
Passo 2 – Configurando o módulo ADC

Configura a refenrência de tensão no registrador ADCON1 ;


Selecione o clock de conversão do ADC no registrador ADCON0;
Selecione um dos canais de entrada CH0-CH13 no registrador ADCON0;
Selecione o formato do dado com o bit ADFM do registrador ADCON1;
Habilite o conversor A/D setando o bit ADON do registrador ADCON0.

Step 3 – Configurando interrupção do ADC (opcional):

Limpe a flag ADIF;


Sete os bits ADIE, PEIE e GIE.
Step 4 – Aguarde o requerido tempo de aquisição (aproximadamente 20uS) passar.

Step 5 – Inicie a conversão setando o bit GO/DONE do registrador ADCON0.

Step 6 – Aguarde a conversão terminar ADC.

Se necessário, check em um loop se o bit GO/DONE foi limpo ou aguarde uma conversão ou
aguarde uma interrupção do A/D (deve ser configurado previamente).

Step 7 – Leia o resultado do ADC:

Leia os registradores ADRESH e ADRESL.


Exemplo
Ex1: Exibir no display LCD o valor de tensão presente no pino RA2.
// conexões do módulo LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// fim das conexões do módulo LCD
unsigned char ch; //
unsigned int adc_rd; // declaração de variáveis
char *text; //
long tlong; //
void main() {
INTCON = 0; // todas interrupções desabilitadas
ANSEL = 0x04; // pino RA2 é configurado como entrada analógica
TRISA = 0x04;
ANSELH = 0; // restante dos pinos configurados como digital
Lcd_Init(); // inicialização do display LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // LCD command (cursor off)
Lcd_Cmd(_LCD_CLEAR); // LCD command (clear LCD)
text = "Aula 13 - ADC"; // define a primeira mensagem
Lcd_Out(1,1,text); // escreve a primeira mensagem na primeira linha
text = "Exemplo LCD"; // define a segunda mensagem
Lcd_Out(2,1,text); // escreve segunda mensagem
ADCON1 = 0x82; // referencia de tensão do A/D é VCC
Delay_ms(2000);
text = "tensao:"; // define terceira mensagem
While (1) { // loop infinito
adc_rd = ADC_Read(2); // conversão A/D . pino RA2.
Lcd_Out(2,1,text); // escreve o resultado na segunda linha
tlong = (long)adc_rd * 5000; // converte o resultado em milivolts
tlong = tlong / 1023; // 0..1023 -> 0-5000mV
ch = tlong / 1000; // extrai volts do resultado
Lcd_Chr(2,9,48+ch); // escreve o resultado em formato ASCII
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10; //
Lcd_Chr_CP(48+ch); //
ch = (tlong / 10) % 10; //
Lcd_Chr_CP(48+ch); //
ch = tlong % 10; //
Lcd_Chr_CP(48+ch); //
Lcd_Chr_CP('V');
Delay_ms(1);
}
}
Tabela ASCII
Exemplos
Ex1:Desenvolver um firmware em C para fazer a leitura de temperatura utilizando o CI
LM35 e exibir o valor da temperatura em graus Celsius em um display LCD.
Exemplos
Ex2: Escreva um firmware para exibir o valor de resistência de um sensor de
luminosidade LDR.