Jeśli jeszcze aktualne
eiliat napisał: Zaloguj się, aby zobaczyć kod
W ten sposób to obliczasz częstotliwość sygnału, a nie wypełnienie. Powinno być raczej:
Zaloguj się, aby zobaczyć kod
przy czym wynik będzie raczej mało precyzyjny: dla sygnału wejściowego o którym pisałeś - od 0% do 10% z rozdzielczością 1%. Zastosowanie arytmetyki zmiennoprzecinkowej jest w 8-bitowych AVR zasobożerne, więc lepiej byłoby liczyć:
Zaloguj się, aby zobaczyć kod
i później w wyniku przesunąć przecinek o 2 miejsca w lewo. Zwiększy to rozdzielczość do 0,01%.
Manipulacja stanem licznika TCNT1 wewnątrz procedury obsługi przerwania Input Capture wprowadza pewien błąd. Będzie on w tym konkretnym przypadku wynosił ok. 3-4 mikrosekundy. W stosunku do okresu trwającego 20 000 mikrosekund to relatywnie niewiele, ale jeśli czasy trwania impulsu (stanu wysokiego) będą faktycznie zbliżone do zera, np. będą wynosiły kilkanaście/kilkadziesiąt mikrosekund, może to być błąd znaczący. Osobiście stosuję inną technikę wykorzystującą Output Compare do kontroli "przekręcenia" licznika.
Jeśli sprawa dotyczy sygnału sterującego serwem modelarskim, to czas trwania impulsu będzie się zawierał od ok. 1ms do ok. 2ms, i wtedy takie rozwiązanie będzie wystarczające (błąd praktycznie bez znaczenia). Poza tym w takim przypadku wypełnienie jest mniej istotne, ważniejszy jest czas trwania impulsu. W tym konkretnym przypadku zmienna
ts zawiera (bez konieczności przeliczania) czas trwania impulsu w mikrosekundach.