conversor ad do pic

Upload: francisco-josivan

Post on 07-Jul-2018

230 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/19/2019 Conversor AD Do PIC

    1/13

    Centro de Tecnologia Microgenios - Todos os direitos reservados 

     

    Clique aqui para Imprimir o doc umento

    Conversor A/D do PIC   1.0 Introdução 

    Introdução 

    O PIC18F452 possui internamente 8 canais de A/D com resolução de 10 bits cada.Comu m conversor A/D com resolução de 10 bits e tensão de referência 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 técnica de aproximação sucessivas,normalmente com resolução de 10 bits, com clock selecionável pelo usuário e múltiplasentradas multiplexadas.

  • 8/19/2019 Conversor AD Do PIC

    2/13

  • 8/19/2019 Conversor AD Do PIC

    3/13

     

    ADCS1 , ADCS2: Bits de seleção de velocidade de conversão A/D 

    tabela 1.0

    CHS2, CHS0: Bit de seleção de canal A/D 

    GO/DONE: Bit de status da conversão A/D0 - Conversão A/D não está sendo realizada 1 - Conversão A/D está sendo realizada 

    ADON: Liga ou desliga o A/D0 - Conversor A/D desligado 1 - Conversor A/D ligado 

    Antes de configurarmos os registradores ADCS2, ADCS1 e ADCS0,devemos levar em consideração a frequência do cristal que estamos utilizando, poisnosso conversor necessita de 1,6us para fazer a conversão.

    A tabela seguinte apresenta os valores de configuração dos registradoresADCS2, ADCS1 e ADCS0 para as faixas de frêquencia do cristal utilizado. 

    Registrador ADCON1: 

  • 8/19/2019 Conversor AD Do PIC

    4/13

    vejamos o funcionamento de cada bit desse registrador:

    ADCON1: 

    ADFM

      ADCS2  ------  -----  PCFG3  PCFG2  PCFG1  PCFG0 Bit7  Bit6  Bit5  Bit4  Bit3  Bit2  Bit1  Bit0 

    ADFM : Ajusta o formato do resultado da conversão A/D 0 - Justifica a direita 1 - Justifica a esquerda 

    ADCS2 : Bit de seleção da velocidade de conversão *consulte a tabela 1.0

    PCFG3, PCFG2, PCFG1, PCFG0: bits configuração do A/D 

    tabela 2.0

    O bit de ADFM tem a função de organizar o resultado da conversão A/D, de forma queo os valores convertidos sejam justificados a direita ou a esquerda nos registradoresADRESH e ADRESL. Caso venhamos configurar ADFM = 1, organizamos o valor daconversão a direita, ou seja, os oitos bits menos significativo será armazendo em

    ADRESL, e os 2 bits mais significativo serão armazenados em ADRESH.

  • 8/19/2019 Conversor AD Do PIC

    5/13

    Caso ADFM = 0, justificaremos a esquerda os valores de conversão, desta forma osoitos bits mais significativos ficarão em ADRESH e os 2 menos significativo ficará emADRESL.

    Através dos bits PCFG3, PCFG2, PCFG1, PCFG0 informamos quais os pinos que

    serão 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/DADCON1 = 6 ; //programamos todos os pinos RA0, RA1 , RA2 , RA3, RA5, RE0, RE1,RE2 como I/O de uso geralADCON1 = 14 ; //programamos os pinos RA1 , RA2 , RA3, RA5, RE0, RE1, RE2como I/O de uso geral e somente RA0 como AD (referência VDD).ADCON1 = 4 ; //programamos os pinos RA2 , RA5, RE0, RE1, RE2 como I/O de uso

    geral e RA0, RA1 e RA3 como AD (referência VDD).

     Nosso módulo possui um conversor com resolução máxima de 10 bits, ou seja, 1024divisões (0 a 1023 divisões). Podemos configurar e determinar tensões de referênciaexterna para nosso conversor A/D através dos pinos AN3 e AN2, ou selecionar a tensãointerna do chip (vcc e gnd) como referência.

    Fórmula de conversão analógico para digital:

    Rad = ( Vin - Vref-) * 1023 / (Vref+ - Vref-) 

    onde:

    Rad = Resultado da conversão

    Vref+ e Vref- = valor de tensão de referência máxima e mínima

    Vin = Tensão de entrada no pino A/D

    obs: 1023 é o valor máximo de conversão do A/D, lembrando que o valor é de 0 a 1023.Analize o esquema elétrônico seguinte:

  • 8/19/2019 Conversor AD Do PIC

    6/13

     figura 01

    Analizando o esquema eletrônico apresentado, vamos encontrar o valor analógicoconvertido para digital:

    Digamos que o valor da tensão Vin no momento de leitura do AN0 seja de 2V.

     Nossa Fórmula:Rad = ( Vin - Vref-) * 1023 / (Vref+ - Vref-) logo:Rad = (2 - 1) *1023 / (3 - 1)Rad = 1 * 1023 / 2Rad = 511

    OBS: A TENSÃO DE VREF EXTERNA NUNCA PODERÁ ULTRAPASSAR ATENSÃO DE ALIMENTAÇÃO DO MICROCONTROLADOR. 

    Trabalhando com o MikroC 

     No mikroC utilizamos os seguinte função para leitura do conversor A/D do PIC:

  • 8/19/2019 Conversor AD Do PIC

    7/13

    sintaxe:

    Adc_Read(canal_ AD); 

    onde:

    Canal_AD: canal do conversor AD do PIC que desejamos ler. O número do canal ADdepende do tipo de PIC usado.

    Exemplo:

    int leitura_ad; leitura_ad = Adc_Read(0);  //le canal ad0 do PIC e salva valor navariável temp_res 

    A função adc_read salva o valor da conversão AD (canal 0 - pino RA0) na variável

    leitura_ad.

    Lembre-se que o valor da resolução do AD do PIC18F452 é de 10 bits, e por essemotivo devemos utilizar uma variável do tipo inteiro para armazenar o valor do A/D.

    Estudo do registrador ADCON1: 

    O registrador ADCON1 é responsável por configurar o modo de trabalho dos pinos comA/D. Através dos bits PCFG3, PCFG2, PCFG1, PCFG0 configuramos o pino comoA/D ou como I/O de uso geral.

    Exemplo de programa: 

    Acompanhe o exemplo simples onde utilizamos um potenciometro a entrada RA0 e umdisplay LCD 16x2 para visualizarmos o valor da conversão do AD.

  • 8/19/2019 Conversor AD Do PIC

    8/13

     

    Exemplo de programa: 

    /****************************************************************************Centro de Tecnologia MicrogeniosPrograma: Diplay_7_seg_01Placa: KIT PICGENIOSObjetivo: este programa tem por função ler o canal AD0 e escrever nolcdo valor de conversão**********************************************************************

    **********/

    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 entradaADCON1 = 0B00001110;  //configura pino RA0 como entrada analógica

    e os demais com I/O digital

    Lcd8_Config(&PORTE,&PORTD,2,1,4,7,6,5,4,3,2,1,0);  //inicializa lcdLcd8_Cmd(Lcd_Clear);  //apaga lcdLcd8_Cmd(LCD_CURSOR_OFF);  //desliga cursor do lcd

  • 8/19/2019 Conversor AD Do PIC

    9/13

      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

    variável temp_resDelay_10us;  //delay de 10 microsegundoswordToStr(temp_res, texto);  //converte valor da conversão do

    ad0 para stringlcd8_out(1,11,texto);  //escreve no lcd o valor da conversão do

    ad0} while (1);

    Detalhes do programa: 

    Primeiramente definimos as variáveis globais do programa

    char texto[16];int temp_res = 0; 

    Depois iniciamos a função main() e definimos o sentido dos ports que participam docontrole do LCD: Repare que programamos o registrador ADCON1 com o valor 2, poiso 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 entradaADCON1 = 0B00001110;  //configura pino RA0 como entrada analógica

    e os demais com I/O digital 

    Os comandos seguintes são utilizados para controle e escrita do display LCD.

    Lcd8_Config(&PORTE,&PORTD,2,1,4,7,6,5,4,3,2,1,0);  //inicializa lcdLcd8_Cmd(Lcd_Clear);  //apaga lcdLcd8_Cmd(LCD_CURSOR_OFF);  //desliga cursor do lcdLcd8_Out(1, 1, "Canal AN0: ");  //escreve mansagem na linha 1,

    coluna 1 do lcdDelay_ms (10);  //delay 10 milisegundos 

    O comando seguinte lê o canal AN0 do PIC e salva o valor na variável temp_res.

  • 8/19/2019 Conversor AD Do PIC

    10/13

    temp_res = Adc_Read(0);  //le canal ad0 do PIC e salva valor navariável temp_res 

    A função abaixo tem pertence ao compilador mikroC e tem por objetivo converter ovalor de uma variável numérica do tipo word em string. Esta conversão é necessária pois iremos escrever o valor numérico da variável temp_res, resultado da conversãoAN0, e escrever no LCD. A variável que assimilará o valor convertido em string échamada de "texto".

    wordToStr(temp_res, texto);  //converte valor da conversão do ad0 para string  

    Em seguida enviamos para o LCD o valor da variável texto.

    lcd8_out(1,11,texto);  //escreve no lcd o valor da conversão 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 sensorde temperatura LM35 conectado ao canal AN1 e de um trimpot conectado ao canal AN0do PIC. O valor da conversão deverá ser escrito no LCD:

    Esquema elétrico: 

  • 8/19/2019 Conversor AD Do PIC

    11/13

     

    Programa: 

    /****************************************************************************Centro de Tecnologia MicrogeniosPrograma: Diplay_7_seg_01Placa: KIT PICGENIOSObjetivo: este programa tem por função ler o canal AD0 e AD1 eescrever no lcdo valor de conversão********************************************************************************/

    char texto[16];int leitura_an0 = 0;int leitura_an1 = 0;

    void  main() {trise = 0;  //define portb como saidatrisd = 0;  //define portd como saidaADCON1 = 0b00000100;  //habilita canal A/D 0 e A/D1 do

    PICtrisa = 0b00001111;  //define pinos como entrada

    Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1);  //inicializa lcdLcd8_Cmd(Lcd_Clear);  //apaga lcdLcd8_Cmd(LCD_CURSOR_OFF);  //desliga cursor do lcd

  • 8/19/2019 Conversor AD Do PIC

    12/13

      Lcd8_Out(1, 1, "Canal AN0: ");  //escreve mansagem na linha 1,coluna 1 do lcd

    delay_ms (10);  //delay de 10msLcd8_Out(2, 1, "Canal AN1: ");  //escreve mensagem na linha 2,

    coluna 1 do lcddelay_ms (10);  //delay 10 milisegundos

    do

    {leitura_an0 = Adc_Read(0);  //le canal ad0 do PIC e salva

    valor na variável leitura_an0wordToStr(leitura_an0, texto);  //converte valor da conversão do

    ad0 para stringlcd8_out(1,11,texto);  //escreve no lcd o valor da

    conversão do ad0 

    leitura_an1 = Adc_read(1);  //lê canal ad1 do PIC e salvavalor na variável leitura_an1 

    leitura_an1 = leitura_an1 / 2.048; //ajusta a escala de conversão

    do sensor de temperaturawordToStr(leitura_an1, texto);  //converte valor da conversão doad1 para string

    lcd8_out(2,11,texto);  //escreve no lcd o valor daconversão 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 cujovalor de saida de tensão é 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 resolução do A/D de nosso microcontrolador é de 10 bits e em nosso programautilizamos a tensão de referencia interna do A/D (5V).

    Calculo para leitura correta do sensor de temperatura: 

    Resolução do PIC: 

    Tensão de referencia (resolução do AD - 1) = resolução

    5V (1024 - 1) = 4,8876 mV

    A resolução do A/D do PIC para tensão de referencia de 5V é de 4,8876mV

    Resolução do sensor LM35: 

    10mV/ºC (dado fornecido pelo fabricante)

  • 8/19/2019 Conversor AD Do PIC

    13/13

    Logo teremos

    10 / 4,8876 = 2,048 

    Em nosso programa arrendondamos o valor 2.046 para 2 para que nosso programa não

    ultrapasse o valor limite demo do compilador (2Kbyte).

    leitura_an1 = adc_read(1);  //lê canal ad1 do PIC e salva valorna variável leitura_an1 leitura_an1 = leitura_an1 / 2.048; //ajusta a escala de leitura dosensor lm35. 

    voltar para o topo da pagina 

    Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programaçãoem CMicrogenios © 1998 - 2007. Todos os direitos reservados. É proibido cópia parcial ouintegral desse material sem prévio aviso. Maiores informações:[email protected]