Está en la página 1de 14

Universidad Tecnológica de la Mixteca

Instituto de Electrónica y Mecatrónica


Convertidor Analógico a Digital
Grupo 804-A
Mayo 2022
Ana Marı́a Vargas Gutiérrez

1 Convertidor analógico a digital


Objetivo
Comprender e implementar el funcionamiento de un convertidor analógico a digital y además
buscar la forma de almacenar la información digital en un archivo de texto, posteriormente
analizar los datos obtenidos y comparlos con datos teóricos.

2 Desarrollo
2.1 Simulación de una ADC a base de OPAMPS
A continuación se muestran figuras de la simulación en proteus de un ADC de dos bits hecho
a base de amplificadores operacionales en la configuración de comparador.

Figura 1: ADC con un voltaje en la entrada de 0V.

El ADC mostrado es un ADC de tipo flash, son muy rápidos porque ”calcula” el valor de
todos los bits al mismo tiempo.
Para hacer la práctica experimental se utilizará:
Figura 2: ADC con un voltaje en la entrada del 35% del voltaje de referencia.

Figura 3: ADC con un voltaje en la entrada del 67% del voltaje de referencia.

Figura 4: ADC con un voltaje en la entrada del 86% del voltaje de referencia.

• 1 microcontrolador ATMEGA328P.

• 1 push-botton con su respectivo capacitor cerámico para minimizar rebotes.


• 1 LED RGB para visualizar el estado del microcontrolador.

• 1 adaptador USB-TTL para establecer una comunicación serial con una computadora.
Cabe mencionar que el ADC del microcontrolador a utilizar es de aproximaciones sucesivas,
razón por las cuales las conversiones son relativamente lentas. Para esta práctica se utilizará
un periodo de muestreo de 10ms, que es bastante lento.

El comportamiento esperado del sistema consiste en que, inicialmente el indicador estará


en color azul, cuando el botón sea presionado se tomarán 500 muestras con un periodo de
muestreo ya mencionado, mientras esto suceda el indicador cambiará de color, ahora será
verde; cuando termine de guardar las 500 muestras el indicador estará en color rojo en la
espera del caracter 0x31 que será recibido vı́a serial, una vez recibido, el indicador cambiará
momentáneamente a azul aqua e inmediatamente enviará los 500 datos a través de la USART.

Por otro lado, en un script de MATLAB se codificaron algunas lı́neas para enviar el valor
que el microcontrolador espera y para estar prepado para recibir los 500 datos que recibirá.

NOTA:
• El microcontrolador se tardará 5 segundos en almacenar las 500 muestras.
A continuación se mostrará la simulación en proteus del sistema y el script que se debe
ejecutar en MATLAB para poder almacenar los datos recibidos; el código utilizado para el
ATMEGA328P se encuentra en el anexo de este documento.

Figura 5: Simulación en proteus del sistema.

%% S c r i p t u t i l i z a d o para guardar en a r c h i v o de t e x t o

close all ;
clc ;
%b o r r a d a t o s p r e v i o s
d e l e t e ( i n s t r f i n d ( ( p o r t ) , { ’COM12’ } ) ) ;

%v u e l v e a d e c l a r a r e l p u e r t o .
p u e r t o=s e r i a l ( ’COM12’ ) ;
p u e r t o . BaudRate =9600;
fopen ( puerto ) ;

f p r i n t f ( puerto , ’% c ’ , ’ 1 ’ ) ;

b= f r e a d ( puerto , 5 0 0 , ’ uchar ’ ) ;

f i d=f o p e n ( ) ; %Se c r e a e l a r c h i v o

f o r i =1:500
m=b ( i ) ;
f p r i n t f ( f i d , ’%d , ’m) ;
end
fclose ( fid );

f c l o s e ( puerto ) ;
d e l e t e ( puerto ) ;
clear all ;

3 Resultados
Después de subir el programa en el microcontrolador se obtuvieron los siguientes resultados.

Figura 6: Estado inicial.


Figura 7: Almacenando datos.

Figura 8: Datos disponibles.

Figura 9: El envı́o de datos comenzó.

4 Análisis y discusión de resultados


Para el muestreo ideal consideramos las caracterı́sticas del ADC a analizar, que en el caso de
esta práctica es, considerar que el ADC de ATMEGA328P contiene un ADC de aproxima-
ciones sucesivas, el periodo de muestreo Ts es de 10ms, de 10 bits, pero al momento de enviar
los datos a través de la UART los datos se limitan a 8 bits, se considera también que el rango
de voltaje se encuentra entre 0 y 5V, lo que significa que un voltaje de 5V corresponde al valor
máximo del ADC, correspondiente a 255, por otra parte 0V corresponde un valor digital de 0.

En el muestreo ideal de una señal senoidal se tiene lo siguiente.


