Sei sulla pagina 1di 13

2017

PROCESAMIENTO
DIGITAL DE SEALES

ANALIZADOR DE ESPECTROS
INTEGRANTES:
EDGAR MACAS
ALEXIS ORMAZA
ALEX ZURITA
ESCUELA POLITECNICA NACIONAL
ENUNCIADO
A) Generar una seal compuesta por 3 tonos puros de 100,200 y 300 Hz puede
hacerlo mediante el puerto de audio.
B) En Hardware realizar :
Adquirir la seal mediante un Pin A/D
Mostrar la seal en una LCD
Disear e implementar un filtro de modo que solo pase el tono de 100
Hz.
Verificar mediante anlisis espectral de modo que se muestre en la LCD
el espectro de Potencias.
Repita lo mismo para los otros dos tonos.

MATERIALES
ARDUINO MEGA 2560
Arduino es una marca de microcontroladores mundialmente conocida por los amantes
de la electrnica, la programacin y la robtica. El Arduino Mega 2560 es una placa con
un microcontrolador Atmega2560.
Cuenta con 54 pines entradas/salidas digitales (de los cuales 14 se pueden utilizar como
salidas PWM) y 16 entradas analgicas, 4 UARTs (puertos de hardware de serie), un
oscilador de cristal de 16 MHz, un puerto USB de conexin, un conector de alimentacin,
una cabecera de ICSP, y un botn de reinicio
Contiene todo lo necesario para apoyar al microprocesador, slo tiene que conectarlo a
un ordenador con un cable USB, o con un alimentador adaptador AC-DC o una batera
para comenzar.

GLCD
Los LCDs grficos (GLCD por sus siglas en ingls) son pantallas de cristal lquido cuya
resolucin es medida en pixeles. A diferencia de los LCDs de texto, en los GLCDs, se
puede tener acceso a cada pixel disponible, potenciando con ello las posibilidades de
presentacin y manejo de informacin.
TABLA 1.
Caractersticas tcnicas del GLCD TS-12864A-2

FEATURES

Module: graphic LCD arranged as


128 x 64 dots with LED Back-
light*(Yellow/Green)

Glass Type: STN

Viewing Direction : 6 clock (bottom


view)

Display color: Green

Background color: Yellow

Polarizer mode: Positive,


Reflective/Transflective

Driving Method: 1/64Duty Cycle, 1/9


Bias

Glass to PCB: ZEBRA CONNECTOR

Dot Size : 0.48x 0.48 mm

Dot Pitch : 0.52 x 0.52 mm

El GLCD tiene pines de control y de datos. Los de control son: CS1, CS2, DI, RW, E y
Reset. Los de datos son del DB0 al DB7. Este GLCD se divide en 2 zonas de 64 * 64
pixeles. Con los pines de seleccin CS1 y CS2 seleccionamos que zona queremos usar.
Con los pines DI y RW nos sirven para controlar el display y decirle si queremos leer o
escribir datos desde o hacia el display, ejecutar alguna instruccin o leer el status del
GLCD.
El pin E (enable) sirve como forma de decirle al display que lea los otros pines de control
y ejecute lo que se le indica por medio de estos y el pin de Reset, pues ya se han de
imaginar para que sirve. Con los pines de datos se va poder enviar o recibir datos del
display y leer el status del chip de control del display.
DISTRIBUCION DE PINES

CS1, CS2: Pines de control.


DI, RW: Escribir sobre el display.
E: Emite mensajes.
Reset.
DB0 al DB7: Pines de datos
Vss: Ground.
Vcc: Fuente de alimentacin.
Vo: Regula el contraste de la pantalla.
Vout: Manejo del brillo.
LEDA-BLA: Conectado a Vcc.
LEDK-BLK: Conectado a Ground.

AMPLIFICADOR OPERACIONAL LM358

Configuracin en sumador, donde podemos sumar varias seales en la entrada para mandar la
seal en el arduino.

Datasheet LM358
CIRCUITO SUMADOR

5+

100 HZ
R2
10k U1:A
200 HZ

8
R3 3
10k 1
A
300 HZ 2
R4 B

4
10k R1 LM358 C

10k D

R5
10k

SIMULACION

Observacin: se necesita un voltaje DC para poder visualizar completamente la imagen de la


seal y no salga recortada.

COMPROBACION CON MATLAB

Programacin

Se realiza la seal compuesta por 3 tonos


clc
clear all
close all
Fs = 44100;
f1=100;
duracion_segundos=60;
t = 0:1/Fs:duracion_segundos;
x = sin(2*pi*t*100)+sin(2*pi*t*200)+sin(2*pi*t*300);
plot(t,x)
sound(x,Fs)
Observacin: No se utiliz la seal generada por el Puerto de audio de la computadora ya que
posee un nivel de potencia muy bajo.

