AVR i pomiar okresu

Sep 10, 2009 8 Replies

W jaki sposób ustawić timer w powiedzmy Atmega8, żeby jak najdokładniej mierzyć czas pomiędzy dwoma kolejnymi impulsami? Wiem że jest taki tryb pracy timera, ale coś nie mogę załapać jak go skonfigurować. Teraz wykonuję to zadanie używając INT0 w którym odczytuję TCNT1 i odejmuję jego poprzednią wartość. Niestety jest to dosyć niedokładne, bo o ile na oscyloskopie mam stabilny przebieg, to przy 2000Hz zmierzona przeze mnie częstotliwość waha się w zakresie kilkudziesięciu Hz (i to jest też max tego co potrzebuję mierzyć, zależy mi za to na dokładności i szybkości pomiaru, nie mogę uśredniać).



Dariusz Żołna


A jak zbocza sygnału?? Ostre?? Bo bez tego, to możesz mieć różny moment wejścia do przerwania... w czym piszesz? w C czy w gołym ASM? Są jakieś fragmenty kodu, na czas których blokujesz przerwania?? Spróbuj od razu po wejściu do procedury przerwania przełączać jakiś pin... ciekawy jestem,czy ten przebieg też będzie stabilny... I napisz jeszcze z jaką częstotliwością popędzasz ten timer....

Pozdrawiam Konop

Konop pisze:

Sygnał jest uformowany, zbocza ostre. Piszę w gcc, przerwań nie blokuję niczym innym oprócz ich własnych procedur. Kwarc 16MHz, dzielnik 256, czyli zegar taktuję 62500Hz. Z tym przełączaniem pinu dobry patent, podepnę drugi kanał i sprawdzę co się dzieje.

Dariusz Żołna

U¿ytkownik "Dariusz Zolna" snipped-for-privacy@usenet.com napisa³ w wiadomo¶ci news:h8bnls$jk0$ snipped-for-privacy@inews.gazeta.pl... Konop pisze:

Sygna³ jest uformowany, zbocza ostre. Piszê w gcc, przerwañ nie blokujê niczym innym oprócz ich w³asnych procedur. Kwarc 16MHz, dzielnik 256, czyli zegar taktujê 62500Hz. Z tym prze³±czaniem pinu dobry patent, podepnê drugi kana³ i sprawdzê co siê dzieje.

Dariusz ¯o³na

My¶lê, ¿e najpro¶ciej to nie odejmowaæ TCNT1, tylko odczytywaæ, a dok³adniej przepisaæ do pamiêci, po czym wyzerowaæ TCNT1 i wyj¶æ z obs³ugi przerwania. Licznik liczy od zera wtedy.

Druga wa¿na sprawa, TCNT1 jest 16bitowym czyli masz max 65535 zliczeñ. Trzeba tak dobraæ preskaler zegara, ¿eby dla tych 2kHz liczba zliczeñ taktów zegarowych by³a "spora" czyli w okolicach powiedzmy 60000. Nie napisa³e¶ jaki masz zegar w tym ATmega. Najlepiej jaki¶ stabilny kwarc. Masz do wyboru podzia³ na: 1,8,64,256,1024

Zak³adaj±c, ze masz zegar 8MHz to okres dla 2kHz to 0,0005s Dla preskalera przez 1 czyli dla zegara bezpo¶rednio da to zaledwie

4000 zliczeñ.co daje rozdzielczo¶æ ok. 0,5Hz Jak dasz kwarc 16Mhz to bêdziesz mia³ 2 razy wiêcej zliczeñ. Osi±gniesz wtedy 0,25Hz Ale oczywi¶cie o ile sygna³ jest stabilny.

Druga metoda, to w przerwaniu zliczasz okre¶lon± liczbê impulsów, na przyk³ad 16. Dopiero po zliczeniu odczytujesz licznik i go zerujesz do nastêpnego pomiaru. Wtedy dla zegara 8MHz dostaniesz 64000zliczeñ. Wtedy rozdzielczo¶æ bêdziesz mia³ wiêksz±, ale kosztem czasu pomiaru. Ale pomiar bêdzie trwa³ "tylko" 0,008sek. Mo¿e to wystarczy

Zbyszek

(pisa³em to wcze¶niej ale siê nie wys³a³o...)

U¿ytkownik "Dariusz Zolna" snipped-for-privacy@usenet.com napisa³ w wiadomo¶ci news:h8bnls$jk0$ snipped-for-privacy@inews.gazeta.pl... Konop pisze:

Sygna³ jest uformowany, zbocza ostre. Piszê w gcc, przerwañ nie blokujê niczym innym oprócz ich w³asnych procedur. Kwarc 16MHz, dzielnik 256, czyli zegar taktujê 62500Hz. Z tym prze³±czaniem pinu dobry patent, podepnê drugi kana³ i sprawdzê co siê dzieje.

Dariusz ¯o³na

W sumie masz odpowied¼, bo jak 16MHz podzielisz na 256 i policzysz impulsy dla jednego okresu 2KHz to wyjdzie raptem 31 zliczeñ, czyli rozdzielczo¶æ raptem 2000Hz/31 -> 64Hz

Daj z dzielnikiem 1

Zibias pisze:

No i super, dzięki, błąd przy najwyższych częstotliwościach nie wynosi teraz więcej niż 3Hz, co jest w pełni akceptowalne. Jak to człowiek czasem się zakałapućka i nie pomyśli o takiej prostej sprawie :) Ja szukałem problemów raczej w czasie wykonywania procedury przerwania lub kolizji przerwań :)

Pozdrawiam, Dariusz Żołna

Dariusz Zolna pisze:

Skorzystaj z "Input Capture Unit" Timera 16-bitowego.

pzdr mk

Dariusz Zolna pisze:

No to już wiesz czemu o to pytałem ;)... A zapytam - robisz teraz tak, że odczytujesz i zerujesz, czy dalej coś odejmujesz?? Jeśli odejmujesz - to pamiętaj, że jest to metoda dobra, gdy później uśredniasz wynik... sądze, że w Twoim przypadku odczyt-zerowanie da lepszą stabilność wyniku ;)...

Pozdrawiam Konop

Konop pisze:

Dzięki. Muszę odejmować, bo mierzę 2 sygnały a 16-btowy timer jest jeden.

Dariusz Żołna

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required