Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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.
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
// precalibrado a
P1DIR = 0x00;
P2DIR = 0xFF;
P2SEL=0x00;
P2OUT=0xF0;
CCTL0 = CCIE;
16MHz
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)
{
}
}
//-------------------------------------------------------------//-------------------------------------------------------------//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;
// 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
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
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.
}
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.