CIRCUITO IMPLEMENTADO

Para el circuito implementado se tuvo que realizar ciertos cambios al circuito pensado
originalmente, ya que se conto con ciertas limitaciones, como son:

Al tener limitaciones con el puerto de audio de la computadora, se procedio a utilizar


osciloscopios de los cuales solo poseiamos a disposicion dos, por lo cual en la tercera
seal procedimos a implementar una seal continua, la cual la utilizamos como seal
de offset para poder tener todas las seales en la parte positiva y poder graficarlas de
manera completa y no recortadas ya que como sabemos el arduino no reconoce
valores negativos.
Para la alimentacion del arduino lo utilizamos con el cable de computadora ya que al
no tener muchos elementos dicha alimentacion es suficiente para los mismos, por lo
que no utilizamos la fuente propio del arduino, la cual se debe tener en cuenta al
momento de ampliar el proyecto.
R2(1)
R1(1)

10k
10k

R2
R1

1k
RV1
Seales de entrada

10k
R5
2
3
U1:A(V+)

4 8
1

10k
R4
LM358
U1:A

entrada seal analogica


RESET
AREF
13
PB7/OC0A/OC1C/PCINT7
12
PB6/OC1B/PCINT6
11
A0 PB5/OC1A/PCINT5
PF0/ADC0 10
A1 PB4/OC2A/PCINT4
PF1/ADC1 9
A2 PH6/OC2B
PF2/ADC2 8
A3 PH5/OC4C
PF3/ADC3
A7
PF7/ADC7/TDI 7
PWM
ARD1(PE3/OC3A/AIN1)

A6 PH4/OC4B
pin de decision

PF6/ADC6/TDO 6
A5 PH3/OC4A
PF5/ADC5/TMS 5
A4 PE3/OC3A/AIN1
PF4/ADC4/TCK 4
PG5/OC0B
3
A8 PE5/OC3C/INT5
ATMEGA1280

PK0/ADC8/PCINT16 2

ANALOG IN
A9 PE4/OC3B/INT4
PK1/ADC9/PCINT17 1
A10 TX PE1/TXD0/PDO
PK2/ADC10/PCINT18 0
A11 RX PE0/RXD0/PCINT8
PK3/ADC11/PCINT19
A12
PK4/ADC12/PCINT20 14
A13 TX3 PJ1/TXD3/PCINT10
PK5/ADC13/PCINT21 15
A14 RX3 PJ0/RXD3/PCINT9
PK6/ADC14/PCINT22 16
A15 TX2 PH1/TXD2
PK7/ADC15/PCINT23 17
RX2 PH0/RXD2
18
TX1 PD3/TXD1/INT3
19
RX1 PD2/RXD1/INT2
COMUNICATION

20
SDA PD1/SDA/INT1
21
SCL PD0/SCL/INT0
DIGITAL

PL3/OC5A
PL4/OC5B
PG2/ALE

PB0/SS/PCINT0
PB1/SCK/PCINT1
PB2/MOSI/PCINT2
PB3/MISO/PCINT3
PL0/ICP4
PL1/ICP5
PL2/T5
PD7/T0
PC0/A8
PC1/A9
PC2/A10
PC3/A11
PC4/A12
PC5/A13
PC6/A14
PC7/A15
PA7/AD7
PA6/AD6
PA5/AD5
PA4/AD4
PA3/AD3
PA2/AD2
PA1/AD1
PA0/AD0

PL6
PL7

PL5/OC5C
PG0/WR
PG1/RD

53
52
51
50
49
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
ARD1

ARDUINO MEGA1280
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1

E
DI
V0

R/W

DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
CS2
CS1

RST
VCC
GND

-Vout
LCD1

LGM12641BS1R

Conexiones con la glcd


CODIGO PARA MOSTRAR LA SEAL

OSCILOSCOPIO

#include <openGLCD.h>// librera necesaria para utilizar la pantalla glcd


int x=1; // valor inicial del eje de la x para graficar el primer punto
int y=0; // valor inicial del eje de la y para graficar el primer punto
int adc0; // pin utilizado para el ingreso de la seal analgica

