You are on page 1of 13

CONVERTIDOR ANALOGICO DIGITAL Y

CONVERTIDOR DIGITAL ANALOGICO

I.

OBJETIVOS:
1.1 OBJETIVO GENERAL

APRENDER

EL PROCESO DE CONVERSION DE SEALES


ANALOGICAS Y DIGITAL CON EL USO DE LOS MODULOS ADC Y PWM
CON UN MICROCONTROLADOR

1.2 OBJETIVOS ESPECIFICOS


a) SELECCIONAR EL MICROCONTROLADOR QUE TENGA MODULO
ADC Y PWM
b) UTILIZAR UN CONVERSOR ANALOGICO A DIGITAL (A/D) PARA
OBTENER SEALES DIGITALES.
c) UTILIZAR EL MODULO PWM-RC, PARA OBTENER UNA SEAL
CONTINUA A PARTIR DE UNA DIGITAL.
d) GENERAR EL TIEMPO DE MUESTREO UTILIZANDO EL TIMER 1.

II.
MATERIALES
Computadora con software Proteus Professional, software Pic C Compiler .
III.
MARCO TEORICO:
Para poder llevar a cabo nuestra primera practica como primer paso debemos
seleccionar un microcontrolador que cuente con los siguientes requisitos:
Conversor A/D
Modulo PWM
Timer
Modulo de comunicacin Serial o USART
Dentro de las innumerables gamas de microcontroladores que existen en el mercado
vamos a elegir uno de proposito general, como el PIC 16F88 de Microchip. Este
microcontrolador cuenta con las siguientes caracteristicas:
Cuenta con un modulo A/D de 7 canales, con 10 bits de resolucion.
Modulo CCP(captura,comparacion,pwm)
Cuenta con 3 timers :

TMR0 temporizador/contador de 8 bits


TMR1
Temporizador de 16 bits
Puede usarse como reloj secundario en modos de bajo consumo
Puede usarse como reloj de tiempo real (RTC)
Genera interruption por desbordamiento
TMR2

Temporizador de 8 bits
Genera interrupcin por desbordamiento

Modulo de comunicacin UART


Oscilador interno de 8 MHz

Modo Temporizacin TIMER 1


El periodo de temporizacin es:
TIMER 1
T=Tosc*4*(65535-TMR1)*Preescaler
Dnde:
TMR1: Conformado por 2 registros de 1 byte c/u, y es el dato a partir del
cual empezar a contar el TIMER1.
Preescaler: Factor de divisin de frecuencia de OSC/4. Puede tomar
valores de: 1, 2, 4 y 8,
Tosc = 1/Fosc
TIMER 2 para generacin de PWM
Periodo PWM (TPWM):
TPWM =
4*Tosc*(Pr2+1)*Prescaler.
Frecuencia la seal PWM: FPWM = 1/ TPWM
TMR2: registro de 8 bits del TIMER2.
Pr2: Registro de 8 bits a ser comparado con TMR2, es decir el TMR2
llegar hasta PR2.
Preescaler: Factor de divisin de frecuencia de OSC/4. Puede tomar
valores de: 1, 4 y 16.
Duty cicle = Valor/((Pr2+1)*4)
Duty * 100 = porcentaje de Duty cicle.
Dnde:
Valor: Variable de 10 bits, es el argumento ingresado en PICC para
generacin de PWM.
IV.
PROCEDIMIENTO:
a. Inicie el software Proteus Professional, seleccionar el uC 16F88, adicionar el
potencimetro interactivo POT-HG, un osciloscopio y un virtual terminal, e
implemente el circuito que se muestra en la figura 1.0, teniendo en cuenta las
conexiones mostradas.

Figura 1.0
b. Implementar el programa (en lenguaje C) utilizando para ello el software PIC C
y copiando en su editor el cdigo que se muestra a continuacin.
#include <16F88.h>
#device adc=10
#FUSES NOWDT, INTRC_IO, NOMCLR
#use delay(INT=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
long adc_value; // variable para guardar la lectura del ADC
float adc_volts; // variable para expresar el voltaje de entrada
#int_TIMER1
void TIMER1_isr(void)
{
set_timer1(40535L); // Tm = 0.1s -- tiempo de muestreo
output_high(PIN_B1);
set_adc_channel( 0 );
delay_us(10);
adc_value = read_adc();
adc_volts = adc_value*0.004887; // 0.004887 = 5/1023
printf("ad_val = %4Lu adc_vol = %2.3f \n\r",adc_value,adc_volts);
delay_ms(50);
output_low(PIN_B1);
}
void init_cpu(void)
{
setup_adc_ports(sAN0|sAN1|VSS_VDD); //channel 0 y 1 analgicos
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // preescaler de 8
set_timer1(40535L); // T=(1/8)us*4*(65535-TMR1)*8->T=0.1s

setup_timer_2(T2_DIV_BY_1,99,1); //Fpwm=20KHz -> Tpwm=50us


setup_ccp1(CCP_PWM);
enable_interrupts(INT_TIMER1);

enable_interrupts(GLOBAL);
setup_oscillator(OSC_8MHZ|OSC_INTRC);
}
void main()
{
init_cpu();
while(1);
}
c. Compile el programa antes citado y cargue el archive .HEX en el uC del
circuito implementado en Proteus.
d. En el canal D del osciloscopio (conectado al pin B1 de uC) se podr visualizar
la seal cuyo periodo corresponde al tiempo de muestreo, el Ton de la misma
corresponder al tiempo que utiliza el procesador para la lectura del ADC y
dems operaciones dentro de la interrupcin.
Anotar:
Tiempo de muestreo : 11 ms
Tiempo utilizado por el procesador para la lectura del ADC : 90 ms
e. Manipular el voltaje de entrada del ADC del uC, por medio del potencimetro
conectado al pin AN0 del mismo, utilizando el virtual terminal anote el valor de
la conversin correspondiente, e ingrese sus datos en la tabla 1.0
Resolucin del ADC del uC :49 mV
ANALOGICO - DIGITAL

