Dokumentacja micros () zauważa, że zwracana wartość zawsze będzie wielokrotnością 4.
Czy jest jakiś sposób na uzyskanie mikrosekundowego kliknięcia w wyższej rozdzielczości, najlepiej do poziomu 1 mikrosekundy?
Zejście do poziomu AVR jest dopuszczalne.
Odpowiedzi:
Tak, w zależności od podstawowej częstotliwości zegara Twojego Arduino. Na przykład tutaj są częstotliwości wejściowe licznika czasu i okresy po wstępnym skalowaniu, licznik 2 licznika ATMega2560 oraz podstawowa częstotliwość 16 MHz. Timer ma wbudowane opcje wartości „prescaler”, które określają częstotliwość / okres, pokazane w tej tabeli:
Aby uzyskać lepszą rozdzielczość czasową, użyj wartości o nazwie TCNT2. Istnieje wbudowany licznik, który zmienia się od 0 do 255, ponieważ zegar ma 8 bitów. Kiedy licznik osiągnie wartość przypisaną przez TCNT2, wyzwala przerwanie. To przerwanie nosi nazwę TIMER2_OVF_vect.
biorąc pod uwagę te informacje, wynikowa częstotliwość przerwań wyniesie: 16 MHz / (prescaler * (255 - TCNT2))
Możesz sprawić, aby zegar działał z pełną częstotliwością 16 MHz (62,5 nSek), ale jest to o wiele szybsze niż potrzebujesz; 2 MHz z początkową liczbą (255-2) dałoby Ci częstotliwość przerwań 1 MHz. Podziel to przez 2 w swoim ISR:
Arkusz danych MCU jest podstawowym zasobem; ten artykuł da ci (i dał mi!) dobry początek.
źródło
Mark, postanowiłem napisać nowy zestaw funkcji, oparty na Arduino Atmega328 Timer2 i używając przerwań przepełnienia, aby uzyskać precyzję do 0,5us. Mój kod jest dostępny do pobrania i wykorzystania tutaj:
http://electricrcaircraftguy.blogspot.com/2014/02/Timer2Counter-more-precise-Arduino-micros-function.html
Oto krótki opis: „Napisałem„ bibliotekę ”, aby uzyskać precyzję 0,5us na funkcji zastępowania„ micros () ”, dzięki czemu mogę uzyskać powtarzalne wyniki odczytu sygnału PWM lub PPM z dokładnością do 1us. Internet i nie mógł znaleźć czegoś porównywalnego (lub który był łatwy w użyciu i utrzymywał zdolność Arduino do zapisywania sygnałów PWM poprzez Servo Libary), więc myślę, że to mój pierwszy znaczący wkład w świat Arduino i Radio Control. ”
źródło
Jeśli obniżenie poziomu AVR jest dopuszczalne (jak wspomniałeś w swoim pytaniu), możesz ustawić minutnik, a nawet uzyskać tyknięcie zegara AVR.
Musisz odwołać się do arkusza danych AVR, ponieważ różni się on w różnych ATMegas i ATTinys. Ale procedura jest zawsze taka sama. Co musisz zrobić, to:
TCCR
W ten sposób można uzyskać dokładne tiki z rejestru timera, jednak trzeba przeliczyć przepełnienia ręcznie. Jest to tak precyzyjne, jak to możliwe dzięki technologii.
Oto przykładowy kod przestarzałego AT90S2313, ale daje on dobre wskazówki, co robić w zasadzie:
źródło
TIMSK
,TOIE0
etc (kopia konfiguracji timera z arkusza ATmega328P). Wygląda na to, że nie możesz użyć makra ISR (), zamiast tego użyj arduino.cc/en/Reference/AttachInterrupt .