A 2π 255
f [n] = ( sin( n) + of f set)( )
2 NT 5V
o bien,

A 2π 255
f [n] = ( cos( n) + of f set)( )
2 NT 5V
donde:
A es la amplitud de la señal senoidal
T
NT es el número de muestras por periodo(NT = ), con periodo T de la señal muestreada y
Ts
periodo de muestreo Ts .

El resultado se debe redondear al valor entero superior.


Los datos reales fueron almacenados en un archivo de texto y fueron graficados con el soft-
ware MATLAB.

4.0.1 Datos numéricos


Para el caso de la señal senoidal de 1Hz, 3Vpp y offset de 1.6V, se obtuvo de forma teórica.

t e o r i c o=round ( ( 1 . 5 ∗ s i n ( ( 2 ∗ p i . ∗ n ) / 1 0 0 ) + 1 . 6 ) ∗ ( 2 5 5 / 5 ) )
teorico=[82 86 91 96 101 105 110 114 118 123
127 130 134 137 141 143 146 149 151 153
154 156 157 157 158 158 158 157 157 156
154 153 151 149 146 143 141 137 134 130
127 123 118 114 110 105 101 96 91 86
82 77 72 67 63 58 53 49 45 41
37 33 29 26 23 20 17 15 12 10
9866555668
9 10 12 15 17 20 23 26 29 33
37 41 45 49 53 58 63 67 72 77];

Y de forma experimental:
real=[81,85,90,95,99,104,109,113,118,122,126,130,133,137,143,145,148,150,152,154,
155,156,157,157,158,157,157,156,155,154,152,150,148,145,143,140,137,133,129,125,
121,117,113,108,104,99,94,90,85,80,75,70,65,61,56,52,47,43,39,35,31,27,24,21,18,
15,13,11,9,7,6,5,4,4,4,4,5,5,6,8,10,12,14,17,20,23,26,30,33,37,41,46,50,55,59,64,
68,74,78,83];

Para el caso de la señal senoidal de 2Hz, 3Vpp y offset de 1.6V, se obtuvo de forma teórica.
t e o r i c o=round ( ( 1 . 5 ∗ c o s ( ( 2 ∗ p i . ∗ n ) / 5 0 ) + 1 . 6 ) ∗ ( 2 5 5 / 5 ) )
teorico=[159 158 157 154 150 144 138 131 124 115
106 97 87 78 68 59 50 42 34 27
21 16 11 9 7 6 7 9 11 16
21 27 34 42 50 59 68 78 87 97
106 115 124 131 138 144 150 154 157 158
159 158 157 154 150 144 138 131 124 115
106 97 87 78 68 59 50 42 34 27
21 16 11 9 7 6 7 9 11 16
21 27 34 42 50 59 68 78 87 97
106 115 124 131 138 144 150 154 157 158];

real=[158,157,155,152,147,141,135,128,120,112,102,93,83,73,64,54,46,37,30,23,17,
12,8,5,4,4,5,7,10,15,21,27,34,43,52,61,70,80,90,99,109,117,125,133,139,145,150,
154,156,157,157,156,154,150,145,140,133,126,117,109,99,90,80,70,61,52,43,35,27,
21,15,10,7,5,4,4,6,8,12,17,22,29,37,46,55,64,73,83,92,102,111,120,128,135,142,147,
151,155,157,158];

Para el caso de la señal senoidal de 5Hz, 3Vpp y offset de 1.6V, se obtuvo de forma teórica.

t e o r i c o=round ( ( 1 . 5 ∗ c o s ( ( 2 ∗ p i . ∗ n ) / 2 0 ) + 1 . 6 ) ∗ ( 2 5 5 / 5 ) )
teorico=[158 154 143 127 105 82 58 37 20 9 5 9 20 37 58 82 105
127 143 154 158 154 143 127 105 82 58 37 20 9 5 9 20 37
58 82 105 127 143 154 158 154 143 127 105 82 58 37 20 9 5
9 20 37 58 82 105 127 143 154 158 154 143 127 105 82 58 37
20 9 5 9 20 37 58 82 105 127 143 154 158 154 143 127 105
82 58 37 20 9 5 9 20 37 58 82 105 127 143 154];

real=[157,155,145,129,108,84,61,38,20,9,4,7,17,34,55,78,103,124,142,153,158,
154,143,127,105,81,57,35,18,8,4,8,19,36,58,82,106,127,144,154,158,
153,141,124,102,78,54,33,17,7,4,9,21,39,61,85,109,130,146,155,158,
152,140,121,99,75,51,30,15,6,4,10,23,42,64,88,112,132,147,156,157,
151,137,118,96,71,48,28,13,5,5,11,25,45,67,92,115,134,149,157];

4.0.2 Gráficas
En las figuras siguientes se muestran las gráficas de los datos correspondientes para el caso
de tres señales senoidales, con la misma amplitud, pero distinta frecuencia. Para cada señal
diferente corresponden 3 figuras, la descripción se encuentra en el pie de página de cada una.
Señal senoidal de 1Hz de frecuencia.

Figura 10: Señales de 1Hz.

Figura 11: Señal de salida del generador de funciones con frecuencia de 1Hz.
Figura 12: Error entre la cuantización y teórica y real para 1Hz.

Señal senoidal de 2Hz de frecuencia.

Figura 13: Señales de 2Hz.


Figura 14: Señal de salida del generador de funciones con frecuencia de 2Hz.

Figura 15: Error entre la cuantización y teórica y real para 2Hz.


Señal senoidal de 5Hz de frecuencia.

Figura 16: Señales de 5Hz.

Figura 17: Señal de salida del generador de funciones con frecuencia de 5Hz.
Figura 18: Error entre la cuantización y teórica y real para 5Hz.

5 Conclusiones
Se puede concluir que los convertidores ADC son muy útiles, pues permiten tomar valores
puntuales de una señal analógica, también puedo decir que existen distintos tipos de ADC,
en esta práctica sólo se mencionan dos, aunque no digo detalles de cada uno de ellos.

Al comparar la respuesta real contra la respuesta teórica se puede notar que el margen de
error es aceptable.

Bibliografı́a
@Book1, Felipe Santiago Espinosa,El microcontrolador ATMEGA328P de Microchip: Pro-
gramación en Ensamblador, Lenguaje C y un enlace con Arduino,Universidad Tecnológica de
la Mixteca,2021.

6 Anexo
...\604-A\804-A\ComunicacionesDigitales\ADC_CD\ADC_CD\main.c 1
/*Almacena datos y los envia a través de la USART
*/

#define F_CPU 1000000UL


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

uint16_t analogin=0;
uint8_t aux=0;
uint16_t ndatos=0, i;

uint8_t datos[500]; //Arreglo con 500 espacios

void enviaDatos();

ISR(ADC_vect){ //Fin de conversión


analogin=ADCW; //Se lee el valor digital de la señal analógica
aux=(analogin*0.249);
if(ndatos<=499) {
datos[ndatos]=aux;
ndatos++;
}
else{
TCCR1B=0x00; //sin clk
ndatos=0;
PORTB=0x04; //Info lista
}
}

ISR(USART_RX_vect){ //ISR de recepción serial


if(UDR0==0x31){
PORTB=0x03;
enviaDatos();
}
}

ISR(TIMER1_COMPA_vect){ //Interrupción provocada por el temporizador 1 cada 10ms


ADCSRA|=1<<ADSC; //Inicia una nueva conversión
}

ISR(INT0_vect){ //PD2 presionado (Inicio de la captura)


TCCR1B=0x09; //CLK sin preescala
TCNT1=0; //Reinicia al temporizador1
PORTB=0x02;
}

int main(void)
{
DDRB=0xFF; //Puerto B como salida
DDRC=0x00; //PC0 entrada del ADC
DDRD=0x02; //PD0 y PD2 entrada, PD1 salida
...\604-A\804-A\ComunicacionesDigitales\ADC_CD\ADC_CD\main.c 2
PORTD=0x04; //Pull-up para INT0;
EICRA=0x02; //INT0 por flanco de bajada
EIMSK=0x01; //Habilita INT0

//CONFIGURACIÓN DEL ADC


ADMUX=0x00; //Voltaje de referencia en AREF, selecciona ADC0
ADCSRA=0xEB; //ADC con interrupcion, factor de división 8
ADCSRB=0x03;//Inicio de conversión por coincidencia por comparación con temp1
DIDR0=0x01; //Deshabilita el buffer digital en ADC0D

//CONFIGURACIÓN DEL TEMPORIZADOR 1


OCR1A=10000; //10ms
TCCR1A=0x00;
TCCR1B=0x00; //sin CLK
TCCR1C=0x00;
TIMSK1=0x02; //Habilita la interrupción por comparación con OCIE

//CONFIGURACIÓN DEL MÓDULO USART


UBRR0=12; //9600 bps
UCSR0A=0x02; //Asíncrono a doble velocidad
UCSR0B=0x98; //Habilita tx, rx e interrupción al recibir datos
UCSR0C=0x06; //Datos de 8 bits, sin paridad, 1 bit de paro.

PORTB=0x01; //Un led encendido, estado inicial

sei();
while (1)
{
asm("NOP");
}
}

void enviaDatos(){
for(i=0; i<500; i++){
while(!(UCSR0A&1<<UDRE0)); //Espera buffer vacío
UDR0=datos[i];
_delay_us(5);
}
PORTB=0x01;//Vuelve al estado inicial
}

También podría gustarte