f.

Vi

adc_value

000

205

419

2.5

512

614

829

1023

adc_value vs. Vi
1200
1023

1000
829

800
614

600
512
419

400
205

200
0 0
0

U
sando los datos de la tabla graficar adc_value vs Vi y encontrar la funcin de
transferencia (K) para el A/D.
N= KV
g. Usando PWM para generar una seal analgica (D/A)
Acontinuacion se muestra el diagrama de flujo del proceso de generacion de la
seal PWM

h. Considerando el diagrama de flujo anterior , se implementara el programa (en


lenguaje C ) correspondiente a dicho diagrama, utilizando para ello el sofware
PIC-C y copiado a su editor el codigo que se muestra a continuacion.
#include <16F88.h>
#device adc=10

#FUSES NOWDT, INTRC_IO, NOMCLR


#use delay(INT=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
long adc_value, duty;
float adc_volts,D_pc;
#int_TIMER1
void TIMER1_isr(void)
{
set_timer1(40535L); // Tm = 0.1s -- tiempo de muestreo
output_high(PIN_B1);
set_adc_channel( 0 );
delay_us(10);
adc_value = read_adc();
adc_volts= adc_value*0.004887; // 0.004887 = 5/1023
D_pc=(adc_value*0.0977517); //%duty = (adc_value*100)/1023
duty=(long)(adc_value*0.39100684); //0.39100684 = 400/1023
set_pwm1_duty(duty);
printf("adc_vol= %2.3f ad_val= %4Lu D= %3.1f duty = %3.0Lu \n\r",
adc_volts,adc_value, D_pc,duty);
delay_ms(10);
output_low(PIN_B1);
}
void init_cpu(void)
{
setup_adc_ports(sAN0|sAN1|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(40535L); // T=(1/8)us*4*(65535-TMR1)*8 -> T=0.1s,
TMR1=40535
setup_timer_2(T2_DIV_BY_1,99,1); //Fpwm=20KHz -> Tpwm=50us
setup_ccp1(CCP_PWM);
set_pwm1_duty(0L);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
setup_oscillator(OSC_8MHZ|OSC_INTRC);
}
void main()
{
init_cpu();
while(1);
}

i. Compile el programa antes citado y cargue el archive .HEX en el uC del


circuito implementado en Proteus que se muestra en la figura 1.1.

Figura 1.1
j. En el canal D del osciloscopio (conectado en el pin C1 del uC), se podr
visualizar la grfica del tiempo de muestreo, as como el tiempo utilizado por el
cdigo del programa para lectura del A/D y D/A generacin de PWM del uC
(tiempo contado luego de generada la interrupcin del TIMER1) y en el canal C
se podr visualizar la seal PWM proveniente del uC.
k.

Los mdulos PWM generan bsicamente formas de onda peridicas. La


seal PWM puede ser convertida en seal analgica mediante un filtro pasa
bajo para determinar su valor promedio (DC). Ejecutando el programa y
variando el voltaje de entrada y tomando los datos del virtual terminal, llenar la
tabla 1.2
Frecuencia de la seal PWM: 20 kHz

DIGITAL - ANALOGICO
Adc_value

Tpwm

Tpwm

%D

Duty

Vi
0
1

N
0
205

Ton
0
40

Tof
0
10

0
20

D
0
80

2
3

419
614

29
20

21
30

40.9
60

163
240

829

9.25

40.75

81

324

1023

0.10

49.90

99.99

399

Tabla 1.2

Vi vs %D
120
100
80

%D

60
40
20
0

Vi

l. De la tabla
1.2 graficar Vi vs %D, %D vs Duty y Duty vs adc_value

Duty Vs. %D
450
400

399

350

324

300
250

240

DUTY 200

163

150
100

80

50
0 0
0

20

40

60

80

100

120

%D

DUTY Vs. Adc_value


1200
1023

1000
829

800

Adc_value

614

600
419

400
205

200
0 0
0

50

100

150

200

250

DUTY

300

350

400

450

INGRESAMOS UNA SEAL SENOIDAL EN VEZ DEL POTENCIMETRO (usamos


offset)

2 Hz

10 Hz

20 Hz

CONCLUSIONES
El convertidor digital-analgico es un circuito que tiene una
entrada digital y da a la salida una tensin proporcional a la
palabra digital.
Mientras que el convertidor analgico-digital es un Circuito
tiene una entrada analgica y da a la salida una palabra digital
proporcional a la entrada analgica.
Agregando una pequea seal analgica debemos utilizar offset
porque el microcontrolador no lee seales negativas, hacemos

offset de acuerdo a la medida de voltaje pico a pico de la seal


de entrada.

You might also like