Cześć,
mam problem z implementacją filtru IIR 4 rzędu Butterwortha na ATmedze32.
Z części analogowej układu (tj. wzmacniacz sygnału pochodzącego z mikrofonu) podaje sygnał na ADC (PA0). Sygnał jest podbity o składową stałą 2.5V, dzięki czemu zakres wartości zawiera mi się w przedziale (0,5V). Sprawdzałem zawartość rejestru ADCH, wartości zgadzają się z przyłożonym napięciem (tj 0V - 0, 5V - 255). Wartość pobraną z ADCH przekazuje do funkcji IIR odpowiedzialnej za filtrację i wynik wyświetlam na LCD.
I tu pojawia sie problem. Otóż wartości uzyskanych próbek po filtracji są dla mnie nieoczywiste, pomimo utrzymywania caly czas na wejściu wartości 2,5V (bez składowej zmiennej) rejestrowane zmiany na wyświetlaczu są jak dla mnie losowe.
Co robię źle?
Procesor taktuję 16MHz, na ADC mam włączony preskaler 128, czyli Fsample = 9600 Hz.
//edit: 11.01.2012
w kodzie był błąd w funkcji iir.
po poprawce:
fpp.Y[0] = out;
mam problem z implementacją filtru IIR 4 rzędu Butterwortha na ATmedze32.
Z części analogowej układu (tj. wzmacniacz sygnału pochodzącego z mikrofonu) podaje sygnał na ADC (PA0). Sygnał jest podbity o składową stałą 2.5V, dzięki czemu zakres wartości zawiera mi się w przedziale (0,5V). Sprawdzałem zawartość rejestru ADCH, wartości zgadzają się z przyłożonym napięciem (tj 0V - 0, 5V - 255). Wartość pobraną z ADCH przekazuje do funkcji IIR odpowiedzialnej za filtrację i wynik wyświetlam na LCD.
I tu pojawia sie problem. Otóż wartości uzyskanych próbek po filtracji są dla mnie nieoczywiste, pomimo utrzymywania caly czas na wejściu wartości 2,5V (bez składowej zmiennej) rejestrowane zmiany na wyświetlaczu są jak dla mnie losowe.
Co robię źle?
Procesor taktuję 16MHz, na ADC mam włączony preskaler 128, czyli Fsample = 9600 Hz.
//edit: 11.01.2012
w kodzie był błąd w funkcji iir.
po poprawce:
fpp.Y[0] = out;
Kod: C / C++
