Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LABORATORIO03
LABORATORIO03
Desarrollo y simulación de
voltímetro
Medición de variables
SESION7
Diseño de voltímetro digital con dsPIC
Rango de voltaje : 0-20V
Circuito de
acondiconamiento
PROCESADOR
del voltajes
MODULO LC
J1
1
dsPIC33F
conector del
.
voltimetro CAS
1
J2
.
LCD1
LM016L
VDD
VEE
VSS
R1
RW
RS
D7
D6
D5
D4
D3
D2
D1
D0
E
10k
14
13
12
11
10
9
8
7
6
5
4
3
2
1
U1
1 4
MCLR RB0/CN4/RP0/C2IN-/AN2/PGED1
5
RB1/CN5/RP1/C2IN+/AN3/PGEC1
20 6
VCAP/VDDCORE RB2/CN6/RP2/AN4
7
RB3/CN7/RP3/AN5
11
RB4/CN1/RP4/SOSCI
14
RB5/CN27/RP5/ASDA1/PGED3
28 15
AVDD RB6/CN24/RP6/ASCL1/PGEC3
27 16
AVSS RB7/CN23/RP7/INT0
17
RB8/CN22/RP8/SCL1/TCK
18
RB9/CN21/RP9/SDA1/TDO
RB10/CN16/RP10/TDI/PGED2
21 RV2
2 22 1k
50%
RA0/CN2/VREF+/AN0 RB11/CN15/RP11/TMS/PGEC2
R3 3
RA1/CN3/VREF-/AN1 RB12/CN14/RP12/AN12
23
3.0k 9 24
RA2/CN30/CLKI/OSCI RB13/CN13/RP13/AN11
10 25
RA3/CN29/CLKO/OSCO RB14/CN12/RP14/AN10
B1 12
RA4/CN0/T1CK/SOSCO RB15/CN11/RP15/AN9
26
20V
DSPIC33FJ32GP202
100%
R2
1.0k
1k
RV1
conector
𝒄𝒐𝒏𝒆𝒄𝒕𝒐𝒓
#include "config.h"
#include "reloj.h" AD1CON2bits.VCFG=0b000;
#include "xlcd.h" AD1PCFGLbits.PCFG0=0; //AN0 COMO ANALOGICO
#include <p33fj12GP202.h> AD1CHS0bits.CH0SA=0b0000; //0
#include <stdio.h> AD1CHS0bits.CH0NA=1; //AN1 NEGATIVO
#include <stdlib.h> AD1CON3bits.ADCS=0b01001; //ADCS=9
//crear variable global AD1CON1bits.ASAM=0; //MUESTREO FORMA MANUAL
char adc_vector[4]=""; AD1CON1bits.SSRC=0b000; //ELEGIR FUENTE DE CONVERSION MANUAL
int adc_val=0; AD1CON1bits.ADON=1; //HABILITAR ADC
float adc_float=0;
char adcg_vector[4]="";
float adcg=0;
int main(void){
XLCDInit();
WriteCmdXLCD(CURSOR_OFF);
XLCDgotoXY(0,0);
putsXLCD("VOLTAJE = ");
XLCDgotoXY(1,0);
putsXLCD("ADC = ");
while(1)
{
AD1CON1bits.SAMP=1;
AD1CON1bits.SAMP=0;
while(!AD1CON1bits.DONE);
AD1CON1bits.DONE=0;
adc_val=ADC1BUF0;
adc_float=(float)adc_val*20/4096;
adcg=(float)adc_val;
sprintf(adc_vector,"%.2f",adc_float);
XLCDgotoXY(0,10);
putsXLCD(adc_vector);
sprintf(adcg_vector,"%.2f",adcg);
XLCDgotoXY(1,7);
putsXLCD(adcg_vector);
}
return 0;
}
Proyecto : Medición de temperatura con dsPIC
Proyecto : Medición de temperatura con dsPIC
¿NTC? ¿Y PTC?
Existen dos tipos de termistor, las NTC y las PTC. Si solo mirásemos el nombre, la diferencia
entre ambos es la primera letra N o P. Ambos nombres son siglas en inglés que significan:
NTC: Negative Temperature Coeficient
PTC: Positive Temperature Coeficient
Usar en este caso es el circuito potenciométrico. Este circuito está formado por el sensor y una
resistencia, colocadas en serie a modo de divisor de tensión.
𝑅 𝐴𝑈𝑋
𝑹 𝒏𝒕𝒄 =
𝑅
𝑽 𝒎 =𝑽 𝒄𝒄 ∗ 𝑛𝑡𝑐
𝑉 𝑐𝑐
𝑹 𝒏𝒕𝒄+ 𝑹 𝑨𝑼𝑿 𝑉𝑚
−1
LCD1
LM016L
VDD
VEE
VSS
R1
RW
RS
D7
D6
D5
D4
D3
D2
D1
D0
E
10k
14
13
12
11
10
9
8
7
6
5
4
3
2
1
U1
1 40
MCLR AVDD
2 39
RB0 AVss
3 38
RB1 RB9
4 37
RB2 RB10
5 36
RB3 RB11
6 35
RB4 RB12
7 34
RB5 RD0
8 33
RB6 RD1
9 32
RB7 VDD
10
RB8 VSS
31 RV2
11 30 1k
50%
VDD RF0
RAUX 12
VSS RF1
29
1.0k 13 28
OSC1/CLKI RF4
14 27
OSC2/RC15 RF5
VCC 15
RC13 RF2/RX
26
5V 16 25
RC14 RF3/TX
17 24
INT0/RA11 RF6
18 23
INT2/RD9 INT1/RD8
RNTC 19
RD3 RD2
22
10.0k 20 21
-tc VSS VDD
DPIC30F4011
Ecuación de thermistor
•β es la constante de la NTC
𝑇 =[
ln
( )
𝑅0
+
1
]
𝛽 𝑇0
#include "config.h"
#include "reloj.h" void ADC_Init(void); //Función prototipo para ADC
#include <libpic30.h> void ADC_Init(void)
#include "xlcd.h" {
#include <p30F4013.h> ADCON2bits.VCFG = 0b000; //AVss y AVdd
#include <stdio.h> ADPCFGbits.PCFG3 = 0; //RB3 como entrada analógica
#include <math.h> ADCHSbits.CH0SA = 0b0011; //Toma el canal analógico AN3
//crear variable global ADCHSbits.CH0NA = 0; //Toma Vref- como negativo de ref
char adc_vector[4] = ""; ADCON3bits.ADCS = 0b01001; //ADCS = 9
int adc_result = 0; ADCON1bits.ASAM = 0; //Muestreo manual
float vm = 0; ADCON1bits.SSRC = 0b000; //Limpiar el bit SAMP //e inicia la
conv
float rntc = 0; ADCON1bits.ADON = 1; //Habilitar el ADC
float temperaturaK = 0; }
float temperaturaC = 0;
float adc_float = 0;
float rAux = 10000;
float vcc = 5;
float beta = 3977; //Beta de 10Kohm para NTC
float temp0 = 298.0; //Temp en grados Kelvin(0)
float r0 = 10000; //RNTC cuando la temp. es 0
int main()
vm = (float)adc_result*5/4096; //0 ~ 4095 (palabra de 12 bits)
{
rntc = rAux/((vcc/vm)-1);
XLCDInit(); //Inicia la pantalla LCD temperaturaK = beta/(log(rntc/r0)+(beta/temp0));
UART_Init(); //Inicia el UART1 temperaturaC = temperaturaK - 273.15;
ADC_Init(); //Inicia el ADC __delay_ms(10);
WriteCmdXLCD(CLEAR_XLCD); //Limpia la pantalla sprintf(adc_vector,"%.2f",temperaturaC);
// LCD al reiniciar printf("%.2f\n",temperaturaC);
XLCDgotoXY(0,0); XLCDgotoXY(1,6);
putrsXLCD("PROYECTO"); putrsXLCD(adc_vector);
__delay_ms(3000); XLCDgotoXY(1,12);
WriteCmdXLCD(CLEAR_XLCD); putrsXLCD("C");
XLCDgotoXY(0,0); }
putrsXLCD("MICRO"); return 0;
XLCDgotoXY(1,0); }
putrsXLCD("Temp: ");
XLCDgotoXY(1,6);
while(1){
ADCON1bits.SAMP = 1; //Inicio del muestreo
__delay_ms(500); //Tiempo de muestreo
ADCON1bits.SAMP = 0; //Finalizar el muestreo
while(!ADCON1bits.DONE);
ADCON1bits.DONE = 0;
adc_result = ADCBUF0;
REALIZAR PRUEBAS