Vous êtes sur la page 1sur 6

Procesamiento de Seales

Instituto Tecnolgico de Morelia


2/06/15
Alumnos: Marlon Egua
Carlos Eduardo Aguilera
Profesor: Dr. David Infante

Implementacin de un Filtro IIR en Scilab y en microcontrolador.

1. Introduccin
En esta prctica se implement un filtro IIR, que quiere decir infinite impulse response.
Podremos entender cmo se realiza mediante software en un programa de manipulacin
de matrices como los es el software libre SCILAB as como su implementacin en un
microcontrolador.

1.1 Marco terico


La salida de los filtros IIR depende de las entradas actuales y pasadas, y adems de las
salidas en instantes anteriores. Esto se consigue mediante el uso de realimentacin de la
salida.

Donde los a y b son los coeficientes del filtro.

2.0 Desarrollo
Como parte de la prctica se pidi elaborar un cdigo en scilab que fuera capaz de aprovechar las
funciones internas del programa mediante el comando hz=iir como se muestra en los siguientes
renglones :
hz=iir(n,ftype,fdesign,frq,delta)
[p,z,g]=iir(n,ftype,fdesign,frq,delta)

Al escribir help y la palabra iir, aparecer el cdigo de arriba. Se pueden ingresar parmetros como
lo son el orden del filtro, tipo de filtro (Chebyshev, butterworth, bessel, la frecuencia normalizada
que debe ser mayor a cero y como mximo 0.5 que representa de la frecuencia de muestreo
mxima permitida. Esto es muy importante ya que el diseo est en base a la frecuencia de
muestreo.

En la parte de abajo se muestra el cdigo para el diseo de un filtro pasabajas con frecuencia de
corte de 50 hz y frecuencia de muestreo de 1khz. Al implementar esos comandos obtenemos la
funcin de transferencia que modela el filtro y podemos hacer un despeje para obtener Vo(k).
clear
clc
fs=1000; //frecuencia de muestreo
fc=50;
fcn=fc/fs; //frecuencia de corte normalizada
format('v',7)

hz=iir(2,'lp','butt',[fcn],[ ]);
[hzm,fr]=frmag(hz,256);
sal=flts(x,hz);
b=coeff(numer(hz));
a=coeff(denom(hz));

Como se menciona en el marco terico los coeficientes a y b son los que le dan la forma al filtro y
podemos acceder a ellos con el comando coeff como se muestra en el cdigo de la parte superior.
En la figura 1.0 podemos observar la consola del programa al hacer lo que se menciona.

Figura 1.0. Obtencin de funcin de transferencia en el dominio z.


Otra parte del cdigo que se implement fue la Convolucin de una seal ya sea dentro de la
banda de paso (menor a 50 hz) o de una fuera de la banda de paso (mayor a 50 hz) . Como

sabemos, la Convolucin es una multiplicacin entre una seal x(t) con una funcin h(t), aunque el
anlisis y resultado se aprecia con mayor enfoque en el dominio de la frecuencia. No obstante, al
hacer esto, la funcin h(t) es la funcin de transferencia del filtro IIR con los valores anteriores y
actuales llenndose en un vector Vo cada vez que hay una iteracin. Esto se muestra en el cdigo
de abajo.
//x1=Vi
for(i=1:20)
if((i-2)>0)
Vo(i) = 1.561018*Vo(i-1)-0.641351*Vo(i-2)+0.020083*x1(i)+0.040166*x1(i-1)+0.020083*x1(i2);
else
Vo(i)=0;
end
end
subplot(3,2,1)
plot2d(t,Vo)
Si x1 es una seal dentro de la banda de paso, no se atenuar, si esta fuera de la banda de paso, se
atenuar como se puede observar en la figura 1.1 las seales mayores a 50hz comenzaran a ser 0.7
veces la seal de entrada.

Figura 1.1. Comportamiento filtro pasa bajas.

2.1 Implementacin del filtro en uc.


//-------------------------------------------------------------//Librerias y definiciones generales
#include <msp430g2553.h>
#include<stdio.h>
#include<math.h>
//-------------------------------------------------------------//-------------------------------------------------------------//Seccion de inicializacion de variables globales
unsigned int Vo_dac;
//VAriables para hacer las ecuaciones de estado
double Vo_2=0, Vo_1=0, Vo=0 , fracVo ; //Vo
int entVo;
double Vi_2=0,Vi_1=0,Vi=0; //Vi
//-----------------CONSTANTES-------------------------------------------------const double a= 0.0200833656;

const double b= 0.0401667311;


const double c= 1.5610180758;
const double d= 0.6413515381;
//-----------------FIN DE CONSTANTES-------------------------------------------//Programa principal
void main(void)
{
//Seccion de configuracion
WDTCTL = WDTPW + WDTHOLD;

// Detiene el Watchdog Timer

BCSCTL1 = CALBC1_1MHZ;

// Configura el oscilador interno

DCOCTL = CALDCO_1MHZ;

// precalibrado a

P1DIR = 0x00;
P2DIR = 0xFF;
P2SEL=0x00;
P2OUT=0xF0;
CCTL0 = CCIE;

16MHz

Un problema muy importante que se


present fue aqu ya que al estar
configurado a 1Mhz las cuentas dentro
de la interrupcin no se ejecutaban en
1ms, tardaban 2ms y esto se vea en el
osciloscopio en los escalones de la
seal de salida. El aumentar a 16 Mhz
hace que las operaciones mquina
/ciclos mquina se ejecuten ms rpido
y al cambiar de 1Mhz en las lneas
rojos, hizo que funcionara
correctamente.

//Desasociamos los perifericos, para utilizar P2.6 y P2.7

// Habilita interrupcion de timer CCR0

CCR0 = 1000; //ts=1ms Valor al que llega el timer TACCR0. SI DCO Y BCS estn a 16MHZ entonces CCRO= 1600
//TACTL = TASSEL_2 + MC_1+ID_3;
// SMCLK, modo UP y divisin de 3 1exp 6 /8 =125000
TACTL = TASSEL_2 + MC_1;
ADC10CTL1 = INCH_0;
// Canal de entrada A0
ADC10CTL0 = ADC10ON;
// Enciende ADC
ADC10AE0 |= 0x01;
// P1.0 como periferico A0
_BIS_SR(GIE);
//Ciclo Principal
while (1)
{

// Activa las interrupciones globales del mC

// ciclo infinito que no hace nada

}
}
//-------------------------------------------------------------//-------------------------------------------------------------//Seccion de vectores de interrupcion
// Timer A0 interrupt service routine

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
//--------------ENCENDIDO DEL ADC Y TOMA MUESTRAS----------------------------ADC10CTL0 |= ENC + ADC10SC; //Habilita convesion e inicia conversion
while (ADC10CTL1 & ADC10BUSY); //Espera a que termine de hacer la conversion
Vi=ADC10MEM;//----------------------Asignacion de Vi------ADC10CTL0 &= ~ENC;

//-------------APAGADO DE ADC Y CALCULAR Vo-----------------------------------

// P2OUT^=0x01;
///*
Vo= a*(Vi_2)+b*(Vi_1)+a*(Vi)+c*(Vo_1)- (d*(Vo_2));//Ecuacin de salida
entVo=(int)Vo;
Vo_dac=entVo>>2; //Como la salida es de 8 bits se hace un corrimiento porque ADC es de 10 bits
P2OUT=Vo_dac; //Mostrar valor de la salida
Vo_2=Vo_1;
Vi_2=Vi_1;
Vo_1=Vo;
Vi_1=Vi;
//---------------Asignacin de valores de Vi---------------------------------//*/

} //FIN DE LA INTERRUPCION

