Ir ao conteúdo
  • Cadastre-se

Filtro passa_baixa


Posts recomendados

3 horas atrás, test man*~ disse:

Coloca a frequencia de corte e o valor do capacitor que ele te dará o valor da resistencia e os demais dados "Calculate the R and C values for the filter at a given frequency":

http://sim.okawa-denshi.jp/en/CRlowkeisan.htm

Bacana esse site mas estou precisando para sw em C.

 

Grato.

adicionado 1 minuto depois
6 horas atrás, Isadora Ferraz disse:

Um R e um C devem dar conta. No sw, faça a soma de 8 (16,32.64...) leituras em intervalos de tempo e divida por 8 (16,32,64...)

Quem procura, acha. Se achou?

É no sw em C, já vi isso em algum lugar mas não consegui desenvolver, você tem algum exemplo?

Link para o comentário
Compartilhar em outros sites

Você quer filtro digital né? Eu estou meio que querendo usar um também, olha isso:

https://kiritchatterjee.wordpress.com/2014/11/10/a-simple-digital-low-pass-filter-in-c/

 

Depois vou tentar usar e ver o resultado, para ficar mais rápido há uma alternativa, no link acima, que não usa variáveis float.

 

LPF_Beta serve para "amaciar" a saída.

int RawData;
float SmoothData;
float LPF_Beta = 0.025; // 0<ß<1

void main (void){
    // LPF: Y(n) = (1-ß)*Y(n-1) + (ß*X(n))) = Y(n-1) - (ß*(Y(n-1)-X(n)));
    while(1){
       // Function that brings Fresh Data into RawData
       RawData = GetRawData();
       SmoothData = SmoothData - (LPF_Beta * (SmoothData - RawData));
    }
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

penso que o filtro rc é condição sine qua non pra facilitar a vida do mc. você pode complementar com o sw do amigo @test man*~ (não entendi mas parece bem legal, também vou testar qualquer dia, também precisei 1 dia:optei por 'investir' num RC depois de ralar tentando 'criar' um filtro no sw, )

Penso que um acelerômetro não deve ter resposta muito rápida por isso o lance de fazer a soma de 8 medidas e dividir por 8 que acaba sendo 1/2 que um filtro 1/2 boca, é uma opção minimamente curiosa. Mas se precisar de rapidez extrema, aí sim tente 1º o lance (tendi nada) do amigo @test man*~

Se achar que deve, publique o circuito

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Isadora Ferraz é um site... você informa os dados e ele te dá o que é necessário

 

Eu usei esse site para corte do meu woofer algum tempo atrás. Funciona bem... como PB passivo. Circuitos ativos também tem aos montes na internet, usando o PL071 (Se não me falha a memória). Mas eu ainda vou de RLC mesmo

Link para o comentário
Compartilhar em outros sites

int leitura_antes_filtragem;
float leitura_apos_filtragem;
float filtro_passa_baixa_beta = 0.025; // 0<ß<1

void main (void) {
    while(1) {
       // Realiza a leitura analógica do canal 0
       leitura_antes_filtragem = read_adc(0); 

       // Realiza a filtragem da leitura                           
       leitura_apos_filtragem = leitura_apos_filtragem - (filtro_passa_baixa_beta * (leitura_apos_filtragem - leitura_antes_filtragem)); 
    
       // Agora a variável "leitura_apos_filtragem" contém o valor filtrado.
    }
}


Funcionamento:
Vamos supor que o sistema está estável e o último valor lido foi 1000.
leitura_apos_filtragem = 1000

 

Sendo que a próxima leitura teve o valor de 970.
leitura_antes_filtragem = 970

 

O novo valor da leitura filtrada para um beta de 0,025 (resposta muito suavizada) será:
leitura_apos_filtragem = 1000 - [0.025 * (1000 - 970)]
leitura_apos_filtragem = 999,25

 

Esse valor só será alterado na próxima leitura analógica (a frequência com que as leituras ocorrem influencia no filtro).


Suponhamos que a próxima leitura (que pode ter ocorrido após 200ms ou 2s ou 10s) foi de 950.
leitura_antes_filtragem = 950

 

O novo valor da leitura filtrada será:
leitura_apos_filtragem = 999.25 - [0.025 * (999.25 - 950)]
leitura_apos_filtragem = 998,02

 

Assim o beta deve ser ajustado de acordo com a frequência das leituras e o sinal analógico em si...

 

Vou ver se levanto alguns gráficos aqui, pena que não tenho o "Labview Interface For Arduino" instalado :( seria uma mão na roda... Depois posto os gráficos aqui.

 

Link para o comentário
Compartilhar em outros sites

Ai está o gráfico, o código foi implementado no BASCOM mas faz a mesma coisa que o código acima faz inclusive o beta está com o valor de 0,025 a taxa de atualização é 50ms. Amanhã eu termino a interface, faço mais testes e postos o código, esquemático e interface labview...

 

A entrada analógica do ATmega328P foi conectada a um potenciômetro.

 

Plot 0 = Leitura antes do filtro

plot 1 = Leitura depois do filtro

região de visualização = 200 amostras

Tempo visualizado = 10 segundos 

pRGkp3i.png

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

legal @ilkyest ! Apesar de me referir ao algoritimo C do amigo @test man*~ que a qualquer momento vou entender.

Quanto à tirar a média de leituras...um filtro 1/2 boca

unsigned int media()
{
unsigned int m=0,i=8;
while(i--) {m+=adcread(0)}; //delay(x);}
return m/8;
}

Especialmente útil pra quando p.ex. temos que conviver com alguma influência externa e ela está incomodando um pouco a leitura do sinal ad p.ex. quando layout pc já está feito não otimizado e não consigo + alterar e sei que a causa é só esta.

Mas ainda dou prioridade ao filtro RC, LC ou RLC

Link para o comentário
Compartilhar em outros sites

Terminei os testes com o filtro, é muito bom mesmo, eu deveria ter montado um antes =D... Os gráficos mostram a leitura de um LM35, sem média e sem capacitor na entrada analógica, apenas uma leitura e ela passa pelo filtro. A matemática do filtro está sendo feita no AVR a conversão para temperatura está sendo feita no LabVIEW.

 

Se a pessoa possuir o Matlab da para discretizar a função informando a taxa de amostragem e a frequência de corte, ai fica show.

 

Download (Código, Interface, Esquema):

Arquivos para teste usando o LM35

Arquivos para teste usando o potenciômetro

 

 

Gráficos:

Beta = 0,009; Taxa de atualização = 30ms

0pnpvMh.png

 

Beta = 0,01; Taxa de atualização = 50ms

ZHQMoFa.png

 

Beta = 0,045; Taxa de atualização = 50ms (Filtro já começa a deixar passar alguma coisa)

nIAeef6.png

 

Beta = 0,065; Taxa de atualização = 50ms

L3XhB3V.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

bacana @test man*~ ! Quase que dispensa o RC. Ideal pra quando hw está pronto e não otimizado. você pode não acreditar mas depois de entender bit a bit penso em usar isso num projeto comercial e pasme... não vou te pagar comissão kk. De fato a questão não é exatamente esta mas tem alguma relação.

abç

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, Isadora Ferraz disse:

[...] penso em usar isso num projeto comercial e pasme... não vou te pagar comissão kk. De fato a questão não é exatamente esta mas tem alguma relação [...]

 

huHAuHAhahHAHHAh, se for pra pagar quem deve ganhar é o Kirit Chatterjee eu não fiz coisa alguma, apenas reproduzi o que ele postou =D... Bacana, eu também penso em usar este filtro em um CLP pra resolver um problema... :D

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...