Computing">
Nothing Special   »   [go: up one dir, main page]

Trabajo Práctico N°16 - Técnicas Digitales

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 16

TECNICAS DIGITALES I

Trabajo Práctico Nº 16
Integrantes: Gareis, Matías Alejadro - Orcellet, Rodrigo Gastón
Fecha de Presentación: Observaciones:
Calificación: Visado:
Res. Práctica: Ing. Gustavo Maggiolo / Ing. Rubén Britos
Objetivos:
Que el alumno conozca y use un tipo de conversor.
Que el alumno integre conocimientos de la materia para la resolución de un problema común.
Aporta a competencia: Utilizar de manera efectiva las técnicas y herramientas de la
ingeniería. Desempeñarse de manera efectiva en equipos de trabajo. Comunicarse con
efectividad. Aprender en forma continua y autónoma.
Requisitos: Haber asistido a la clase teórica de conversor digital/analógico.
Haber realizado la totalidad de los prácticos anteriores.
Elementos a Utilizar: Resistores. Arduino. Contador. Generador de clock. Memoria de
almacenamiento permanente (EPROM, EEPROM o FLASH).

TEMA: Conversor Digital/Analógico

Actividad I: Generación de formas de onda

1. Implemente un conversor digital – analógico (DAC) de 8 bits utilizando una escalera R2R.
2. Conecte a su entrada la salida de la plataforma Arduino, donde se deberá implementar,
sobre un puerto de 8 bits:
a. Un contador binario.
b. Dos señales a elección.
Se deberá disponer de 2 pulsadores para seleccionar cada una de las señales generadas.

Actividad II: Síntesis digital directa

3. Esta actividad tiene el objetivo de construir un generador de señales básico, utilizando


síntesis digital directa (DDS) y conversión digital-analógica.
En una memoria se deberá guardar un ciclo de una señal cualquiera (senoidal, triangular,
diente de sierra, seno complementario, exponencial, etc.) que luego será reproducida a
través de un DAC y visualizada en un osciloscopio.

La implementación deberá seguir las siguientes reglas o condiciones:


 Deberá generar 4 señales diferentes, dos de las cuales deberán ser: una sinusoidal y
una triangular.
 El ciclo almacenado deberá tener un mínimo de 512 puntos.
 Debe funcionar de forma independiente de cualquier otro dispositivo (PC, Generador de
señales, etc.).
 Genere la señal de reloj con la plataforma Arduino o utilicelo para implementar el
contador que recorre la memoria.

Nota 1: para el conversor analógico – digital, utilizar un solo valor de resistencia.

Nota 2: se recomienda que para la presentación de cada uno de los trabajos prácticos el grupo
traiga su propia fuente de alimentación.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales I
Actividad I: Generación de formas de onda

DAC de 8 bits con escalera R2R


Circuito básico de un DAC de 8 bits utilizando una escalera R2R

Las tensiones V7 a V0 son las entradas digitales, siendo la V7 la menos significativa.


RF y Rx se calculan utilizando las siguientes expresiones:
𝐴∗𝑅
𝑅𝐹 =
1
1− 𝑁
2
Siendo A la ganancia y N el numero de bits del DAC.
𝑅 ∗ 𝑅𝐹
𝑅𝑥 =
𝑅 − 𝑅𝐹
Si el resultado de Rx es positivo la resistencia se coloca del pin no inversor a tierra. Si el
resultado es negativo la resistencia se coloca del pin inversor a tierra y si el resultado es
indeterminado (infinito) no se debe colocar la resistencia Rx.
La tensión V+ del amplificador debe ser al menos 1,5[V] mayor a la tensión de las entradas
digitales.
Implementación
Para nuestra implementación la ganancia será unitaria y fijaremos R=1[kΩ]. Sabiendo esto
podemos calcular RF y Rx, obteniendo 1[kΩ] y 256[kΩ] respectivamente.
La tensión de las entradas digitales es 5[V] por lo que V+=6,5[V].
A continuación, se muestra el circuito ya con el Arduino conectado.
El pin digital 0 del Arduino será nuestro bit menos significativo en el contador por lo que se
conecta a la entrada menos significativa del DAC.
A su vez el Arduino tiene dos switch conectados a los pines digitales 8 y 9 a los fines de poder
elegir que secuencia saldrá por los pines del 0 al 7. Las secuencias se eligen según la
siguiente tabla:

Pines Secuencia
9 8
0 0 Ninguna
0 1 Contador binario ascendente
1 0 Contador Jhonson descendente
1 1 Contador de anillo descendente

