logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA32][C/WINAVR4] filtr IIR, wartości na wyjściu

y3m3th 10 Sty 2012 14:26 1633 6
  • #1 10376680
    y3m3th
    Poziom 2  
    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;

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 10376921
    mickpr
    Poziom 39  
    Czy nie jest czasem tak, że twoja unia (zm16bit) powinna być volatile?
    Kompilator ci czasem tego nie zoptymalizował?
  • #3 10377086
    y3m3th
    Poziom 2  
    Dzięki za odpowiedź, jednak nie rozwiązuje to problemu. Ustawiłem volatile dla zm16bit i nadal pomimo zerowych zmian na wejściu (cały czas poziom 128+/- 1) wyjście wariuje, przyjmuje chyba wszystkie wartości dla int16.
    Jakieś pomysły? Siedzę nad tym już dłuższy czas i nie potrafię dojść o co chodzi (a raczej nie chodzi) :)
  • #4 10377196
    mickpr
    Poziom 39  
    ADMUX - chyba nie wybierasz pinu.
  • #5 10377220
    y3m3th
    Poziom 2  
    wg datashetu ustawienie MUX4:0 na 0000 wybiera ADC0 w trybie Single Ended Input. Przetwornik mi działa, sygnał wchodzący do procka na PA0 jest prawidłowo dekodowany przez ADC, problem pojawia się przy filtracji.
  • #7 10381215
    y3m3th
    Poziom 2  
    Dziękuję :) na tym kodzie się wzorowałem i rzuciłem na niego okiem jeszcze raz. W moim kodzie jest jeden irytujący błąd, zaraz go poprawię.
    Temat do zamknięcia.
REKLAMA