ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
DISEÑO CON PIC INSTRUMENTOS: DE MEDICION CON ADC Voltimetro
1. REPÚBLICA BOLIVARIANA DE VENEZUELA
UNIVERSIDAD DE FALCÓN
FACULTAD DE INGENIERÍA
CARRERA: INGENIERÍA ELECTRÓNICA
CÁTEDRA: MICROCONTROLADORES Y MICROPROCESADORES
DOCENTE: AVINADAD MÉNDEZ
DISEÑO DE UN INSTRUMENTO DIGITAL
AUTOR:
Punto Fijo, agosto de 2022
2. Diseñe un instrumento digital que mida una variable cuya entrada será
dada por un voltaje que depende de esta variable (podría utilizarse por
ejemplo, un potenciómetro para simular el efecto de un sensor de la
variable con salida a voltios, cuya tensión del punto medio con respecto a
tierra, es proporcional a la variable de entrada) y ser la entrada a un
microcontrolador , que se tendrá que hacer la conversión analógico a digital,
se operará la variable ya digitalizada, y luego será mostrada en una pantalla
LCD con sus unidades.
Se realiza el diseño de un voltímetro digital empleando un PIC16F877A,
el cual posee un convertidor A/D de 10 bits. Se establece desde un
comienzo su resolución:
+𝑉 − (−𝑉 )
2 − 1
=
5 − 0
1024 − 1
=
5
1023
≈ 0.004887 V ≈ 4.88 mV
Esta resolución le permite una precisión aceptable, que no se desvía de
forma destacable en valores de voltaje bajos a la entrada de sus pines.
Originalmente, este voltímetro tiene un rango eficaz en que las lecturas
comprendidas entre 4-40 V son lo suficientemente precisas, redondeando
la lectura hacia abajo o directamente sustrayéndole lo suficiente al voltaje
que entra al pin RA0 como para mostrar 1 V menos que el de las fuentes
probadas en la pantalla del LCD.
Cabe destacar que se probó con dos voltajes: 40 V y 50 V, a través del
empleo de un divisor de voltaje a manera de protección y/o reducción de la
señal de voltaje que proviene de la fuente empleada. Este divisor se ajustó
de forma acorde para que las salidas del divisor fueran de 4 V y 4.17 V,
respectivamente:
4. Adicionalmente, se probó a emplear una fuente directa de 4 y 5 V, sin
necesidad de emplear un divisor de voltaje, a manera de estudiar qué
ocurriría en semejantes casos:
En este caso, entiendo se interpretaría el voltaje como 3.9 V.
+5V
+5V
1 2
X1
CRYSTAL
C1
22pF
C2
22pF
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-/CVREF
4
RA4/T0CKI/C1OUT
6
RA5/AN4/SS/C2OUT
7
RE0/AN5/RD
8
RE1/AN6/WR
9
RE2/AN7/CS
10
OSC1/CLKIN
13
OSC2/CLKOUT
14
RC1/T1OSI/CCP2
16
RC2/CCP1
17
RC3/SCK/SCL
18
RD0/PSP0
19
RD1/PSP1
20
RB7/PGD
40
RB6/PGC
39
RB5
38
RB4
37
RB3/PGM
36
RB2
35
RB1
34
RB0/INT
33
RD7/PSP7
30
RD6/PSP6
29
RD5/PSP5
28
RD4/PSP4
27
RD3/PSP3
22
RD2/PSP2
21
RC7/RX/DT
26
RC6/TX/CK
25
RC5/SDO
24
RC4/SDI/SDA
23
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
15
MCLR/Vpp/THV
1
U1
PIC16F877A
RB5
RB4
RB3
RB2
RB1
RB0
RB3
RB2
RB1
RB0
RB4
D7
14
D6
13
D5
12
D4
11
D3
10
D2
9
D1
8
D0
7
E
6
RW
5
RS
4
VSS
1
VDD
2
VEE
3
LCD1
LM016L
RB5
+5V
100%
RV1
5k
+4V
5. Muy similar al caso previo, entiendo se interpretaría el voltaje como 4.9 V.
En teoría, el PIC es capaz de analizar cualquier señal de voltaje
conectada al pin que ha sido configurado como la entrada analógica del
mismo para la interpretación del ADC, siempre y cuando exista la
intervención de un divisor de voltaje que simplifique la señal tal que no
exceda los 5 voltios, capacidad máxima que tiene el PIC en sus pines.
+5V
+5V
1 2
X1
CRYSTAL
C1
22pF
C2
22pF
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-/CVREF
4
RA4/T0CKI/C1OUT
6
RA5/AN4/SS/C2OUT
7
RE0/AN5/RD
8
RE1/AN6/WR
9
RE2/AN7/CS
10
OSC1/CLKIN
13
OSC2/CLKOUT
14
RC1/T1OSI/CCP2
16
RC2/CCP1
17
RC3/SCK/SCL
18
RD0/PSP0
19
RD1/PSP1
20
RB7/PGD
40
RB6/PGC
39
RB5
38
RB4
37
RB3/PGM
36
RB2
35
RB1
34
RB0/INT
33
RD7/PSP7
30
RD6/PSP6
29
RD5/PSP5
28
RD4/PSP4
27
RD3/PSP3
22
RD2/PSP2
21
RC7/RX/DT
26
RC6/TX/CK
25
RC5/SDO
24
RC4/SDI/SDA
23
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
15
MCLR/Vpp/THV
1
U1
PIC16F877A
RB5
RB4
RB3
RB2
RB1
RB0
RB3
RB2
RB1
RB0
RB4
D7
14
D6
13
D5
12
D4
11
D3
10
D2
9
D1
8
D0
7
E
6
RW
5
RS
4
VSS
1
VDD
2
VEE
3
LCD1
LM016L
RB5
+5V
100%
RV1
5k
+5V
6. Código en C++
//Configuración de cada uno de los pines salientes del PIC al LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
int Adread;
float voltaje;
char voltio[4];
void main() {
PORTA = 0;
TRISA = 0X01;
7. PORTB = 0;
TRISB = 0;
LCD_Init();
ADC_Init();
LCD_Cmd(_LCD_CURSOR_OFF);
LCD_Cmd(_LCD_CLEAR);
LCD_Out(1, 1, "Voltimetro");
delay_ms(1000);
while (1)
{
voltaje = ADC_Read(0);
voltaje = (voltaje * 5 * 10)/ (1024);
inttostr(voltaje,voltio); // Convierte el valor entero en un string
Lcd_Out(2,1,"Voltaje = ");
Lcd_Out(2,11,Ltrim(voltio));
Lcd_Out(2,13,"Voltios");
}
}