void setup()
{
GLCD.Init();// Inicializacin de la pantalla GLCD

// Select the font for the default text area


GLCD.SelectFont(System5x7); //librera obligatoria , la cual define el tipo de fuente a utilizar
que para nuestro caso se utiliza una fuente del sistema, la cual utiliza 7 pixeles de alto y menos
de 500 bytes
GLCD.DrawLine(0,0, 0,63, PIXEL_ON);//GRAFICA
LINEA EJE Y, la cual tiene los elementos de
acuerdo a como se muestra la grfica.
GLCD.DrawLine(0,63, 128,63, PIXEL_ON);
//GRAFICA LINEA EJE X, la cual tiene los
elementos de acuerdo a como se muestra la
grfica.
//PIXEL_ON especifica que los puntos antes
mencionados debe estar prendidos, siendo cada
uno de ellos elementos de la matriz de leds.

void loop()
{

adc0=analogRead(A0);// adquirimos la seal analgica en el Pin A0, el cual hace una


conversion de 8 bits
y=adc0/20;// Se divide el valor obtenido para un valor de 20 ya que las medidas que se
obtienen son gran valor y no entraran en la escala del lcd, PARA QUE ENTREN EN LA
PANTALLAN 64PIXELES
y=64-y;//INVERTIMOS LA PANTALLA Y SE OBTIENEN UNA MEJOR VISION DE LA SEAL YA QUE
COMO SE MOSTRO EN LA FIGURA LA PANTALLA MOSTRARIA UNA PANTALLA INVERTIDA
GLCD.SetDot(x,y, PIXEL_ON);// SE GRAFICA CADA PUNTO EN XY OBTENIDA ANTERIORMENTE
x=x+1;//INCREMENTO EL TIEMPO COMO UN CONTADOR
if(x>127){ // Se pone una condicin hasta el valor mximo de la muestras que se pueden
tomar de acuerdo a la pantalla, en este caso 128PIXELES
delay(500);// Incluimos un retardo de 500 milisegundos para poder apreciar la seal
obtenida
GLCD.ClearScreen();// Limpiamos la Pantalla
x=1;// inicializamos la variable x para poder barrer el eje x
GLCD.DrawLine(0,0, 0,63, PIXEL_ON);//GRAFICA LINEA EJE Y
GLCD.DrawLine(0,63, 128,63, PIXEL_ON);//GRAFICA LINEA EJE X
}
}
CODIGO PARA LA IMPLENTACION
FILTRO Y ESPECTRO DE POTENCIAS

#include "fix_fft.h" // Librera necesaria para la implementacin de la transformada rpida de


fourier
char im[128], data[128], lastpass[64];
// im[128] datos imaginarios para la fft ajustados a los 128 de la pantalla
//data[128]datos reales para la fft ajustados a los 128 de la pantalla
// lastpass[64] array para almacenar datos

char x=32, ylim=90;// limites de la pantalla donde graficara el espectro de frecuencias y


componentes despues del filtro
int i=0,val; // Inicializacin de las variables para contadores utilizados posteriormente
#include <openGLCD.h> // librera necesaria para utilizar la pantalla glcd
#include <Filters.h> // Librera necesaria para utilizar los filtros

float fc=1000;//frecuencia de
corte

float filterFrequencyl = fc+10;


//FC DEL LIMITE SUPERIOR
float filterFrequencyh = fc-10;
//FC DEL LIMITE INTERIOR

// create a one pole (RC)


lowpass filter
FilterOnePole lowpassFilter(
LOWPASS, filterFrequencyl ); //
CREACION DEL FILTRO PASA
BAJO
FilterOnePole highpassFilter( HIGHPASS, filterFrequencyh ); // CREACION DEL FILTRO PASA
ALTO

void setup()
{
pinMode(5,INPUT);// DECLARACION DE UN PIN DE ENTRADA PARA UTILIZARLO COMO
SELECCION ENTRE EL ESPECTRO DE POTENCIAS Y LAS COMPONENTES DESPUES DEL FILTRO
GLCD.Init(); // Inicializacin de la pantalla GLCD
GLCD.SelectFont(System5x7); //librera obligatoria , la cual define el tipo de fuente a utilizar
que para nuestro caso se utiliza una fuente del sistema, la cual utiliza 7 pixeles de alto y menos
de 500 bytes
// para el proyecto se utilizo la fuente del sistema , pudiendo utilizarse una fuente Arial 14
pero cual utilizara 1200 bytes de la memoria , cambiando el parmetro
GLCD.SelectFont(System12x7)
for (int z=0; z<64; z++) {lastpass[z]=0;}; // Creacion del array de ceros para la ftt, fill the
lastpass[] array with dummy dataGLCD.SelectFont(System5x7)
};
void loop()
{
if(digitalRead(5)==LOW){// ENTRADA DEL SWITCH SI PIN5 =0, ENTONCES GRAFICO EL
ESPECTRO DE POTENCIAS
for (i=0; i < 128; i++){ //ARRAY DE VALORES REALES E IMAGINARIOS 128 MUESTRAS
val = analogRead(0); // Adquirimos la seal analgica en el Pin A0, el cual hace una
conversion de 8 bits
data[i] = val/4-64; // Se divide el valor obtenido para un valor de 4 ya que las medidas
que se obtienen son gran valor y no entraran en la escala del lcd y se invierte la pantalla
im[i] = 0; // ya que la seal no posee componentes imaginarios se les da un valor de
cero
};

fix_fft(data,im,7,0);

GLCD.ClearScreen();// Limpiamos la
pantalla de cualquier basura
GLCD.print(" ANALISIS ESPECTRAL"); //
Se escribe un texto fijo dentro de la
pantalla
GLCD.CursorTo(0,1);GLCD.print(" 100");
// se nombra la primera frecuencia que
puede ser mostrada

GLCD.CursorTo(14,1);GLCD.print("4300");
// se nombra la ltima frecuencia que
puede ser mostrada

int aux=0; //inicializamos una variable utilizado mas adelante


for (i=1; i< 64;i++){ //inicializacin del for para la adquisicin de datos
data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); //valor absoluto de los datos ya que arduino
no acepta valores negativos
data[i]=data[i]*4;// multiplicamos por 4 ya que las medidas que obtenemos no pueden ser
mostradas por ser muy pequeas
GLCD.DrawLine(i+20,63,i+20,63-data[i],PIXEL_ON); // Graficamos los datos obtenidos
movindolos al punto 20 que en el cual comienza nuestro eje de frecuencia y dando el valor
mximo de la amplitud para que de este modo nos muestra una lnea continua en forma de
pulso
lastpass[i]=ylim-data[i]; // definimos el lmite en el eje y, para que no se pase del valor y
lo guardamos

};
delay(1000);// se visualizara por mil milisegundos y refrescara la pantalla

}else{//SI EL SWITCH ESTA EN 1 GRAFICO LOS FILTROS


for (i=0; i < 128; i++){ //ARRAY DE VALORES REALES E IMAGINARIOS 128 MUESTRAS
val = analogRead(0); // Adquirimos la seal analgica en el Pin A0, el cual hace una
conversin de 8 bits
data[i] = val/4-64; // Se divide el valor obtenido para un valor de 4 ya que las medidas que
se obtienen son gran valor y no entraran en la escala del lcd y se invierte la pantalla
im[i] = 0; // ya que la seal no posee componentes imaginarios se les da un valor de
cero
};
fix_fft(data,im,7,0); // Se aplica la fft en la cual incluimos los datos obtenidos, el parmetro 7
el cual limite los resultados a un carcter de 8 bits casa contrario se tendra un
desbordamiento y los resultados seran intiles , el parmetro 0 especifica que la matriz
imaginaria debe ser 0

GLCD.ClearScreen();// Limpia la pantalla


GLCD.print(" ANALISIS ESPECTRAL"); //
Se escribe un texto fijo dentro de la
pantalla
GLCD.CursorTo(0,1);GLCD.print("
100"); // se nombra la primera frecuencia
que puede ser mostrada

GLCD.CursorTo(14,1);GLCD.print("4300");
// se nombra la ultima frecuencia que
puede ser mostrada

int aux=0; //inicializamos una variable utilizado ms adelante


for (i=1; i< 64;i++){//inicializacin del for para la adquisicin de datos
data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); //valor absoluto de los datos ya que arduino
no acepta valores negativos
data[i]=data[i]*4;// multiplicamos por 4 ya que las medidas que obtenemos no pueden ser
mostradas por ser muy pequeas
if(data[i]>20){//Se establece un pico mas alto de frecuencia y se lo compara con el
obtenido
aux=i*68;//multiplico el ndice por 68 para saber, el pico alto a que frecuencia corresponde
if((aux<(fc+10))&&(aux>(fc-10))){//rango de frecuencias para filtro
GLCD.DrawLine(i+20,63,i+20,63-data[i],PIXEL_ON); // Graficamos los datos obtenidos
moviendolos al punto 20 que en el cual comienza nuestro eje de frecuencia y dando el valor
maximo de la amplitud para que de este modo nos muestra una lnea continua en forma de
pulso
lastpass[i]=ylim-data[i]; // definimos el limite en el eje y, para que no se pase del valor y lo
guardamos
}
}else{//En el caso que la frecuencia no este dentro de los limites del filtro
GLCD.DrawLine(i+20,63,i+20,63,PIXEL_ON); //ya que existe una componente de frecuencia
solo se grafica el eje
}

};
delay(1000); // se visualizara por mil milisegundos y refrescara la pantalla
}
};
Resultados

Circuito Implementado

Seal Original
Filtro a 100 Hz

Espectro de potencia variando la frecuencia.

Potrebbero piacerti anche