2.2 Hardware y conexiones


Se utiliz un MSP430G2553, un DAC0832 para hacer la prctica como se muestra en la figura 1.3.
12v
U2

P2.3
P2.2
P2.1
P2.0

5v

RFB

CS
VCC
WR1
ILE
GND
WR2
DI3
XFER
DI2
DI4
DI1
DI5
DI0
DI6
VREF
DI7
RFB
IOUT2
GND2 IOUT1

20
19
18
17
16
15
14
13
12
11

5v

J10

P2.4
P2.5
P2.6
P2.7

3
2
1

IOUT1

CON3

DAC0832

J11
5
4
3
2
1

R2

R1
1

OUT
3

LM324
6

-12v

CON5

10k
+ 4
U3A

V+

OUT

12v
5

-12v

11

V-

11

10k

V-

LM324
IOUT1 2

-12v

5v

J8
Vref

12v

1
2
3
4
5
6
7
8
9
10

+ 4
U3B

J12
R3

1
V+

12v
CON1

1k

Conexion al uc
VCC_3.3
J3

J4
10
9
8
7
6
5
4
3
2
1

uc_lef t

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P2.0
P2.1
P2.2

1
P2.6
2
P2.7
3
TEST
4
RESET 5
P1.7
6
P1.6
7
P2.5
8
P2.4
9
P2.3 10
uc_right

Figura 1.3. Diagrama de conexin al microcontrolador y al DAC0832.

D1
LED

En la figura 1.4 se observa en fsico el hardware y como se conecta donde ya se tiene un PCB con el
DAC.
}

Figura 1.4. MSP launchpad y DAC.

3. Conclusiones y Resultados
Al final se obtuvo lo esperado. La seal de entrada que le metimos al uc fue de 1v a una frecuencia
de 50 hz. En la salida lo que veamos era esa seal pero con una amplitud de 0.7 cumpliendo el
comportamiento del filtro. Tambin se pudieron observar los escalones de 1ms en la seal de
salida, algo que no pasaba cuando se tena el DCO a 1Mhz , ya que ah los escalones eran de 2ms y
no concordaba ya que la interrupcin se ejecuta cada 1 ms.
Se concluye que los filtros IIR usan operaciones de punto flotante y recursivos que pueden hacer
que las cuentas tarden mucho, por lo tanto es recomendable manejarse a la mayor velocidad
posible dentro del microcontrolador y es por esto que se usan DSPs para implementar filtros ya
ms robustos.
Fue indispensable realizar el diseo mediante scilab ya que ahorra muchas cuentas a mano y se
pueden apreciar las respuestas a las seales sin necesidad de conectar circuitos y as estar mejor
preparado cuando se requieran solucionar problemas como el que se tuvo del reloj interno y se
descarten errores de diseo.
Otro problema que se tena era que la seal de salida era mayor cuando el DAC era conectado a 5
v, y eso estaba mal ya que se debe hacer a 3.3v que es el rango de voltajes de entrada que maneja
el uc y ocupa estar al mismo voltaje de referencia el DAC. Al hacer esto ya no hubo problemas.

Vous aimerez peut-être aussi