Beruflich Dokumente
Kultur Dokumente
05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes
"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
1/7
26/05/2015
05AplicaodeADC.hvoltmetrodigital|GuiaparaIniciantes
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
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:
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.
data:text/htmlcharset=utf8,%3Cdiv%20id%3D%22header%22%20style%3D%22margin%3A%200px%20!important%3B%20padding%3A%201px%3B%2
7/7