• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Obsługa przerwań w Arduino Mini PRO
#4
(24-08-2023, 20:17)kaczakat napisał(a): Bardziej precyzyjnie można mierzyć czas między impulsami, jeśli jest ich kilka/s, bo inaczej, by to miało sens, trzeba wydłużyć czas pomiarowy i czas reakcji mocno rośnie.

To jest właściwa uwaga - do pomiaru czasu pomiędzy impulsami można wykorzystać wejście (funkcję) timerów - ICP - czyli możliwość zapamiętania stanu licznika/timera w momencie zmiany stanu wejścia ICP. Wartość ta jest pamiętana w dedykowanym rejestrze (i tak tkwi - więc jest sporo czasu na reakcję) i dodatkowo zgłaszane może być przerwanie. Potrzeba jeden z timerów ustawić na pracę w maksymalnym zakresie w kółko i podłączyć sygnał z przepływomierza na jego wejście ICP. W przerwaniu odczytuje się rejestr ICP, odejmuje poprzednią wartość a aktualną zapamiętuje. Gdy impulsy mogą mieć przerwy dobrze jest zabezpieczyć się wprowadzając przerwania od przepełnienia licznika - będą odmierzały "kolejne cykle licznika" i ewentualnie obsługiwały braki impulsów. Trochę podobnie działa licznik od roweru lub odbiornik IR. Konkretne nastawy timera można obliczyć na podstawie tego, czego spodziewasz się na wejściu - jakich przepływów oczekujesz.

Z kolei przy sterowaniu wiatraka można zastosować histerezę - różne wartości progów dla włączania i wyłączania. Jest pewien zakres gdy "nic się zmienia, obojętnie czy wiatrak jest włączony czy nie.". W ten sposób unikniesz "szamotania" wiatrakiem, co zwykle szybko niszczy różne urządzenia.

Natomiast co do pokazanego pierwotnie kodu: jest tam błąd (przynajmniej ja taki zauważyłem):
  1. w jednej linii (uwaga do adminów - czy kody mogą mieć numerowanie linii) czyta się zmiennią flowCount: woda = flowCount;
  2. Potem coś tam jest wypisywane serialem (co trwa).
  3. Znowy trochę dalej jest sprawdzenie czasu i ewentualne zerowanie flowCount.
Jeśli w czasie pomiędzy 1 a 3 (a nie jest mały) wystąpi przerwanie i zwiększy się flowCount to program tego nie odnotuje. Skasuje zmienna, której wartości jeszcze nie odczytał.
Tak na szybko należy zamienić miejscami czynności 2 i 1. A najlepiej byłoby wprowadzić symetrie - skoro w przerwaniu inkremetuje się, to w kodzie powinno się dekrementować. Ale to wymaga większych zmian.

I jeszcze drobiazg - nie należy wołać funkcji sprawdzających czas wielokrotnie w "jednym obiegu pętli" - wynik może się w międzyczasie zmienić. Przeczytać raz i skopiować już uzyskany wynik.
 
Odpowiedź
  


Wiadomości w tym wątku
Obsługa przerwań w Arduino Mini PRO - przez Arpl - 24-08-2023, 18:32
RE: Obsługa przerwań w Arduino Mini PRO - przez oscarX - 09-09-2023, 18:55

Skocz do:


Przeglądający: 1 gości