05 - Aplicação de ADC

7
" 04 Analógico a Interrupção Conversão Digital Guias para iniciantes Microcontroladores PIC 05 ‐ Aplicação de ADC.h ‐ voltímetro digital Anteriormente, nós vimos como usar ADC.h para configurar e utilizar o módulo de conversão analógicodigital PIC18F4550. Agora, vamos dar uma aplicação prática para as livrarias ADC.hy XLCD.h construção de um voltímetro digital simples de 0 a 5V cujos valores são exibidos no visor LCD de 16 × 2. Inicialmente vamos definir o nosso diagrama esquemático: Como pode ser visto, utilize AN0 (RA0) como um canal para a conversão, isto significa que podemos usar a porta B para controlar a nossa exibição, assim você pode usar as configurações padrão Livreiro XLCD.h. Se você tiver dúvidas sobre a

description

mplabx xc8

Transcript of 05 - Aplicação de ADC

  • 26/05/2015 05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

    data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2 1/7

    "04AnalgicoaInterrupoConversoDigital

    Guias para iniciantesMicrocontroladoresPIC

    05 Aplicao de ADC.h voltmetro digitalAnteriormente,nsvimoscomousarADC.hpara configurar e utilizar o mdulo deconverso analgicodigitalPIC18F4550. Agora, vamos dar umaaplicao prtica para as livrarias ADC.hyXLCD.hconstruodeumvoltmetrodigitalsimples de 0 a 5V cujos valores soexibidosnovisorLCDde162.

    Inicialmente vamos definir o nossodiagramaesquemtico:

    Como pode ser visto, utilize AN0 (RA0)como um canal para a converso, istosignificaquepodemosusaraportaBparacontrolaranossaexibio,assimvocpodeusar as configuraes padro LivreiroXLCD.h. Se voc tiver dvidas sobre a

  • 26/05/2015 05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

    data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2 2/7

    utilizao XLCD.hy ADC.h pode veraentrada01e03,respectivamente,desteblog.

    IntegerconversoASCII

    Sabemos que o mdulo A / D do nossomicrocontroladorvainosdarresultadosemuminteirode10bitequivalenteaosinaldeentrada analgica. Isto significa que, se anossa tenso de entrada pode variar nafaixade0Va5V,teriavaloresinteirosquevariam de 0 a 1023. Ento, por que necessrio para converter Integer paraASCII? Simples, nosso indicador trabalhacom caracteres ASCII ou melhor, comnmeros inteiros que tm um equivalenteem ASCII, por isso, se, por exemplo,queremos mostrar o nmero 1, precisoacrescentar 48, porque 49 em ASCII onmero1Epor isso temosdeprosseguircomqualqueroutrovalor.Agoraeuconvidovoc a rever a seguinte lista de cdigosASCII.

    Olhando para a tabela de cdigo ASCIIpodedeterminarosnmerosde0a9,podeser representado em ASCII sempreadicionando a constante 48. Em seguida,uma maneira de mostrar nossos valoresinteiros gerados pelo mdulo A / D para transformlo em um valorrepresentando a tenso de entrada e, emseguida,quebrarcadaumdosseusdgitospara converter ASCII envilos para exibirconsecutivamente:

    1. ImaginemanossacanalAN0recebeumatenso de entrada de 1.75V, seaplicarmos a equao correspondente,sabemos que a sada do mdulo A / Dtm 358,0928994. Agora, temos deconvertlo em um valor equivalente

  • 26/05/2015 05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

    data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2 3/7

    tenso de entrada, multiplicado pelaprimeira vez por 5000 o que nos d:1,790,464.498e,emseguida,dividirpor1,023oqueresultarem:1.750,209675,se s ns podemos ver toda a parterepresentaaentradade1.75V.

    2. Agora temos o nmero 1750, avanceparadividilaemseusdgitosindividuais,ento todos ns adicionamos 48 e jpodemosenviarparaovisorLCD.

    Comopodeservistoqueosdoisprocessosanteriores no so nada nvel deprogramao complicada. Esclarecer queesses algoritmos so fceis de encontraremlivrosenaInternet,paraqueelesnoso minha responsabilidade. O segmentodecdigoseguintemostraaimplementaodoalgoritmo:

    12345678910111213141516171819202122232425262728

    vazioADCInterruptinterrupo(){se(ADIF){//Capturaroresultadoresultadoreadadc=();//AlgoritmoparaadecomposioderesultadosemnmerosinteirosvAnalogico=(longresultado)*5000vAnalogico=vAnalogico/1023;dgito=vAnalogico/1000;SetDDRamAddr(0x09);putcXLCD(dgitos+48);SetDDRamAddr(0x0A);putrsXLCD(".");dgito=(vAnalogico/100)%10;SetDDRamAddr(0x0B);putcXLCD(dgitos+48);dgito=(vAnalogico/10)%10;SetDDRamAddr(0x0C);putcXLCD(dgitos+48);SetDDRamAddr(0x0D);putrsXLCD("V");ADIF=0;ConvertADC();}}

  • 26/05/2015 05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

    data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2 4/7

    Oalgoritmomuitosimplesemostradonovisorumvalordeum inteiroeduas casasdecimais. Este exemplo utilizado para ainterrupo do A / D, porque o mtodomaiseficiente.

    Ocdigocompletocomosegue:

    123456789101112131415161718192021222324252627282930313233343536373839404142

    #include#include#include#include#include#include"../plib/adc.h"//Bitsdeconfigurao.....#pragmaconfiguraoPLLDIV=5,CPUDIV=OSC1_PLL2,USBDIV=#pragmaconfiguraoFOSC=HSPLL_HS,FCMEN=OFF,IESO=OFF#pragmaconfiguraoPWRT=OFF,BOR=OFF,VREGEN=OFF#pragmaconfiguraoWDT=OFF,WDTPS=#pragmaconfiguraoMCLRE=ON,LPT1OSC=OFF,PBADEN=OFF#pragmaconfiguraoSTVREN=ON,LVP=OFF,ICPRT=OFF,XINST=OFF#define_XTAL_FREQ48000000//FunesXLCDexigidopelabibliotecaanularDelayFor18TCY(vazio);anularDelayPORXLCD(vazio);anularDelayXLCD(vazio);intresultado;longintvAnalogico;caracteredgito;vaziomain(){//DefinirLCD4bitsmutilneaOpenXLCD(FOUR_BIT&LINES_5X7);//Aguardeatqueovisorestdisponvel.enquanto(BusyXLCD());//Moveocursorparaadireita...WriteCmdXLCD(0x06);//Adesativaodocursor.WriteCmdXLCD(0x0C);SetDDRamAddr(0x00);putrsXLCD("Voltage");//==========================================/*DefiniromduloAD

  • 26/05/2015 05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

    data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2 5/7

    4344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495

    Fosc*=64*Align=right*16TAD*AN0Canal*Interromperhabilitado*VREF+eVrefligadoaVDDeVSS,respectivamente*ValorADCON1=14(CanalAN0analgico,orestodigital)*/OpenADC(ADC_FOSC_64&ADC_RIGHT_JUST&ADC_16_TAD,ADC_CH0&ADC_INT_ON&ADC_VREFPLUS_VDD&ADC_VREFMINUS_VSS,14);//Delay50TCYDelay10TCYx(5);ADC_INT_ENABLE();//AtivarADinterrupoei();//IniciarconversoConvertADC();enquanto(1){}}vazioADCInterruptinterrupo(){se(ADIF){//Capturaroresultadoresultadoreadadc=();//Algoritmoparadecomporosresultadosemnmerosinteiros...vAnalogico=(longresultado)*5000vAnalogico=vAnalogico/1023;dgito=vAnalogico/1000;SetDDRamAddr(0x09);putcXLCD(dgitos+48);SetDDRamAddr(0x0A);putrsXLCD(".");dgito=(vAnalogico/100)%10;SetDDRamAddr(0x0B);putcXLCD(dgitos+48);dgito=(vAnalogico/10)%10;SetDDRamAddr(0x0C);putcXLCD(dgitos+48);SetDDRamAddr(0x0D);putrsXLCD("V");

  • 26/05/2015 05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

    data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2 6/7

    Aquipodemosverasimulao:

    O vdeo a seguir mostra a implementaodecircuito:

    96979899

    100101102103104105106107108109110111112113114115116117118

    ADIF=0;ConvertADC();}}vazioDelayFor18TCY(vazio){Delay10TCYx(120);}vazioDelayPORXLCD(vazio){Delay1KTCYx(180);retornar;}vazioDelayXLCD(vazio){Delay1KTCYx(60);retornar;}

  • 26/05/2015 05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

    data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2 7/7

    Ocorreu um erro.

    No possvel executar o Javascript.

    Ento eu vou usar exemplos deinterrupes, que serviro como umpreldio para a implementao detemporizadores.Parapronto!!!