Está en la página 1de 2

Se pide

a) Realizar el circuito dejando listo para hacer pruebas en el software proteus.

Sistema para Medir la Tensión Domiciliaria


LCD1
LM016L

R1
10k

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
U1 +5v

E
1 4
MCLR RB0/CN4/RP0/C2IN-/AN2/EMUD1/PGD1

1
2
3

4
5
6

7
8
9
10
11
12
13
14
20 5
VCAP/VDDCORE RB1/CN5/RP1/C2IN+/AN3/EMUC1/PGC1
6
RB2/CN6/RP2/AN4
2 7
RA0/CN2/VREF+/AN0 RB3/CN7/RP3/AN5
3 11
RA1/CN3/VREF-/AN1 RB4/CN1/RP4/SOSCI
9 14
1

RA2/CN30/CLKI/OSCI RB5/CN27/RP5/ASDA1/EMUD3/PGD3
10 15
RA3/CN29/CLKO/OSCO RB6/CN24/RP6/ASCL1/EMUC3/PGC3
X1 12
RA4/CN0/T1CK/SOSCO RB7/CN23/RP7/INT0
16
CRYSTAL RB8/CN22/RP8/SCL1/PWM2H1/TCK
17 RV1
18 10k

15%
RB9/CN21/RP9/SDA1/PWM2L1/TDO
2

21
RB10/CN16/RP10/PWM1H3/TDI/EMUD2/PGD2
22
RB11/CN15/RP11/PWM1L3/TMS/EMUC2/PGC2
23
+5v RB12/CN14/RP12/PWM1H2
24
RB13/CN13/RP13/PWM1L2
28 25
AVDD RB14/CN12/RP14/PWM1H1
27 26
AVSS RB15/CN11/RP15/PWM1L1
DSPIC33FJ32MC202

BR1 R2
RV3 43K

C1
100%

2200uF

R7
2W08G 1k C3 1k C2
2200uF 47uF

b) Hacer un diagrama de flujo del programa

c) Escribir el programa con el Software MPLABx

#include "config.h"
#include "reloj.h"
#include <libpic30.h>
#include "xlcd.h"
#include <p33FJ32MC202.h>
#include <stdio.h>
#include <math.h>
char vector[4] = ""; //Caracter usado en la visualizacion de valores del
LCD
int result = 0; //Valor medido en bruto de AN0/RA0-AN1/RA1
int result1 = 0; //Valor medido en bruto de AN2/RB0
float vm = 0; //Valor medido como float
//Variables usadas en el calculo del programa
float temp=0;

void adc1 (void); //Lectura del puerto AN0-AN2


void adc2 (void); //Lectura del puerto AN1

int main(){

XLCDInit(); //Inicializacion de la pantalla LCD


WriteCmdXLCD(CLEAR_XLCD); //Limpia la pantalla LCD al reinicio
__delay_ms(10);
adc0(); //Inicia el ADC
while(1){

WriteCmdXLCD(CLEAR_XLCD); //Limpia la pantalla LCD al reinicio


XLCDgotoXY(0,0);
putrsXLCD("VOLTIMETRO DC");
AD1CON1bits.ADON = 1; // Habilita ADC
AD1CON1bits.SAMP = 1; // Bit para habilitar muestreo
__delay_ms(10);
AD1CON1bits.SAMP = 0; // Retiene el muestreo
while(!AD1CON1bits.DONE); // Esperar a que se haya realizado la convercion
AD1CON1bits.DONE = 0;
result = ADCBUF0;

//Calculos hechos para hallar el voltaje


vm = (float)result*(220.0+2.0)/4096.0; //Se le agrega 2v por caida de
tension del puente de diodos
sprintf(vector,"%.2f", vm);
XLCDgotoXY(1,0);
putrsXLCD("V: V");
XLCDgotoXY(1,7);
putrsXLCD(vector);
__delay_ms(1000) ;

}
}
void adc0 (void){
TRISA = 0x0001; // Entrada analógica RA0
AD1PCFGL = 0xFFFF; // Todas entradas analógicas
AD1CON1bits.AD12B=1; // Resolucion de 12 bits y muestreo
secuencial de los canales
AD1CON1bits.ASAM=0; // El muestreo inicia cuando bit SAMP=1
*muestreo manual
AD1CON1bits.SSRC=0; // Termina el muestreo e inicia la conversión
AD1CHS0bits.CH0NA =0; // La entrada negativa será Vss
AD1CHS0bits.CH0SA =0; // Entrada positiva será AN0
AD1CON2bits.CSCNA =0; // Muestreo secuencial (scan) deshabilitado
AD1CON2bits.VCFG =0; // Referencia para la conversión: Referencia
positiva=AVdd, Negativa=AVss
AD1CON2bits.BUFM =0; // Configurado como buffer de 16 palabras
AD1CON2bits.SMPI =0; // Después de la conversión se genera la
interrupción
AD1CON2bits.ALTS =0; // Muestra 1 canal: AN0
AD1CON3bits.ADRC =0; // Reloj del ADC es derivado del sistema
AD1CON3bits.ADCS =21; // Tiempo de conversión.
}

También podría gustarte