You are on page 1of 7

26/05/2015

05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

Guias para iniciantes


MicrocontroladoresPIC

"04AnalgicoaInterrupoConverso
Digital

05 Aplicao de ADC.h
voltmetro digital
Anteriormente,nsvimoscomousarADC.h
para configurar e utilizar o mdulo de
converso
analgicodigital
PIC18F4550. Agora, vamos dar uma
aplicao prtica para as livrarias ADC.hy
XLCD.hconstruodeumvoltmetrodigital
simples de 0 a 5V cujos valores so
exibidosnovisorLCDde162.
Inicialmente vamos definir
diagramaesquemtico:

nosso

Como pode ser visto, utilize AN0 (RA0)


como um canal para a converso, isto
significa que podemos usar a porta B para
controlaranossaexibio,assimvocpode
usar as configuraes padro Livreiro
XLCD.h. Se voc tiver dvidas sobre a
data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2

1/7

26/05/2015

05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

utilizao XLCD.hy ADC.h pode ver


aentrada01e
03,respectivamente,deste

blog.
IntegerconversoASCII
Sabemos que o mdulo A / D do nosso
microcontroladorvainosdarresultadosem
uminteirode10bitequivalenteaosinalde
entrada analgica. Isto significa que, se a
nossa tenso de entrada pode variar na
faixade0Va5V,teriavaloresinteirosque
variam de 0 a 1023. Ento, por que
necessrio para converter Integer para
ASCII? Simples, nosso indicador trabalha
com caracteres ASCII ou melhor, com
nmeros inteiros que tm um equivalente
em ASCII, por isso, se, por exemplo,
queremos mostrar o nmero 1, preciso
acrescentar 48, porque 49 em ASCII o
nmero 1 E por isso temos de prosseguir
comqualqueroutrovalor.Agoraeuconvido
voc a rever a seguinte lista de cdigos
ASCII.
Olhando para a tabela de cdigo ASCII
podedeterminarosnmerosde0a9,pode
ser representado em ASCII sempre
adicionando a constante 48. Em seguida,
uma maneira de mostrar nossos valores
inteiros gerados pelo mdulo A / D
para transformlo
em
um
valor
representando a tenso de entrada e, em
seguida, quebrar cada um dos seus dgitos
para converter ASCII envilos para exibir
consecutivamente:
1. ImaginemanossacanalAN0recebeuma
tenso de entrada de 1.75V, se
aplicarmos a equao correspondente,
sabemos que a sada do mdulo A / D
tm 358,0928994. Agora, temos de
convertlo em um valor equivalente
data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2

2/7

26/05/2015

05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

tenso de entrada, multiplicado pela


primeira vez por 5000 o que nos d:
1,790,464.498e,emseguida,dividirpor
1,023oqueresultarem:1.750,209675,
se s ns podemos ver toda a parte
representaaentradade1.75V.
2. Agora temos o nmero 1750, avance
paradividilaemseusdgitosindividuais,
ento todos ns adicionamos 48 e j
podemosenviarparaovisorLCD.

Comopodeservistoqueosdoisprocessos
anteriores no so nada nvel de
programao complicada. Esclarecer que
esses algoritmos so fceis de encontrar
em livros e na Internet, para que eles no
so minha responsabilidade. O segmento
decdigoseguintemostraaimplementao
doalgoritmo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

vazioADCInterruptinterrupo()
{
se(ADIF)
{
//Capturaroresultado
resultadoreadadc=();

//Algoritmoparaadecomposioderesultadosemnme
vAnalogico=(longresultado)*5000
vAnalogico=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();
}
}

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

3/7

26/05/2015

05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

Oalgoritmomuitosimplesemostradono
visor um valor de um inteiro e duas casas
decimais. Este exemplo utilizado para a
interrupo do A / D, porque o mtodo
maiseficiente.
Ocdigocompletocomosegue:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

#include<xc.h>
#include<stdio.h>
#include<stdlib.h>
#include<plib/xlcd.h>
#include<plib/delays.h>
#include"../plib/adc.h"

//Bitsdeconfigurao.....
#pragmaconfiguraoPLLDIV=5,CPUDIV=OSC1_PLL2,
#pragmaconfiguraoFOSC=HSPLL_HS,FCMEN=OFF,IES
#pragmaconfiguraoPWRT=OFF,BOR=OFF,VREGEN=O
#pragmaconfiguraoWDT=OFF,WDTPS=
#pragmaconfiguraoMCLRE=ON,LPT1OSC=OFF,PBADEN
#pragmaconfiguraoSTVREN=ON,LVP=OFF,ICPRT=O

#define_XTAL_FREQ48000000

//FunesXLCDexigidopelabiblioteca
anularDelayFor18TCY(vazio);
anularDelayPORXLCD(vazio);
anularDelayXLCD(vazio);

intresultado;
longintvAnalogico;
caracteredgito;

vaziomain()
{
//DefinirLCD4bitsmutilnea
OpenXLCD(FOUR_BIT&LINES_5X7);
//Aguardeatqueovisorestdisponvel.
enquanto(BusyXLCD());
//Moveocursorparaadireita...
WriteCmdXLCD(0x06);
//Adesativaodocursor.
WriteCmdXLCD(0x0C);

SetDDRamAddr(0x00);
putrsXLCD("Voltage");

//==========================================
/*DefiniromduloAD

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

4/7

26/05/2015

05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

Fosc*=64
*Align=right
*16TAD
*AN0Canal
*Interromperhabilitado
*VREF+eVrefligadoaVDDeVSS,respectivamente
*ValorADCON1=14(CanalAN0analgico,orestodig
*/
OpenADC(ADC_FOSC_64&
ADC_RIGHT_JUST&
ADC_16_TAD,
ADC_CH0&
ADC_INT_ON&
ADC_VREFPLUS_VDD&
ADC_VREFMINUS_VSS,
14);

//Delay50TCY
Delay10TCYx(5);

ADC_INT_ENABLE();//AtivarADinterrupo
ei();

//Iniciarconverso
ConvertADC();

enquanto(1)
{}
}

vazioADCInterruptinterrupo()
{
se(ADIF)
{
//Capturaroresultado
resultadoreadadc=();

//Algoritmoparadecomporosresultadosemnmerosi
vAnalogico=(longresultado)*5000
vAnalogico=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");

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

5/7

26/05/2015

05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

ADIF=0;
ConvertADC();
}
}

vazioDelayFor18TCY(vazio)
{
Delay10TCYx(120);
}

vazioDelayPORXLCD(vazio)
{
Delay1KTCYx(180);
retornar;
}

vazioDelayXLCD(vazio)
{
Delay1KTCYx(60);
retornar;
}

Aquipodemosverasimulao:

O vdeo a seguir mostra a implementao


decircuito:

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

6/7

26/05/2015

05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes

Ocorreu um erro.
No possvel executar o Javascript.

Ento eu vou usar exemplos de


interrupes, que serviro como um
preldio para a implementao de
temporizadores.Parapronto!!!

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

7/7

You might also like