You are on page 1of 8

Voltmetro de 0 a 29v

En el siguiente post quiero a dar a conocer una forma fcil y accesible de


fabricar un voltmetro con un PIC16F877A, el cual tiene lo que necesitamos,
un conversor A/D.
La base para que esto funcione es un divisor de voltaje para poder disminuirlo
y as el microcontrolador pueda hacer una lectura de la conversin,
recordemos que un PIC trabaja a un mximo de 5v y lo que queremos hacer es
medir un voltaje de 0 a 29, tambin es necesario usar un diodo zener para
proteger nuestro PIC en caso de que falle alguna resistencia.

Para un clculo ms correcto R1 debera ser a 90K y R2 de 10K por


ejemplo, si quisiramos tener la siguiente tensin, transformar 12v (Vin) y ver
el resultado (Vout):

R1 = 90K (90000 )
R2 = 10K (10000 )
Vin = 12v
10000

( 12)

1.2v

90000 + 10000
Como vemos hemos transformado 12v en 1.2v asi el
microcontrolador podria interpretar dichas lecturas sin ningun
problema y tener nuestro resultado.

El siguiente problema que vi alli es que resistencias de 90K no hay,


para eso se deberia de usar un potenciometro de 100K y llevarlo a la
medida exacta que son los 90K, entonces decidi usar a R1 como
100K, obviamente ya los resultados no serian iguales a los que
tenemos en la ecuacion:

R1 = 100K
R2 = 10K
Vin = 12v
Vout = 1.09v
Un resultado muy disparejo al esperado que es 1.2v, mi idea fue la
siguiente, armar en proteus el siguiente esquema:

LCD1
LM016L

C1

C2

33pF

33pF

13
14

100K

2
3
4
5
6
7

+88.8

D1

R4

1N4733A

10K

Volts

8
9
10

R3
10k

OSC1/CLKIN
OSC2/CLKOUT

RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD

RA0/AN0
RA1/AN1
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RA4/T0CKI/C1OUT
RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
RE0/AN5/RD
RC1/T1OSI/CCP2
RE1/AN6/WR
RC2/CCP1
RE2/AN7/CS
RC3/SCK/SCL
RC4/SDI/SDA
MCLR/Vpp/THV
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14

U1

CRYSTAL

R2

4
5
6

1
2
3

V SS
V DD
V EE

X1

RS
RW
E

R2(1)

33
34
35
36
37
38
39
40
15
16
17
18
23
24
25
26
19
20
21
22
27
28
29
30

PIC16F877A

Como se ve R2 y R4 es el divisor de tensin en la lectura de RA0 y


D1 el diodo protector, ahora para realizar el muestreo de datos en la
LCD hice la siguiente programacin en Pic Basic:

DEFINE OSC 4

; Define el oscilador

DEFINE LCD_DREG PORTC ; Configurar LCD puerto C


DEFINE LCD_DBIT 4

; Bits menos significativos C7-C4

DEFINE LCD_RSREG PORTC ; Definir el RS puerto C

DEFINE LCD_RSBIT 2

; Bit puerto C2

DEFINE LCD_EREG PORTC

; Definir E puerto C

DEFINE LCD_EBIT 3

; Bit puerto C3

; PARMETROS DEL ADC

DEFINE ADC_BITS 10

; Numero bits (Para lecturas mayores de 5v)

DEFINE ADC_CLOCK 3

; Usar el clock RC de AD

DEFINE ADC_SAMPLEUS 50 ; Tiempo de muestreo en 50US

Vin VAR WORD

; Variable que lee el puerto RA0

TRISA = 1

; Puerto como entrada

TRISA.0 = 1

; Explcitamente el puerto RA0 como entrada

ADCON0 = %11000001 ; Reloj del A/D, selecciona AN0


ADCON1 = 0

; Hacer a AN0 a AN4 entradas como analgicas

LCDOUT $FE, 1

; Limpiar la LCD

PAUSE 500

; Pausa para iniciar la LCD

INICIO:

; Bloque de rutina

ADCIN 0, vin

; LEER LA ENTRADA ANALOGICA

LCDOUT $FE, 2, "Resultado: ", DEC4 Vin


PAUSE 100

; PAUSA

GOTO INICIO

; Volver al inicio

END

; Fin

; Visualizar datos en la LCD

