Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 sty 2025, o 07:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 30 cze 2014, o 02:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Witam

Temat stary jak świat. Wiele rozwiązań... Wszystkie sprowadzają się do liczenia impulsów (zboczy) w jednostce czasu (dla niskich częstotliwości metoda jest odwrotna i polega na pomiarze czasu między zboczami, ale to inny temat).
Postanowiłem sobie zbudować częstościomierz, więc coś na szybko sobie "skleiłem".
Zresztą posiłkowałem się dawnym projektem autorstwa kolegi Janeczqu. ;)

Obrazek

Schemat oczywiście orientacyjny aby pokazać o co chodzi. Nie robię jeszcze docelowego projektu bo zatrzymałem się na głupim (dziwnym) problemie.

oto kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


inicjalizacja timerów:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak widać nie ma tu nic dziwnego. Są ślady po moich próbach mieszania operacjami wyłączania przerwań (obecnie zarzucone bo nic nie zmieniało).
Problem polega na tym, że częstotliwość (czyli ilość impulsów zliczonych w ciągu sekundy) jest zaniżona.
Wzorzec sekundy aktualnie pobieram z przerwania generowanego przez RTC.
Próbowałem również wytworzyć wzorzec sekundy przy użyciu Timera0. Jednak błąd był jeszcze większy.

Co prawda nie posiadam pewnego częstościomierza do porównania, jednak źródła testowych przebiegów na których pracuję to scalone generatory TTL o różnych częstotliwościach.
Jako że stosuję licznik 74LS393 dokonujący podziału przez 16 ilość impulsów mnożę razy 16 w kodzie. Myślałem, że to jest źródłem błędu. Jednak nie. Podałem np. 3,6864MHz bez podziału na wejście T1 i błąd był taki sam. Przy tej częstotliwości jest to odchylenie o około 1 kHz w dół. Jak na mój rozum zdecydowanie za dużo jak na takie źródło, którego ideą jest dokładność.
Przy większych częstotliwościach błąd rośnie proporcjonalnie. Przy 50MHz jest już około 12-13 kHz.

Jednocześnie wskazanie częstotliwości jest dość stabilne, czasem zmieni się o kilka - kilkanaście Hz, ale to już jest w granicy dokładności generatora, poza tym kwarc w RTC też może nieco się wahać. Gdyby źródłem błędy był RTC (wzorzec sekundy) to oznaczałoby to, że spieszy się około 1 sekundy na godzinę. A jego dokładność (doświadczalnie sprawdzone) to koło 1 s. na dobę.

Zastanawiam się nad tym co może być przyczyną. Oczywiście może jutro uruchomię duży radziecki częstościomierz i porównam. Jednak powtarzalna odchyłka, proporcjonalna do częstotliwości sugeruje błąd w zliczaniu impulsów w moim układzie. Jednak nie przychodzi mi do głowy co można, w tak prostym przykładzie, zrobić inaczej...

Przyszło mi już do głowy, że zbocza przebiegu TTL z generatora są za mało strome i jakiś ich ułamek się gubi na EDGE DETECTOR, który jest na wejsciu T1 w MCU. Zrobiłem więc test z układem 74HC14 (negator z wejściem Schmitta) przed a później po dzielniku. Zresztą tak jak sądziłem nic to nie zmieniło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2014, o 06:46 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27346
Lokalizacja: Szczecin
Pomógł: 1041

