Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega644pa-pu - ADC-odczytanie poprzedniego pomiaru i porównanie z bieżącym

05 Lut 2016 23:09 828 15
  • Poziom 4  
    Mam pytanie,
    odczytuję pomiar z czujnika odległości i chcę jakoś zapamiętać poprzedni pomiar, aby porównać z bieżącym w celu wyłapania dużej różnicy napięć (skoku napięcia) w kolejnych cyklach pomiarowych. Pomiar wykonuję w przerwaniu, stosuję filtr dolnoprzepustowy i uśredniam wyniki i po wyjściu z przerwania odczytuję ostateczną wartość pomiaru. Czy powinnam zastosować drugie przerwanie aby zapisać jakoś pomiar i go utrzymać aby potem porównać go z kolejnym? Jak to programowo zrobić?
    Bardzo proszę o pomoc :)
  • Moderator Mikrokontrolery Projektowanie
    Dobrze byłoby byś pokazała program.
  • Użytkownik usunął konto  
  • Poziom 4  
    Cześć Piotruś! :D

    no tak tylko currADC ciągle by mi sie uaktualniało więc i prevADC też w tym wypadku, i tak kombinuję czy jeszcze wewnątrz przerwania zapisać odczyt do jakiejś zmiennej a potem w głównym programie ją wyciągnąć, czy może w głównym jakoś zapisać wartość poprzednią tylko tak żeby urzymywana była dopóki poprzedni cykl pomiarowy się nie spończy, a potym nadpisać tą zmienną kolejną wartościa pomiaru i ją trzymać, itd, .. kurde może pętlę zrobię.
    Albo jakoś drugie przerwanie i tam coś takiego zrobić :D
    tak wgl to po przerwie wracam do tematu https://www.elektroda.pl/rtvforum/topic3142216-30.html#15320246 i kontynuuję, więc Dondu, program jest tutaj pod tym linkiem :D
  • Użytkownik usunął konto  
  • Poziom 4  
    nie nie, jadę robotem i mierzę odległość bocznym czujnikiem od ściany, jak zauważę skok napięcia czyli koniec ściany (obiektu) oznacza to możliwą wolna przestrzeń w którą mogłabym wjechać, muszę tylko ocenić czy przestrzeń ta jest wystarczająco duża abym się zmieściła. Stąd odczytanie różnicy napięć z bieżącego i poprzedniego cyklu - skok wartości oznaczający początek jakiejś luki pomiedzy obiektami. Tym samym sposobem koniec tej luki :D

    To mówisz w tym samym przerwaniu odczytać wartość, lub zapisać wartość bieżącą z czujnika do jeszcze jednej zmiennej? może zanim wejdę ponownie w przerwanie to jeszcze ta wartość zostanie jakoś w tej drugiej zmiennej i będę mogła porównać, zanim się uaktualni

    Dodano po 41 [minuty]:

    chyba że zadeklaruje po prostu w przerwaniu od razu prevADC = CurrentResult (czyli wskazanie z czujnika) a dalej w tym przerwaniu będzie sie wykonywał pomiar bieżący, który będzie odczytany jako wynik w programie głównym, a potem po ponownym wejściu do przerwania znów zmienna prevADC nadpisze się tą wartością i nastąpi dalszy pomiar w przerwaniu itd, także uzyskam podtrzymanie poprzedniej wartości do momentu kolejnego wykonania przerwania. To serio byłoby takie proste? xD
  • Użytkownik usunął konto  
  • Poziom 4  
    no właśnie tylko tą zmianę najpierw muszę uchwycić zapamiętując jakoś wartość z ADC o cykl wcześniej i porównując z bieżącym, jeśli w poprzednim cyklu była mniejsza wartość a w bieżącym jest nagle większa to znaczy że nastąpiła zmiana, tylko jak tą poprzednią zapamiętać to nie wiem
  • Użytkownik usunął konto  
  • Poziom 4  
    wracam po krótkiej przerwie. Piotruś dziękuję za odpowiedź :) sęk w tym że wykorzystałam już wszystkie timery procesora i teraz zastanawiam się jak tu zliczyć czas bez timerów, nie wiem czy zwykła inkrementacja zmiennej załatwi sprawę
  • Moderator Mikrokontrolery Projektowanie
    Wybierasz timer, który Ci pasuje, a który ustawiłaś na stały okres. Ustawiasz przerwanie od przepełnienia tego timera, a w przerwaniu za pomocą lokalnej zmiennej static zliczasz czas i reagujesz wtedy, gdy uznasz za stosowne.

    ... albo kombinujesz jak zwolnić któryś z timerów.
  • Użytkownik usunął konto  
  • Poziom 4  
    hmm no dobra, czyli po prostu mogę w tym samym przerwaniu dać inkrementację zmiennej? A jeśli mam licznik ustawiony w tryb CTC, pracujący z częstotliwością 1kHz i faktycznie przerwanie od przepełnienia, to ta zmienna będzie się inkrementowała z taką właśnie częstotliwością tak? czyli 1kHz=0,001s, więc jeśli chcę odmierzyć 1 sekundę to w programie głównym tą zmienną odczytuję i mnożę przez 1000 aby mieć sekundę, mam rację? :D
  • Użytkownik usunął konto  
  • Poziom 4  
    nie no zaraz, przecież Hz to odwrotność sekundy, więc 1000Hz = (1/1000)s czyli 0,001s. Aby mieć sekunde no to mnożę ten wynik przez 1000, nie dzielę, tylko mnożę :D
    Jak tak zrobiłam to miga mi dioda (test), a jak dzielę to nie miga, podejrzewam że właśnie za 2 tygodnie by mignęła :D
    Nie wiem już sama
  • Moderator Mikrokontrolery Projektowanie
    Jeśli przerwanie wykonuje się 1000 razy na sekundę, to do ilu trzeba w przerwaniu doliczyć, by minęła sekunda? :)

    Opisz dokładnie co chcesz zrobić, bo nie za bardzo rozumiem z czym masz problem.