Simplemente el programa lo que hace es definir los puertos de la LCD a


configurar, luego el reloj interno y bits para preparar la lectura analgica, y
una variable que guardara los datos de RA0 y mostrarla en la LCD.
Tendramos lo siguiente, por ejemplo:
En Vin del divisor de tensin de proteus lo coloque a 12v y se mostr el
siguiente resultado en la LCD:
Vin = 14272 (12v)
Vin = 13120 (11v)
Al visualizar estos resultados desde 12v hasta 1v obtuve como comn, un
diferencial que se repeta con mayor frecuencia en la resta, ejemplo:
Reste 14272 - 13120 = 1152
El resultado de la resta ser el valor que nos ayudara a dar con el voltaje que
es lo que necesitamos visualizar:
Vin = 14272 (12v)
14272/1152 = 12,38 redondeando este resultado seran los 12v que estara
dando da la medicin.
Ahora lo que vi cuando fui a calcular la siguiente diferencia:
Vin = 13120 (11v)
Vin = 11904 (10v)
13120 11904 = 1216, lo que hice es restar por 64 y as igualar el resultado al
diferencial comn.
1216 64 = 1152
Otro ejemplo, calcular la diferencia entre 2v y 1v:
Vin = 2368 (2v)
Vin = 1216 (1v)
2368 1216 = 1152

Como se observa, as pude determinar que el valor para la ecuacin que iba a
formular era el 1152, proced a la siguiente formula:
Vout = Vin / 1152
Ejemplo: Vout ser una variable que nos mostrara el resultado final que es el
voltaje, Vin es la variable de los datos ledos de RA0 y lo dividimos sobre
1152.
Vout = 7168/1152
Vout = 6.22 => 6v
Todo lo anterior mostrado fue para poder calcular y sacar la ecuacin exacta
para tener los resultados esperados, el inconveniente es que solo puede medir
de 0v a 29v, de all en adelante empieza a tener mrgenes de error.
Ahora vamos a disear nuevamente el programa pero le vamos a incluir la
formula y as obtener la conversin:

DEFINE OSC 4

; Define el oscilador

DEFINE LCD_DREG PORTC ; Configurar LCD puerto C


DEFINE LCD_DBIT 4

; Bits menos significativos C7-C4

DEFINE LCD_RSREG PORTC ; Definir el RS puerto C


DEFINE LCD_RSBIT 2

; Bit puerto C2

DEFINE LCD_EREG PORTC

; Definir E puerto C

DEFINE LCD_EBIT 3

; Bit puerto C3

; PARMETROS DEL ADC

DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3

; Numero bits (Para lecturas mayores de 5v)


; Usar el clock RC de AD

DEFINE ADC_SAMPLEUS 50 ; Tiempo de muestreo en 50US

Vin VAR WORD


Vout VAR WORD

; Variable que lee el puerto RA0


; Variable que lee el puerto RA0

TRISA = 1

; Puerto como entrada

TRISA.0 = 1

; Explcitamente el puerto RA0 como entrada

ADCON0 = %11000001 ; Reloj del A/D, selecciona AN0


ADCON1 = 0

; Hacer a AN0 a AN4 entradas como analgicas

LCDOUT $FE, 1

; Limpiar la LCD

PAUSE 500

; Pausa para iniciar la LCD

INICIO:

; Bloque de rutina

ADCIN 0, vin

; LEER LA ENTRADA ANALOGICA

Vout = Vin / 1152

; Formula que transforma en voltios la lectura

LCDOUT $FE, 2, "Voltaje: ", DEC Vout


PAUSE 100

; PAUSA

GOTO INICIO

; Volver al inicio

END

; Fin

; Visualizar datos en la LCD

LCD1

C1/CLKIN
C2/CLKOUT

RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD

0/AN0
1/AN1
2/AN2/VREF-/CVREF
3/AN3/VREF+
4/T0CKI/C1OUT
5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
0/AN5/RD
RC1/T1OSI/CCP2
1/AN6/WR
RC2/CCP1
2/AN7/CS
RC3/SCK/SCL
RC4/SDI/SDA
LR/Vpp/THV
RC5/SDO
RC6/TX/CK

33
34
35
36
37
38
39
40
15
16
17
18
23
24
25

D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14

RS
RW
E
4
5
6

1
2
3

VSS
VDD
VEE

LM016L

You might also like