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

Opóźnienie między odczytami z sensora mimo użycia delay(1) nie trwa 1ms(arduino)

08 Paź 2021 23:08 480 9
REKLAMA
  • #1 19646847
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #2 19646880
    kicajbas
    Poziom 32  
    Posty: 1288
    Pomógł: 216
    Ocena: 144
    Witam
    chmurka99 napisał:
    do (klona arduino) pomiaru co 1ms, dlatego używam funkcji delay(1)

    Ale zdajesz sobie sprawę, że funkcja _delay(x) nie służy do generowania taktu a do wstrzymywania programu na "x" ms?
    Zresztą mówimy tu o "jakimś wirtualnym programie" więc trudno się nawet odnieść.

    Pozdr.
  • #3 19646889
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #4 19646914
    kicajbas
    Poziom 32  
    Posty: 1288
    Pomógł: 216
    Ocena: 144
    chmurka99 napisał:
    użyte jest interval - timeElapsed (jak dla mnie starczyłoby samo timeElapsed)

    Ja co prawda "coś tam piszę" w języku C, ARDUINO do mnie nie przemawia, ale to działanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ma sens ponieważ zakładasz jaki ma być interwał, czyli takt, od tego czasu odejmujesz czas jaki potrzebuje uC do wykonania funkcji/pętli czy co tam jeszcze i Ci wychodzi ile ma być tej pauzy.
    Np.: potrzebujesz takt co 10ms, pętla trwa 2ms więc aby utrzymać zakładane 10ms _delay musi trwać 8ms - łapiesz?
    Czyli jeśli chcesz co 1_ms musisz zejść z delay'em do poziomu 400_us.
    Nie wiem czy ARDUINO takie coś obsługuje.

    Pozdr.
  • REKLAMA
  • #5 19646925
    Konto nie istnieje
    Poziom 1  
  • #6 19646951
    krzysiek_krm
    Poziom 40  
    Posty: 4612
    Pomógł: 716
    Ocena: 598
    Moim zdaniem zamiast tych skomplikowanych wygibasów lepiej jest po prostu zrealizować takt 1 ms (ewentualnie, ze względu na lepszą rozdzielczość 1000 µs), można sobie twórczo zmodyfikować przykład pod tytułem "blink without delay".
    Jeżeli czas pomiędzy odczytami ma być odmierzany bardzo dokładnie można wyzwalanie odczytu zrealizować w przerwaniu timera.
  • REKLAMA
  • #7 19647022
    jarek_lnx
    Poziom 43  
    Posty: 22562
    Pomógł: 4166
    Ocena: 6038
    Filtracja cyfrowa z biblioteki EMGFilters wykonuje wiele operacji mnożenia na danych zmiennoprzecinkowych, na takim powolnym, 8-bitowym mikrokontrolerze i bez wsparcia sprzętowego, jest to karkołomne zadanie i obliczenia muszą dosyć długo trwać.

    Delay zatrzymuje wykonywanie pętli na 1ms, a obieg pętli trwa "czas wykonania obłiczeń" + 1ms co oczywiście nie może być równe 1ms

    EMGFilers:
    https://github.com/oymotion/EMGFilters/blob/master/EMGFilters.cpp
  • #8 19647674
    kicajbas
    Poziom 32  
    Posty: 1288
    Pomógł: 216
    Ocena: 144
    Witam
    chmurka99 napisał:
    ...ale nie rozumiem czemu to ma być akurat 400us.

    No to 400us było tylko taką propozycją "z kapelusza", wcześniej próbowałem Ci - jak widać bezskutecznie - wyjaśnić algorytm tego wyliczenia.
    k.k. krzysiek_krm i jarek_lnx nakierowali Cię na lepszą drogę wyznaczania stałych czasowych.

    Pozdr.
  • #9 19648032
    Konto nie istnieje
    Poziom 1  
  • #10 19648836
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ Użytkownik zmagał się z problemem opóźnienia między odczytami z sensora podłączonego do klona Arduino, mimo użycia funkcji delay(1), co skutkowało rzadziej wykonywanymi pomiarami. Odpowiedzi sugerowały, że delay() nie jest odpowiedni do precyzyjnego taktowania, a zamiast tego proponowano wykorzystanie timerów lub modyfikację kodu z przykładu "blink without delay". Użytkownik ostatecznie zastosował timer, co poprawiło działanie systemu. Wskazano również na wpływ czasu wykonywania obliczeń na częstotliwość odczytów.
Wygenerowane przez model językowy.
REKLAMA