Código Arduino
unsigned char johnson[]={0b00000000,0b00000001,0b00000011,0b00000111,
0b00001111,0b00011111,0b00111111,0b01111111,0b11111111,0b11111110,0b111111
00,0b11111000,0b11110000,0b11100000,0b11000000,0b10000000};
unsigned char anillo[]={0b00000001,0b00000010,0b00000100,0b00001000,
0b00010000,0b00100000,0b01000000,0b10000000};
unsigned char contador=0;
int i=1,j=1;
void setup() {
DDRD=255; //Inicializamos los pines del 0 al 7 como salidas
pinMode(8,INPUT);
pinMode(9,INPUT);
}

void loop() {

while(digitalRead(8)&&!(digitalRead(9))) //Contador binario


{
PORTD=contador; //PORTD coloca en LOW o HIGH las salidas del 0 al 7
según el número que se le asigna. Ejemplo si
contador=255 (11111111 en binario) todas las
salidas del 0 al 7 estarán en HIGH. El pin 0
corresponde al bit menos significativo
contador++;
}

while(!(digitalRead(8))&&digitalRead(9)) //Contador Jonhson


{
PORTD=johnson[i-1];
i=(i%16)+1; //Se reinicia la cuenta cuando i=16;
}

while(digitalRead(8)&&digitalRead(9)) //Contador de anillo


{
PORTD=anillo[j-1];
j=(j%8)+1; //Se reinicia la cuenta cuando j=8;
}

j=1;
i=1;
contador=0;
PORTD=0;
}
Salidas

Cuando la secuencia que entra al DAC es el contador binario la salida de este es una señal
diente de sierra.

Si la secuencia es el contador Jonhson a la salida podemos observar lo siguiente:


Por último, si la secuencia que ingresa al DAC es el contador de anillo, la salida es la
siguiente:

Con esta secuencia podemos observar claramente la predominancia de cada una de las
entradas de la escalera R2R.

Implementación y video:

La implementación y video correspondiente a esta primera parte se puede ver a través del
siguiente enlace: https://youtu.be/O_7G3_mhPUU
Actividad II: Síntesis digital directa

Síntesis digital directa (DDS)


En primer lugar daremos una definición general de la síntesis digital directa y luego
explicaremos de qué forma la utilizaremos nosotros para realizar las señales solicitadas.
Según Wikipedia, la síntesis digital directa (DDS) es un método empleado por sintetizadores
de frecuencia utilizado para crear formas de onda arbitrarias a partir de un único reloj de
referencia de frecuencia fija. DDS se utiliza en aplicaciones tales como generación de señal,
osciladores locales en sistemas de comunicación, generadores de funciones, mezcladores,
moduladores, sintetizadores de sonido, entre otras aplicaciones.
El método consiste en digitalizar una señal analógica, es decir, discretizar a esta última tal
como se muestra a continuación.

Luego los valores de cada uno de estos puntos, representados en binario, serán las entradas
de un conversor digital analógico (DAC). En nuestro caso utilizaremos un DAC realizado con
una escalera R-2R.
La resolución o calidad de la señal vendrá dada, principalmente, por dos factores:
1- Cantidad de puntos de muestreo: al momento de discretizar la señal en un periodo,
dividiremos a este en una cantidad X de intervalos. Mientras mayor sea X, mayor será
la calidad de nuestra señal a la salida del DAC.

2- Cantidad de bits que utilizaremos en el DAC: esto hace referencia a la cantidad de


valores que puede tomar nuestra señal digitalizada. Con la siguiente imagen se puede
entender mejor este punto:
En nuestro caso, tal como lo pide la consigna, utilizaremos 512 puntos de muestreo y por
elección nuestra utilizaremos un DAC de 8 bits, permitiendo que la señal pueda tomar 256
valores distintos.

Realizaremos cuatro señales distintas, las cuales serán:


1- Señal triangular
2- Señal sinusoidal
3- Señal diente de sierra
4- Señal monomio de grado 5

Señal triangular:

Señal triangular
300
250
200
150
100
50
0
1 2 3 4 5 6 7