Twój podstawowy błąd to po prostu całkowicie złe podejście do tego wzorca sekundy :( i w ogóle tego że próbujesz to robić na takich flagach .... przez co tracisz kupę czasu na PROLOG i EPILOG przerwań przecież

gdzieś w którymś wątku na forum ale też na 100% w którymś z poradników wideo tłumaczę i pokazuję, że w książce ten mechanizm flagi, gdzie w przerwaniu INTx ustawiam zmienną

flaga=1;

opisałem po to aby każdy zrozumiał na tak prostym przykładzie o co chodzi z tymi flagami. Tam gdzie nie zależy na czasie można tak robić chociaż po co ? skoro mamy przecież FLAGI SPRZĘTOWE przerwań - więc nawet w takich przypadkach nie musimy tracić pamięci RAM. Zajrzyj proszę do noty do rejestru FLAG dla INT1 ;) dla m32 jest to rejestr GIFR w którym masz 3 flagi dla 3 przerwań INT ;) i już bez żadnej procedury przerwania w pętli głównej mógłbyś się posługiwać tą flagą sprzętową zamiast zmienną flaga1

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To już jest o wiele szybsze niż mechanizm z tym flaga=1; bo odpada ci obsługa przerwania, jego prolog i epiliog a to przecież ZJADA (powiedziałbym nawet, że) wpiernicza w takim wypadku MNÓSTWO cykli zegara - do tego jeszcze próba zliczania tego w pętli głównej ... a nie za pomocą sprzętową - to jak sam widzisz powody, nie malutkich, a ogromnych niedokładności.

No ale też dziwię się że do celów zbudowania częstościomierza nie wykorzystasz np wejść licznikowych np T0 ? Przecież można wtedy zrobić podstawę czasu na jednym timerze a na timerze zerowym zliczać impulsy przez wejście T0 ... w necie można spotkać setki takich częstościomierzy opisanych - zobacz np:

http://www.svet-el.si/english/index.php ... /44-avr185

albo:

http://eesite.bitbucket.org/html/electr ... /fmtr.html

ale jak się wpisze hasło "avr frequency meter" to wyskoczy ci mnóstwo linków do podobnych rozwiązań i można sobie podpatrzeć jakieś podejście


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2014, o 12:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

No faktycznie nie przyszło mi do głowy, że prolog procedury INT może mi tu psuć sprawę. Chyba bardziej prolog niż epilog, bo w toku prób wsadzałem nawet resztę operacji do procedury przerwania, epilog wykonywał się już po zatrzymaniu licznika T1.
Zaraz spróbuję tak zrobić jak mówisz. Bez przerwania, tylko z samą flagą.

Do liczenia impulsów używałem wejścia licznikowego T1, czyli timera1 16-bit. Ale może faktycznie lepiej zrobić liczenie impulsów na timerze0 (T0) a podstawę czasu na timerze1. Jako że timer1 jest 16 bitowy więc te przysłowiową sekundę można będzie dokładniej ustawić plus dobór odpowiedniej częstotliwości taktowania ze stabilnego źródła.
Zaraz spróbuję tak zrobić...

Dzięki Mirku :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2014, o 15:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

No, jest dużo lepiej:
Oto kod:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak widać pozostało tylko jedno przerwanie.
Przy testowej częstotliwości 3,6864 MHz stabilność jest do pojedynczych herców. Czasem coś tam skoczy o kilka herców, ale układ z testowym generatorem i dzielnikiem jest na stykówie ma długie kable więc może jakieś sysfy się czasem naniosą.
W zasadzie podobna dokładność jest przy przebiegu 50 MHz (mimo, ze dzielnik jest LS).

Występuje tylko drobny problem przy multipleksowaniu wyświetlacza, prawie niezauważalny, ale czasem tak jakby mignie jedna pozycja. Oczywiście wynika to, jak sądzę, z tego że jego obsługa nie jest w przerwaniu tylko przez flagę. I czasem się opóźni.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2014, o 20:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

A ja mam pytanie czy nie można by
zliczać impulsów w krótszym czasie
niż 1s np. 0,5s.

Nie wiem czy dobrze myślę ale mniejszy błąd
podstawy czasu byłby przy krótszych odcinkach odmierzanego czasu
ale dochodzi błąd ilości zliczanych impulsów (+/- 2 impulsy)

Można by to uzależnić od mierzonej częstotliwości
im większa tym krótsze odcinki np. 1/4 s przy 50MHz

Tylko nie wiem czy czasami nie przekombinowałem :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2014, o 23:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Zaba napisał(a):
A ja mam pytanie czy nie można by
zliczać impulsów w krótszym czasie
niż 1s np. 0,5s.

A no pewnie, że można. Przy częstotliwościach dużych stosuje się jeszcze krótsze czasy próbkowania. np. 0,1s albo nawet 0,01s A następnie przesuwa się przecinek. Powoduje to oczywiście ucięcie najmłodszych pozycji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO