Вы находитесь на странице: 1из 16

Conversor A/D 16f877a

Informaes do datasheet do conversor A/D do PIC 16f877a


O modulo A/D possui 4 registradores
A/D Result High Register (ADRESH) // armazena os bits mais significativos
A/D Result Low Register (ADRESL) // armazena os bits menos significativos
A/D Control Register 0 (ADCON0) // registradores de configurao
A/D Control Register 1 (ADCON1)
Conversor A/D 16f877a

Os bits 7 e 6 do ADCON0 em conjunto com um pino do ADCON1 so utlizados para


determinar o clock de converso, e isso depende do clock do chip.

Para uma converso correta o tempo mnimo de converso dever ser de 1,6s (TAD)
Conversor A/D 16f877a

Para uma clock de 8MHz por exemplo:


Fosc/4 = 8/4 aproximadamente 2MHz
Ou escolha de 4 TOSC 100 ADCON1 1 E ADON0 00
Conversor A/D 16f877a

O bit de 5 a 3 escolhem qual das entradas analgicas ser utilizada na leitura e converso
O PIC 16f877a possui 8 canais AD, nos pinos RA0,1,2,3,5 RE0,1 e 2

O bit 2 determina o incio da converso e determina quando a converso acabou.

Enquanto GO_NOT_DONE == 1 converso em processo.


Conversor A/D 16f877a

Bit 1 no utilizado (zero)

Bit 0 liga o conversor para o processo de converso

Exemplo de configurao do ADON0


ADCON0=0b00000000;
ADCS1 e 2 - FOSC/4 00; CHS2-0 RA0 000
GO_NOT_DONE A/D desativado 0
ADON A/D desligado 0
Conversor A/D 16f877a

Bit 7 determina o formato de escrita nos registradores ADRESH e ADRESL

Bit 6 ADCS2 o bit mais significativo da escolha do clock.


Bit 5 e 4 no so utilizados (zeros)
Os bits de 3 a 0 determinam como os pinos analgico pode ser utilizados.
Conversor A/D 16f877a
Conversor A/D 16f877a
Conversor A/D 16f877a

Exemplo de configurao do registrador ADCON1

ADCON1 = 0b11001110
ADFM em 1 Right Justifed ADCS2 em 1 (fosc/4 = 100) PCFG3 em 1110
somente RA0 em A/D
Conversor A/D 16f877a
Passos para converso A/D:
1 - Configurao dos registradores ADCON0 E ADCON1.
2 Ligar o mdulo A/D atravs do bit ADON(bit 0) do ADCON0.
3 Esperar pelo tempo de aquisio do valor a ser convertido (1,6s)

4 Inicializar a converso atravs do bit DO_NOT_DONE


5 Esperar pela finalizao da converso DO_NOT_DONE == 0
6 Ler o resultado em (ADRESH:ADRESL)
7 esperar para poder repetir o ciclo de converso (1,6s)
Conversor A/D 16f877a
void main() {
ADCON0=0b00000000;
ADCON1=0b11001110;
TRISA=1; //RA0 como entrada;
while(1){
unsigned alta,baixa;
ADON_bit=1; // LIGA CONVERSOR A/D
delay_us(20); // ESPERA POR AQUISIO DE VALOR NO CAPACITOR
GO_NOT_DONE_bit =1; // INICIALIZA PROCESSO DE CONVERSO
while(GO_NOT_DONE_bit ==1){}
ADON_bit=0; //DESLIGA CONVERSOR A/D
delay_us(20); // ESPERA PARA FAZER NOVA LEITURA
alta=ADRESH; // VARIVEL RECEBE PARTE ALTA
baixa=ADRESL; // VARIVEL RECEBE PARTE BAIXA

}
}
Conversor A/D 16f877a
Completo com LCD
// LCD module connections
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;
void main() {
TRISB=0;
PORTB=0;
ADCON0=0b00000000;
ADCON1=0b11001110;
TRISA=1; //RA0 como entrada;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1){

unsigned int AD=0;


unsigned char txt[6];
ADON_bit=1; // LIGA CONVERSOR A/D
delay_us(20); // ESPERA POR AQUISIO DE VALOR NO CAPACITOR
GO_NOT_DONE_bit =1; // INICIALIZA PROCESSO DE CONVERSO
while(GO_NOT_DONE_bit ==1){}
ADON_bit=0; //DESLIGA CONVERSOR A/D
delay_us(20); // ESPERA PARA FAZER NOVA LEITURA
AD= (ADRESH<<8)+ADRESL;
WordToStr(AD, txt); // converte a varivel AD em texto para escrever no LCD
Lcd_Out(1,1,txt);
}
}
Conversor A/D 16f877a
Conversor A/D 16f877a

LM 35

Configurao -55 a 150 C

Configurao 2 a 150 C
Conversor A/D - Temperatura 16f877a
Conversor A/D- Temperatura 16f877a
Medidor de temperatura completo com LCD recortar e colar no mikroC.
// LCD module connections
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;

const char character[] = {14,10,14,0,0,0,0,0}; // constante para desenhar o grau no LCD ()


void CustomChar(char pos_row, char pos_char) { // funo para desenhar o grau no LCD (
char i;
Lcd_Cmd(64);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 0);
}

void main() {
TRISB=0;
PORTB=0;
ADCON0=0b00000000; // COnfigurao do conversor A/D
ADCON1=0b11001110; // COnfigurao do conversor A/D
TRISA=1; //RA0 como entrada;
Lcd_Init(); // inicia o LCD
Lcd_Cmd(_LCD_CLEAR); // limpa o LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Desliga o cursor do LCD

while(1){ // loop infinito


unsigned int AD=0; // cria varivel para receber o valor de temperatura do LM35
unsigned char txt[6],txtc[6]; // cria varivel de texto para converso do valor de temperatura
ADON_bit=1; // LIGA CONVERSOR A/D
delay_us(20); // ESPERA POR AQUISIO DE VALOR NO CAPACITOR
GO_NOT_DONE_bit =1; // INICIALIZA PROCESSO DE CONVERSO
while(GO_NOT_DONE_bit ==1){}
ADON_bit=0; //DESLIGA CONVERSOR A/D
delay_us(20); // ESPERA PARA FAZER NOVA LEITURA
AD = (ADRESH<<8)+ADRESL; // associa a parte menos significativa com a mais significativa
AD = AD*4.8876; // converte 5000mV em valor de temperatura 5000mv/1023
WordToStr(AD, txt); // converte a varivel AD em texto para escrever no LCD
Lcd_Out(1,1,txt); // Escreve 1 linha do LCD
if (AD<1000){ // converso da varivel para melhor visualizao
txtc[0] = ' '; }
else{
txtc[0]=(AD/1000)+48; }
txtc[1]=(AD/100)%10 +48;
txtc[2]=(AD/10)%10 + 48;
txtc[3]=',';
txtc[4]=(AD%10)+48;
Lcd_Out(2,1,txtc);
CustomChar(2,7); // escreve o simbolo do grau
Lcd_Chr(2,8,'C');
}
}

Вам также может понравиться