Si tomamos un periodo de esta señal podemos ver que el flanco ascendente y el flanco
descendente son simétricos. Debido a esta característica sólo discretizaremos el flanco
ascendente (medio periodo), tomando 256 puntos de muestreo. Luego, grabaremos estos
256 puntos en la memoria y por medio del arduino realizaremos un programa que nos permita
recorrer en forma ascendente los primeros 256 valores de la memoria y al llegar a este último
los vuelva a leer de regreso, es decir, en forma descendente. De esta forma ahorramos
memoria, ya que el periodo completo va a estar compuesto de 512 puntos pero sólo grabamos
256 valores.
Para discretizar la rampa ascendente, tomaremos la función f(x) = x. Y ahora evaluamos la
función en valores enteros de x que van desde 0 hasta 255. Como salida de la función
tendremos valores que irán desde 0 hasta 255 o lo que es lo mismo en binario desde
00000000 a 11111111. Grabaremos estos valores en los primeros 256 registros de la
memoria.
Como se mencionó la idea es generar por medio del arduino una secuencia que sea capaz
de recorrer de forma ascendente los primeros 256 registros de la memoria y al llegar a este
último regresar, recorriendo estos registros de forma descendente. De esta forma, logramos
completar un periodo de la señal triangular, luego este proceso se volvería a repetir.
A continuación se presenta el código de arduino utilizado:

unsigned char contador=0;


bool bandera=false;
void setup()
{
DDRD=255; v
}
void loop()
{
PORTD=contador; //PORTD coloca en LOW o HIGH las
salidas del 0 al 7 según el número que
se le asigna. Ejemplo si contador=255
(11111111 en binario) todas las salidas
del 0 al 7 estarán en HIGH. El pin 0
corresponde al bit menos significativo.

delay(1);
if(bandera){
contador --;
}
else{
contador ++;
}
if(contador==255){
bandera=true;
}
else if(contador==0){
bandera=false;
}
}

El comportamiento que se planteó anteriormente se puede ver reflejado en el código por


medio del uso de los condicionales y de la bandera. Esta última, al variar su valor nos da
aviso de que llegamos a uno de los extremos y debemos cambiar el sentido en el que se
recorre la memoria.
A continuación se muestra la implementación en Proteus:
Observando el circuito, podríamos decir que la parte del arduino y de la memoria se
corresponder con la etapa de la síntesis digital directa (DDS) y la escalera R-2R con el
amplificador operacional cumple la función del conversor digital analógico (DAC). Al simular
podemos observar en el osciloscopio la siguiente señal:

Como se puede observar es claramente lo que estábamos buscando.


Señal sinusoidal:

La señal sinusoidal que vamos a discretizar y posteriormente digitalizar es la siguiente:


255
𝑥 (𝑡 ) = ∙ [𝑠𝑒𝑛(𝑡) + 1]
2
Esta es una señal sinusoidal cuya imagen varía entre 0 y 255, que es justamente el rango de
valores que nosotros utilizamos al digitalizar la señal. Si tomamos el periodo que está
comprendido entre π/2 y 5π/2 podemos notar que se presenta una situación muy similar a la
de la señal anterior. El semiperiodo [π/2; 3π/2] es simétrico con el periodo [3π/2; 5π/2]. Por
este motivo, vamos a digitalizar el primer semiperiodo, posteriormente grabaremos los valores
en la memoria y los leeremos de la misma forma que en el anterior apartado.
Es decir, grabaremos en las primeras 256 direcciones de la memoria los 256 valores
correspondientes al primer semiperiodo y luego leeremos la memoria en forma ascendente y
al llegar al último registro leeremos en forma descendente hasta completar así el periodo. Tal
como se mencionó anteriormente, esto nos permite ahorrar memoria ya que el periodo
completo va a estar compuesto de 512 puntos pero sólo grabamos 256 valores.
Para obtener los valores que se van a grabar en la memoria debemos dividir el semiperiodo
en 256 partes, es decir:
3𝜋 𝜋
( 2 − 2) 𝜋
∆𝑡 = =
256 256
Como nuestro periodo completo estará compuesto por 512 puntos, el semiperiodo entrará
compuesto por 256 puntos. Entonces evaluaremos la función x(t), para los siguientes valores
de t:

𝜋
𝑡 = 𝑛 ∙ ∆𝑡 + Con 𝑛 entero, que va desde 0 hasta 255
2

Al evaluar la función en todos estos valores de t, por lo general, obtendremos valores


fraccionarios por lo que deberemos redondear al entero más cercano para luego convertirlo
a binario de 8 bits y poder grabarlo en la memoria. Todos estos cálculos fueron realizados en
una plantilla de Excel que se adjunta al informe.
El circuito y el código de arduino es el mismo que el de la señal triangular, la única diferencia
entre ambos son los valores que almacena la memoria.
Al simular podemos observar en el osciloscopio la siguiente señal:

Como se puede observar es la señal que estábamos buscando.

Señal diente de sierra:

Diente de sierra
300
250
200
150
100
50
0
0 200 400 600 800 1000 1200 1400 1600 1800

La señal diente de sierra que vamos a utilizar es una cuyo periodo va desde 0 hasta 511 (un
total de 512 valores) y la imagen de esta señal va desde 0 hasta 255 (256 valores).
Matemáticamente podemos expresar un periodo de la siguiente forma:

255
𝑥(𝑡) = ∙𝑡 Con 𝑡, que va desde 0 hasta 511
511
Para digitalizar esta señal vamos a evaluar a x(t) en todos valores enteros de t que van desde
0 hasta 511 inclusive. De esta forma obtendremos 512 puntos. A los valores de cada uno de
estos puntos los redondearemos al entero más cercano para luego convertirlos a binario y
poder grabarlos en la memoria. Todos estos cálculos fueron realizados en una plantilla de
Excel que se adjunta al informe.
A diferencia con los apartados anteriores, en este caso, la secuencia generada con el arduino
deberá recorres los primeros 512 registros de la memoria para así completar un periodo de
la señal. El código se presenta a continuación:

unsigned char contador=0;

bool estado=false;

void setup()

DDRD=255; //Inicializamos los pines del 0 al 7 como salidas

pinMode(8,OUTPUT);

void loop()

{
PORTD=contador; //PORTD coloca en LOW o HIGH las
salidas del 0 al 7 según el número que
se le asigna. Ejemplo si contador=255
(11111111 en binario) todas las salidas
del 0 al 7 estarán en HIGH. El pin 0
corresponde al bit menos significativo.

delay(1);

if(contador==255){ //Como la función PORTD sólo nos


permite contar desde 0 hasta 255, y
estado=!estado;
nosotros necesitamos que el conteo sea
digitalWrite(8,estado); desde 0 hasta 511 debemos agregar una
sentencia que cuando el contador
contador=0; implementado con PORTD llegue a 255 lo
reinicie y además nos cambie de estado
delay(1); el bit número 9

contador++;

A continuación se muestra la implementación del circuito realizada en Proteus.


Observando el circuito, podríamos decir que la parte del arduino y de la memoria se
corresponder con la etapa de la síntesis digital directa (DDS) y la escalera R-2R con el
amplificador operacional cumple la función del conversor digital analógico (DAC). Al simular
podemos observar en el osciloscopio la siguiente señal:

Como se puede observar es la señal que estábamos buscando.


Señal monomio de grado 5:

La señal que nosotros decidimos digitalizar es la correspondiente a la función x(t)=t 5


acotándola entre t=-2 y t=2. Este intervalo se va a corresponder con el periodo de la señal a
implementar.
Ahora deberemos adaptar esta señal a una que nos facilite la tarea de discretizacion y
digitalización de la misma. En primer lugar dividiremos el intervalo [-2, 2] en 512 puntos, que
estarán separados una distancia ∆t:
2 − (−2) 4 1
∆𝑡 = = =
512 512 128
Entonces podemos decir que la variable t, será:

𝑡 = 𝑛 ∙ ∆𝑡 − 2 Con 𝑛 entero, que va desde 0 hasta 511

Por lo que la señal será:


𝑛 5
𝑥 (𝑡 ) = 𝑡 5 = [ − 2]
128
Con esto logramos poder evaluar la señal de interés en 512 valores enteros, que en este caso
van desde n=0 hasta n=511. Estos valores de n se corresponden con la dirección de memoria
donde se guardan los puntos de la función.

Con n entre 0 y 511, la imagen de esta función varía desde -32 hasta 32. Esto no es
conveniente al momento de digitalizar los puntos, por lo tanto, haremos ciertas modificaciones
para que la imagen de la función varié desde 0 hasta 255.

Ahora la función, pasa a ser dependiente de la variable n. Si adicionamos 25=32 a nuestra


función, obtendremos que esta varié desde 0 hasta 64:
𝑛 5
𝑥 (𝑛 ) = [ − 2] + 32
128
Ahora, multiplicando por un factor de escalamiento logramos que la función varié desde 0
hasta 255.

𝑛 5 255
𝑥 (𝑛 ) = [ [ − 2] + 32 ] ∙
128 64
Ahora evaluamos está función con n desde 0 hasta 511, redondeamos al entero más cercano
y convertimos en binario para luego grabar estos valores en la memoria. Todos estos cálculos
fueron realizados en una plantilla de Excel que se adjunta al informe.
El circuito y el código de arduino es el mismo que el de la señal diente de sierra, la única
diferencia entre ambos son los valores que almacena la memoria.

Al simular podemos observar en el osciloscopio la siguiente señal:

Como se puede observar es la señal que estábamos buscando.

Implementación y video:

La implementación y video correspondiente a esta segunda parte se puede ver a través del
siguiente enlace: https://youtu.be/d4WCatxi59Y

También podría gustarte