You are here: Home » Procesamiento Digital de Señales » Filtro Butterworth de segundo orden con Arduino

Filtro Butterworth de segundo orden con Arduino

Objetivos:

  • Implementar un filtro Butterworh en Arduino

Diseño de filtro:

  1. Segundo Orden
  2. Butterworth
  3. Filtro pasa bajas
  4. Frecuencia de corte 400 hz
  5. Frecuencia de muestreo 100kHz
  6. Periodo de muestreo 10 us

 

Usamos la pagina http://www.schwietering.com/jayduino/filtuino/

para generar la ecuación en diferencias

 

http://www.schwietering.com/jayduino/filtuino/index.php?characteristic=bu&passmode=lp&order=2&usesr=usesr&sr=10000&frequencyLow=400&noteLow=&noteHigh=&pw=pw&calctype=double&run=Send

 

Código Arduino:

 

#include // Remember this line!
#include
#define SS_PIN 10

DAC_MCP49xx dac(DAC_MCP49xx::MCP4921, SS_PIN);

#include “TimerOne.h” // libreria sirve para generar interrupciones por tiempo

int row; // señal de entrada
float yn; // señal de salida

//Low pass butterworth filter order=2 alpha1=0.04
class FilterBuLp2
{
public:
FilterBuLp2()
{
v[0]=0.0;
v[1]=0.0;
}
private:
double v[3];
public:
double step(double x) //class II
{
v[0] = v[1];
v[1] = v[2];
v[2] = (1.335920002785651040e-2 * x)
+ (-0.70089678118840259557 * v[0])
+ (1.64745998107697655399 * v[1]);
return
(v[0] + v[2])
+2 * v[1];
}
};

FilterBuLp2 f;

void setup() {

Timer1.initialize(10); // Dispara cada 100 us
Timer1.attachInterrupt(muestrea); // Activa la interrupcion y la asocia a muestrea

dac.setSPIDivider(SPI_CLOCK_DIV16);

dac.setPortWrite(true);

}

void muestrea () { // se ejecuta cada 100 us

int raw = analogRead(A0);

float filtered = f.step(raw);

yn=map(filtered,0,1024,0,4096); // se mapa xn de 0 1024 a 0 4096 ya que el DAC es de 12 bits

dac.output(yn); // se manda yn al DAC

}

void loop() {

}

 

Resultados:

 

Para una frecuencia de entrada de 100 Hz

 

 

Para una frecuencia de salida de 800 Hz

 

3 Comments

  1. hola que tal ? estoy tratando de implementar este código , para un proyecto , pero estoy teniendo varios problemas principalmente no me funciona jaja
    quería saber si lo echo en http://www.schwietering.com/jayduino/filtuino/index.php? no tendría que dentro del void muestra ? , de no ser necesario como devuelve lo calculado para trabajar en el void muestra ?
    y otra consulta que habria que poner donde dice
    #include // Remember this line!
    #include
    #define SS_PIN 10
    DAC_MCP49xx dac(DAC_MCP49xx::MCP4921, SS_PIN);

    muchas gracias por su molestia.

    • Una disculpa las primeras lineas estaban mal son

      #include // Remember this line!
      #include
      #define SS_PIN 10

      Ya corregí el articulo

  2. Amigo Aqui Usate un codigo de DAC o usaste un integrado..

Leave a Reply to brian Cancel reply

Your email address will not be published. Required fields are marked *