Computing">
Trabajo Práctico N°16 - Técnicas Digitales
Trabajo Práctico N°16 - Técnicas Digitales
Trabajo Práctico N°16 - Técnicas Digitales
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).
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.
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
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() {
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.
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
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.
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:
delay(1);
if(bandera){
contador --;
}
else{
contador ++;
}
if(contador==255){
bandera=true;
}
else if(contador==0){
bandera=false;
}
}
𝜋
𝑡 = 𝑛 ∙ ∆𝑡 + Con 𝑛 entero, que va desde 0 hasta 255
2
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:
bool estado=false;
void setup()
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);
contador++;
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.
𝑛 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.
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