Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATMEGA32] niedokładny pomiar czasu- spieszy

Pitplane 18 Jan 2011 18:27 2585 17
Relpol
  • #1
    Pitplane
    Level 9  
    Witam wszystkich w swoim pierwszym poście :)

    Wydawało mi się, ze moge znaleźć na kazde pytanie odpowiedź, ale jednak zmuszony jestem do napisania nowego tematu.

    Otóż walczę z problemem dokładności chyba z miesiąc. Układ co 1min ma załączać na okreslone czasy przekaźniki.
    Używam kwarcu 14,7456Mhz a układ notorycznie SPIESZY się o ok 0,5s na godzinę. Bawiłem się z recznym dopasowaniem, ale wymagało to zmian TAU o wartości 7-10 a dokladnosci pełnej brak.No i chyba nie o to chodzi zeby regulowac to przez tydzien, skoro jest to czysta matematyka a kwarce są w miare dokładne! :)
    Rozumiem ze zrobiłbym coś "na około" i późniłby, ale on spieszy.

    Wiem ze jest DS1307 , ale mój układ jest takim układem od którego zacząłem "zabawe" i sądziłem jednak ze uda mi się uzyskać dokładność do +/- kilku(nastu) sekund na miesiąc, korzystając z podstawowych elementów.

    Najpierw program pracował na timerze 16bit w trybie przepełnienia, ale kilka dni temu doczytałem ze lepiej gdy chodzi w CTC wiec nieco przerobiłem kod.

    W zasadzie nie zauważyłem różnicy w pracy miedzy trybami. Jak spieszył, tak spieszy i chyba dokładnie tyle samo.

    Czy rzuca się Wam coś w oczy co powoduje to spieszenie się timera?

    
    
    unsigned char sek=1;
    
    ISR (TIMER1_COMPA_vect) {
    
    
       if(--sek==0) {         //jesli minela minuta, to
          sek=60;             //ustaw kolejna minute
          
          (zrób....)
       
    } 
    
    
    int main(void) {
    
        DDRB=0x07;
        TCCR1B |= (1 << WGM12);  // Ustawia timer w tryb CTC - mode 4
        TCCR1B |= (1 << CS12);     // preskaler=256
        OCR1A = 57600;
        TIMSK |= (1<<OCIE1A);      // wlaczenie przerwan CompareMatch 
        
       sei();
    
       while(1) {
    
       }
    }


    Bardzo proszę o sugestie, kod jest prosty jak budowa cepa i mam nadzieje ze to nie przez to spieszy :)

    Pozdrawiam
    Piotr
  • Relpol
  • #2
    remiorn
    Level 18  
    Błąd jest na poziomie 10e-4.
    Taki błąd przy kwarcach nieznanego pochodzenia (kupionych w elektronicznym) może się zdarzyć, aczkolwiek nieczęsto.
    Jeśli masz możliwość, to zmierz częstotliwość generatora

    Na pewno:
    [quote="Pitplane"]
    
    
        OCR1A = 57600;
    
    }


    Co prawda przez to powinien spóźniać, ale zdaje się powinno być 56599.

    Spodziewany błąd powyższego będzie nieco mniejszy niż 0,1sek/godz.
  • Relpol
  • #3
    yego666
    Level 33  
    Przyjmij, ze masz kwarc o f=14747648 Hz zamiast 14745600 Hz , lub cos podobnego jesli posiadasz dokladna wartosc odchylki godzinowej i na tej podstawie ustaw dzielniki.
    Kwarc moze miec odchyl fabryczny, a moze tez zmieniac f w zaleznosci od temperatury, cisnienia, pojemnosci kondkow, etc, etc.
    Nasz swiat niestety daleki jest od idealu... i dlatego istniejemy ;)
  • #4
    Pitplane
    Level 9  
    Witam ponownie,

    Faktycznie nie dopisałem, ale korzystam z 3 rodzajów kwarców :) Jeden kupiony w elektronicznym, potem dokupiłem 2 inne w TME (mała obudowa i standardowa). Różnic między pracami na tych kwarcach nie zauważam.
    Dlatego też nie wiem czy można przyczepić się do kwarców :(

    Pozdrawiam
    Piotr

    edit YEGO

    Faktycznie nie pomyślałem ze różnicę czasu można "dodać" do wartości kwarcu.

    Tylko czy wszystkie w handlu spieszą? Z różnych źródeł je mam.
  • #7
    janbernat
    Level 38  
    To:
    (zrób....)
    jest najciekawsze.
    Co on tam robi w przerwaniu.
  • #8
    User removed account
    User removed account  
  • #9
    Pitplane
    Level 9  
    :)
    w przerwaniu zlicza czas i uruchamia przekaźniki. Nie wpisywałem aby "nie zaciemniać" obrazu zbytecznymi rzeczami :)

    A co do układu :) Oczywiście tuż przy kwarcu 14,7456Mhz siedzą 2 kondensatory 18pF. A kwarc tuż przy procku. Płytka i elementy przewlekane.

    Pozdrawiam
    Piotr
  • #10
    User removed account
    User removed account  
  • #12
    Pitplane
    Level 9  
    Witam

    Wcześniej napisałem tylko co zrobiłem, bo było podejrzenie ze poniosła mnie fantazja

    Co do noty, przeczytałem dopiero teraz. NIe powiem, interesujące.
    Ale wszystko się nieco rozjeżdza.
    Na moim datasheet od kwarcu
    http://www.tme.eu/dok/a09/hc49.pdf
    czytam C = 10-75pF

    Atmega przy praweie wszystkich f podaje 12-22pF

    A nota ST do przykładu mojego kwarcu 20pF (rozdz 6.1.4)

    Użyłem 18pF, nie znam Cs, ale nie wygląda aby popełnił jakies straszne fopaux.

    Po nocie z ST zauwazylem ze wartość C jest istotna, ale wniosku nie potrafię z tego galimatiasu wyciągnąć. Każdy pisze co chce.

    Pozdrawiam
    Piotr
  • #13
    dondu
    Moderator on vacation ...
    Nie czytałem dokładnie tematu, ale przedstawię jak ja kiedyś sobie poradziłem z podobnym przypadkiem.

    Problem: spieszy o 0,5 sek/h

    Policzmy jaką masz odchyłkę na 1 godzinę w taktach zegara:
    0,5 sek * 14.745.600taktów / 1h = 7.372.800 taktów/h

    A ponieważ robisz w tym czasie 3600 przerwań, a każde odlicza 256 taktów to oznacza, że na każde przerwanie (każdą sekundę) masz odchyłkę:

    7.372.800 taktów / 3600 / 256 = 8 taktów

    czyli za każdym przerwaniem masz błąd 8 taktów zegara.




    Jak to rozwiązać?

    Trzeba tak ustawić preskaler i wartość OCR1A by zniwelować błąd.
    Jeżeli nie można tak dobrać tych 2 parametrów by było OK to musisz wprowadzić zmienną X odliczającą wartości ułamkowe jednej sekundy, na której będziesz mógł co N-te przerwanie, dokonać poprawki poprzez odjęcie np. 1. A sekundy zwiększysz dopiero gdy X osiągnie odpowiednią wartość.

    Innymi słowy masz wszelkie narzędzia by znacząco zwiększyć dokładność odmierzania czasu.
  • #14
    Pitplane
    Level 9  
    Naturalnie, tak tez zrobiłem, ale tak byc nie powinno :)
    W koncu kwarc to nie RC. Jest kalkulator, procesor, program... matematyka :)

    Pozdrawiam
    Piotr
  • #15
    dondu
    Moderator on vacation ...
    To nie rozumie, o co Ci chodzi.

    Kwarce mają swoje odchyłki, są także sytuacje gdzie na rynek trafia partia, która nie powinna się na nim znaleźć - samo życie.

    W kodzie masz:
    if(--sek==0) {         //jesli minela minuta, to 
          sek=60;             //ustaw kolejna minute 
          
          (zrób....) 

    czyli żadnych poprawek.

    A na końcu piszesz, że masz cyt. galimatias

    Jeżeli załatwiłeś już sprawę to zamknij temat (i oszczędź czasu innym), a jeżeli nadal masz błąd to pokaż kod, o którym piszesz, że zrobiłeś w nim poprawkę.
  • #16
    Pitplane
    Level 9  
    Chyba się nie rozumiemy :)

    Poprawka naniesiona w OCR1A. Chodzi dokładniej, ale to ze mozna ustawić to ręcznie od dawna wiedziałem. NIe wpadłem na "doliczanie" Hz do kwarcu na podstawie różnic w czasie.

    Ale moim zdaniem to nie o to tu chodzi. Jesli przy kwarcu muszą być C takie a nie inne i to one powodują ze układ się rozjeżdża w czasie, to liczyłem na jakąś sugestię. Dziś zrobiłem na 14Mhz kwarcu. Jutro bede chciał zrobić na 8Mhz i tez bede musiał zapuszczać układ na dobe i sprawdzac jego opóźnienie aby recznie ustawiac OCR1A ?

    Z tego co wyczytałem w notach o kondensatorach nic w prostej lini nie wynika i dalej nie widze problemu który moglem popełnić przy doborze wartości C przy kwarcu.

    Mieszcze się w widełkach, ale ktoś zasugerował ze o widełkach nie ma mowy. Musi być dokładnie i precyzyjnie. Niestety nie widze zadnego wzoru który wylicza C z czestotliwosci kwarcu.

    unsigned char sek=1;
    
    ISR (TIMER1_COMPA_vect) {
    
    
       if(--sek==0) {         //jesli minela minuta, to
          sek=60;             //ustaw kolejna minute
         
          (zrób....)
       
    }
    
    
    int main(void) {
    
        DDRB=0x07;
        TCCR1B |= (1 << WGM12);  // Ustawia timer w tryb CTC - mode 4
        TCCR1B |= (1 << CS12);     // preskaler=256
        OCR1A = 57607;
        TIMSK |= (1<<OCIE1A);      // wlaczenie przerwan CompareMatch
       
       sei();
    
       while(1) {
    
       }
    }
    


    Pozdrawiam
    Piotr
  • #17
    dondu
    Moderator on vacation ...
    Ten (standardowy) kryształ ma tolerancję ±50ppm, czyli ±50 taktów na każdy milion
    co przy jego 4MHz daje ±200 taktów/sek
    http://pl.farnell.com/raltron/a-4-000-18/krysztal-4m-18pf-cl-hc49-u/dp/1611758

    Co do kondensatorów przy kwarcu, to z mojego doświadczenia wynika, że zakres podawany w datasheet nie wpływa znacząco na częstotliwość odmierzaną przez kwarc. Pamiętaj, że kondensatory mają także swoje tolerancje.

    Wykorzystywanie poprawki programowej jest jak najbardziej poprawne.

    Zrobisz jak będziesz chciał.
    Powodzenia.

    Dodano po 4 [minuty]:

    Pitplane wrote:
    Dziś zrobiłem na 14Mhz kwarcu. Jutro bede chciał zrobić na 8Mhz i tez bede musiał zapuszczać układ na dobe i sprawdzac jego opóźnienie aby recznie ustawiac OCR1A ?

    To się nazywa kalibracja :D
    Zmieni się temperatura i juz czas będzie inny. Od napięcia zasilania to także zależy.
    To od Ciebie zależy z jaką dokładnością musisz się zmierzyć.
    Dlatego podałem Ci wyżej link jak kalibrować na 2 timerach - niestety sam jeszcze tego nie robiłem.

    Tak a propos, to jeżeli masz Windows XP - zobacz dokładnie jak skacze wskazówka sekundowa standardowego zegara. Co 5 sek zatrzymuje się na dłużej :D
    Przynajmniej w 3 komputerach które mam tak jest.
  • #18
    Pitplane
    Level 9  
    Widze, w takim razie ze mój "problem" wyniakał bardziej z nastawienia (siebie).
    Spodziewałem się raczej dużej dokładności z racji zastosowania kwarcu i procesora.

    Wniosek dla mnie płynie z tego taki , że dokładność jest trochę "picem" trzeba to jeszcze ustawiać ręcznie.
    Mozna tez chyba próbować z wolniejszymi kwarcami (8Mhz?) lub nawet zegarkowym. Może nawet to lepsza droga?

    Przy kwarcu 14,7456 mozna raczej zapomniec o dokładności timera odliczanej w ciągu kilku godzin.

    Pozdrawiam i dziękuję za poświęcony czas :)
    Piotr

    P.S. Rzeczywiscie zegarek w XP chodzi jak piszesz :)