Ads_700x200

poniedziałek, 17 lutego 2014

AVR ADC - uśrednianie czyli cyfrowy filtr dolnoprzepustowy

Witam,

To już ostatni odcinek cyklu poradników na temat przetworników ADC w mikrokontrolerach AVR, a jednocześnie można śmiało powiedzieć - trzeci odcinek na temat AVR dla początkujących. Jest to jakby nie patrzeć trzecie podejście do sposobów uśredniania wyników ADC podczas pomiarów. Myślę, że omawiany tutaj sposób może się przydać każdemu a przy okazji, cały cykl, wskaże drogę do odkrywania nowych własnych jeszcze inny i pewnie jeszcze lepszych metod w tym zakresie. Omawiane przeze mnie sposoby mają być po prostu inspiracją ale ten odcinek jest o tyle szczególny, że może być potraktowany jakby całkowicie niezależnie poza serią i przysłużyć się początkującym, którzy chcieliby szybko okiełznać pomiary napięć w prockach AVR. Gorąco polecam ;)


zapraszam na film:


;)

20 komentarzy:

  1. Krzyczałem przecież, że sondy ;-)

    OdpowiedzUsuń
    Odpowiedzi
    1. eeeeś ... no to ja muszę do laryngologa iść ;) bo nie dosłyszałem już ;)

      Usuń
  2. Dziękuję Mirku za kolejny malutki poradnik. Zawsze kiedy pojawiają się Twoje nowe poradniki liczę cicho na to iż pojawi się poradnik o sieci CAN z zastosowaniem jednego z procesorów z tym protokołem. Mirku powiedz mi czy kiedykolwiek się doczekam? Naprawdę, uwierz mi to będzie krótki poradnik, nie zabierze Ci wiele czasu :) Pozdrawiam i dziękuję za Twój wkład w edukację społeczeństwa.

    OdpowiedzUsuń
    Odpowiedzi
    1. CAN ... hmmm CAN ... może i kiedyś będzie - nie mogę obiecać, przykro mi ... tym bardziej, że na co dzień jakoś nie używam CAN'a .... Nie mniej jednak temat ten mnie również bardzo interesuje - i z tego powodu myślę, że kiedyś będzie i o tym mowa ;)

      Usuń
    2. Panie Mirku Pan ma chyba jakieś USB z KOSMOSU. Ja gdy mierzyłem napięcie bez uśredniania z USB z filtracją i dławikiem to mi około o 20 skakało. Przyda mi się taki JODA:).

      Usuń
    3. A u mnie ile skakało ? no też tak chyba ze 20 ... ;) to na samym początku jak odpaliłem program - to proszę zauważyć że skakało dużo więcej bo nie podłączyłem NIC przez nieuwagę do PC3 - dopiero później podłączyłem tam suwak potencjometru i wspomniałem o tym ;)

      Usuń
  3. Ciekawe zakończenie filmiku ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. To jest tak naprawdę intro pewnego innego całkiem filmu - hmmm może i on się kiedyś ukaże w całości ;) ?

      Usuń
  4. Jeszcze z ADC to MSGEQ7, co Pan na to?

    OdpowiedzUsuń
    Odpowiedzi
    1. Pewnie że będzie o MSGEQ7 .... pewnie - ale przy nieco innej okazji. Na 1000% będzie ;) musi być i będzie to mam nadzieję bardzo miodny poradnik ;)

      Usuń
    2. W tych okolicach ... ale czy na pewno od razu w kolejnym odcinku po ostatnim o magic ledach ? tego nie wiem ;)

      Usuń
  5. Sesja zakończona, wolny czas, a zajrzę sobie na Atnel i proszę piękny poradnik. Dziękuje bardzo za kolejną porcję wiedzy, pora przesiąść się ze stykówki na ATB. Pozdawiam

    OdpowiedzUsuń
  6. Dziękuję Panie Mirku za kolejny sympatyczny poradnik. I tu przy okazji wątku dotyczącego programatora USB i moich doświadczeń z tanimi chińskimi wyrobami z ebaya które można kupić u nas na allegro o 200 % drożej :) Jeśli chodzi o programator USB to nawet nie śmiałem się rozglądać za tanimi chińczykami bo tu trzeba mieć solidny produkt czyli taki jak Pański :) Ale po krótce opowiem moją mini przygodę z chińskimi produktami z których zbudowałem zegar . Do budowy wykorzystałem chińską płytkę z Atmegą mini pro i chińską płytkę -z zegarem DS1307 i eepromem dodatkowo na pokładzie . Przepłaciłem za to na allegro 200 % (w stosunku do ebaya) ale i tak się cieszyłem że tanio :) Po złożeniu i uruchomieniu zegarka okazało się , że w ciągu tygodnia opóźnił się o 10 minut :) Dla porównania złożyłem na płytce uniwersalnej zegar z niechińskiego źródła efektem był dokładnie odmierzony czas i w ciągu tygodnia brak odchyłek . Ale morałem z tej bajki będzie co innego :) czy ktoś się zastanowił przez chwilę ile ołowiu i metali ciężkich a nawet promieniotwórczych może być ukryte w chińskich płytkach, jeśli nie to proponuje taki wyrób poddać testom na obecność w/w :) .

    OdpowiedzUsuń
  7. Właśnie czegoś takiego szukałem do dwukanałowego termometru opartego na LM335.

    OdpowiedzUsuń
  8. Wcześniej robiłem tak, że zbierałem po kilka próbek i liczyłem z nich średnią, ale taki "filtr" jest lepszy bo działa na bieżąco, jest jednak pewne ALE...

    Trochę się przyjrzałem tematowi i algorytm zaprezentowany przez Pana(średnia krocząca: http://en.wikipedia.org/wiki/Moving_average) nie daje dokładnego rezultatu- tzn. dawałby, gdybyśmy działali na float'ach, jednak gdy używamy int'ów pojawia się problem zaokrąglania, i dlatego np. dla napięcia odpowiadającego pełnemu zakresowi przetwornika(1023) mamy wynik po filtrze o dt mniejszy- jak sobie rozpiszecie na kartce, to wam wyjdzie mnożenie przez jakiś ułamek mniejszy niż 1- jest on zaokrąglony do 0, dlatego nasz wynik nie "doskoczy" do poprawnej wartości.
    Na wikipedii znalazłem też taki algorytm:
    http://en.wikipedia.org/wiki/Low-pass_filter#Simple_infinite_impulse_response_filter

    ale jest problem- także z ułamkami(alpha pomiedzy 0 a 1), poradziłem sobie tak:

    #define FRAC_1of32(_x) ((_x >> 5)+1) //1/32 z x // +1 zaokraglenie w gore
    #define FRAC_Nof32(_n, _x) (_n*FRAC_1of32(_x)) //ulamek: n/32 z x

    /// Lowpass: out=alph*input + (1-alph)*last_out
    output=FRAC_Nof32(_n_of32,_new_val) + (last_output-FRAC_Nof32(_n_of32, last_output));

    Niestety także nie dociera do poprawnej wartości.

    Nie poddając się szukałem dalej, i .... jest! takie coś- super szybki i prosty filtr DP:

    static uint16_t adc_lowpass_filt(uint16_t _new_val, uint8_t _filter_pow)
    {
    static uint16_t filt_val;
    static uint32_t sum;

    sum = sum - filt_val + _new_val;
    filt_val = (sum >> _filter_pow);
    return filt_val;
    }

    Polecam wypróbować- działa tak samo jak Pański, z tym, że dociera do tych 1023, opóźnienie regulujemy zmienną _filter_pow. Pomysł pochodzi z forum AVR_freaks, autor(dpaulsen) zaleca też dla większej dokładności zamienić przedostatnia linijkę na:
    filt_val = (Sum +(1<<(_filter_pow - 1))) >> _filter_pow;

    pozdrawiam Qba

    OdpowiedzUsuń
    Odpowiedzi
    1. Ale jest sposób aby działać z dokładnością o której piszesz nawet na liczbach całkowitych ;)

      jeśli masz np działanie na liczbach całkowitych

      wynik = A / B

      to wystarczy że zrobisz

      wynik = ( A + B/2 ) / B

      i pozbywasz się tej niedokładności w sporym zakresie ;) ... opisuję to np dokładniej tutaj:

      http://mirekk36.blogspot.com/2013/01/rs232-ubrr-jak-prawidowo-obliczac-trick.html

      chociaż w innym aspekcie/zastosowaniu

      Popróbuj - zobaczysz że działa ;)

      Usuń
  9. Mirku! Powiem tak: ostatnio zasnąłem oglądając MATRIXA. Od wczoraj oglądnąłem cały Twój cykl dotyczący przetwornika ADC, wstęp do Eclipse i kilka Twoich innych filmików, a nie zmrużyłem oka. Wciągnęło mnie na całego. Kiedyś już zabierałem się za mikrokontrolery, ale dostęp do wiedzy był żaden. Z największą przyjemnością zamówiłem Niebieską Książkę. Przez te dwa dni nauczyłem się więcej niż poprzednio przez kilkanaście tygodni. Mam nadzieję zacząć zabawę na nowo i na poważnie. Przeraża mnie tylko ilość linków po prawej stronie. Nie wiem jak to zniesie moja żona :-) Dziękuję za Twój ogromny wkład pracy. Pozdrawiam serdecznie!

    OdpowiedzUsuń
    Odpowiedzi
    1. ;) cieszę się, że udało mi się "zarazić" tym jakże przyjemnym bakcylem kolejną osobę czyli ciebie ;) .... hmmm wiesz - odnośnie twojej małżonki - to może spróbuj ją lekko zarazić z kolei tym co robi moja żoniczność:

      https://www.youtube.com/channel/UCa9VDKSL8DBVj9NbbVHS_1Q

      a nóż się uda i wtedy będziemy mieli razem troszkę spokoju i wyrozumiałości ? ;)

      Usuń
  10. Przeczytałem w bluebook'u rozdział o ADC wykonując przy tym zamieszczone przykłady.I wszystko działa. Ale dotarłem do podrozdziału o pomiarach różnicowych i "boom", przepaść! Oczywiście rozumiem poszczególne informację ale brak mi w tym wyjaśnień dlaczego właściwie stosujemy to wzmocnienie i jak podłączamy to do układu wspomnianego silnika DC, przydał by się przykład właśnie z pomiarem gdzie mamy silnik pracujący pod napięciem 24 VDC. Bardzo zależy mi na 100% zrozumieniu tego tematu bo uważam to za ciekawy wstęp do sterowania silnikiem DC. Czy można liczyć na filmiki z tym tematem?

    OdpowiedzUsuń