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

ADC Atmega 328p - Jak zmniejszyć szybkość próbkowania w trybie free running?

26 Wrz 2014 20:24 1929 22
REKLAMA
  • #1 13993492
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 13993502
    mickpr
    Poziom 39  
    goldcap napisał:
    Jak ustawić ADC aby była bardzo mała szybkość próbkowania jak w zwykłym mierniku?
    A po co ustawiać wolne próbkowanie? Nie lepiej zbierać wyniki i uśredniać - będzie dokładniej!
  • #3 13993616
    Konto nie istnieje
    Konto nie istnieje  
  • #5 13993726
    tmf
    VIP Zasłużony dla elektroda
    goldcap napisał:
    mickpr napisał:
    goldcap napisał:
    Jak ustawić ADC aby była bardzo mała szybkość próbkowania jak w zwykłym mierniku?
    A po co ustawiać wolne próbkowanie? Nie lepiej zbierać wyniki i uśredniać - będzie dokładniej!

    Czyli co ile pomiarów w przerwaniu ADC_vect obliczać średni wynik?


    To zależy co chcesz osiągnąć. Im więcej uśrednisz wyników tym stabilniejszy będzie odczyt, ale za to zmniejszy się pasmo, czyli reakcja na zmianę będzie wolniejsza.
    Możesz też nie uśredniać, ale np. zwiększyć preskaler ADC, wtedy pomiary będą rzadziej.
  • #6 13993893
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • REKLAMA
  • #8 13995235
    Konto nie istnieje
    Konto nie istnieje  
  • #9 13995260
    tmf
    VIP Zasłużony dla elektroda
    Pokazuje dziwne napięcia, bo przy braku prądu polaryzującego wejście ADC, które wisi w powietrzu zbiera śmieci z otoczenia. Daj na wejście ADC np. 1 MOm rezystor do masy i będziesz miał spoczynkowo 0. Co do odczytu - uśredniaj np. kolejnych 16 wartości i podawaj wartość uśrednioną - będzie ci skakać znacznie mniej.
  • #10 13995300
    Konto nie istnieje
    Konto nie istnieje  
  • #11 13995425
    tmf
    VIP Zasłużony dla elektroda
    Rezystor o niższej wartości też może być, tylko będzie ci bardziej obciążał źródło napięcia, co może fałszować (zaniżać) wynik. A średnią licz sobie gdzie chcesz, chociaż w przerwaniu pewnie najprościej.
  • #12 13995889
    Konto nie istnieje
    Konto nie istnieje  
  • #13 13996064
    witoldwitoldowicz
    Poziom 28  
    Dlaczego delay jest poza forem.Podzielnik powinen byc 20 (0-19).
  • #14 13996103
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #15 13996131
    witoldwitoldowicz
    Poziom 28  
    Wtedy for'a i if'a miales dobrze tylko podzielnik mial byc 20 teraz masz miec 21(0-20).
    Dlaczego delay raz 200 pozniej 100 a teraz 5?
  • #16 13996361
    Konto nie istnieje
    Konto nie istnieje  
  • #17 13996417
    tmf
    VIP Zasłużony dla elektroda
    Sumowanie 21 wartości jest niewygodne, zrób 4, 16, lub inną potęgę liczby dwa. Poza ty masz zsumować np. 16 wyników przetwarzania, czyli tam nie ma być żadne delay, tylko musisz zliczać określoną ilość przerwań ADC.
  • #18 13997128
    Konto nie istnieje
    Konto nie istnieje  
  • #19 13997306
    witoldwitoldowicz
    Poziom 28  
    Możesz zrobić coś takiego
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #20 13997489
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #21 13997527
    tmf
    VIP Zasłużony dla elektroda
    witoldwitoldowicz - trochę udziwniasz, nie prościej sumowanie zrobić w przerwaniu?
    goldcap - zajmuje sporo bo używasz arytmetyki zmiennopozycyjnej. Jaki sens jest mnożyć razy 1.1 a potem razy 1000? Nie lepiej od razu pomnożyćrazy 1100? Jeśli nie wyświetlasz nic po przecinku to dzielenie przez 1024.0 też sensu nie ma, lepiej przez 1024. A jeśli masz coś po przecinku to można pomnożyć dodatkowo razy 10 - użyj fixed point math.
    Wyświetlanie wyniku można przyśpieszyć po prostu przyśpieszając konwersję ADC.
    Zobacz też:
    http://mikrokontrolery.blogspot.com/2011/03/A...ize-Viewer-szukanie-oszczednosci-pamieci.html
    będziesz wiedział co ci zajmuje pamięć.
  • #22 13997587
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #23 13997607
    BlueDraco
    Specjalista - Mikrokontrolery
    No dobra, czas napisać, jak to zrobić prosto i efektywnie:

    Używamy jednego przerwania - timera, zgłaszanego kilkadziesiąt..kilkaset razy na sekundę (w typ przypadku, o ile nie ma multipleksowania LED, może być np. 100 Hz). żadna pętla główna nie jest do niczego potrzebna. W procedurze obsługi przerwania odczytujemy wynik ADC, "robimy filtr dolnoprzepustowy", wyświetlamy wynik i startujemy następną konwersję ADC.

    Z wynikiem ADC robimy coś takiego:

    suma = suma - (suma >> FS) + ADC;

    Gdzie FS jest niewielką liczbą całkowitą - 3..6.
    Bieżący, uśredniony wynik ADC uzsykujemy jako:

    suma >> FS,

    przy czym najczęściej nie ma potrzeby wykonywania rtakiej operacji, bo możny ją wpleść w przeliczenie wartości odczytanej z ADC na wartość napięcia mierzonego w mV.

    Wszystko to da się policzyć bez zmiennego przecinka, a więc szybko i bez zajmowania pamięci na procedury obliczeń z biblioteki.
REKLAMA