logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Jak] Autokalibracja zegara AVR

ky3orr 27 Paź 2009 15:02 1587 9
REKLAMA
  • #1 7181170
    ky3orr
    Poziom 11  
    witam wszystkich.

    pracuję nad zegarem, który napędzany jest licznikiem z autoprzeładowaniem dającym przerwania co 250us.
    na wejściu INT0 mam dostępny wzorcowy sygnał 1PPS.
    sygnał ten chcę wykorzystać do określania przez zegar swojego błędu i dokonywania korekty wartości którą przeładowywany jest licznik.

    zastanawiam się jak zabrać się za temat.
    mam taki koncept:

    -kalibracja powinna trwać kilkanaście-kilkadziesiąt sekund,
    -zliczam ilość przerwań i dodatkowo wartości timera w momencie pierwszego impulsu 1PPS i ostatniego,
    -wiedząc ile powinno być przerwań na 1s, znając liczbę impulsów 1PPS i wartości timera na początku i końcu pomiaru jakoś przeliczam błąd występujący na jedno przerwanie,
    -następuje korekta wartości ładowanej do timera i proces kalibracji zakończony.

    zastanawia mnie czy w ten sposób sie to robi i czy ktoś z Was ma za soba taki projekt.

    za wszelkie wskazówki serdecznie dziękuję

    pozdrawiam
  • REKLAMA
  • #2 7182104
    tmf
    VIP Zasłużony dla elektroda
    W przerwaniu INT0 odczytac wartosc timera popedzanego przez oscylator procka, przy nastepnym przerwaniu odczytac ponownie. Roznice T1-T0 porownac z wartoscia wyliczona teoretycznie. Im szybciej popedzasz timer tym dokladniejsza kalibracja, wystarczy jeden okres twojego sygnalu wzorcowego. Mozesz kalibrowac na tej podstawie timer, zeby miec przerwania co 250us, albo zegar procesora - jesli popedzasz go z RC to masz rejestr kalibracyjny dla tego generatora. BTW, Atmel wypuscil tez note aplikacyjna gdzie dokladnie opisuje ta technike, nie pamietam numeru AN, ale sobie wygooglujesz.
  • REKLAMA
  • #3 7184625
    ky3orr
    Poziom 11  
    @tmf dzięki za info.
    czy chodzi Ci o dokument AVR055: Using a 32kHz XTAL for run-time calibration of the internal RC?

    już go znalazłem.

    mam jednak wątpliwość: czy nie jest lepiej policzyć błąd występujący na jedno przerwanie, ale za większy okres? czy wtedy nie popełnię mniejszego błędu związanego z opóźnieniami na przechodzenie do procedury i obsługę przerwania?

    pozdrawiam
  • REKLAMA
  • #4 7184657
    Konto nie istnieje
    Poziom 1  
  • #5 7184689
    Freddie Chopin
    Specjalista - Mikrokontrolery
    atom1477 napisał:
    Obsługa przerwania ma niewiele do rzeczy, bo liczy się tylko powtarzalność. Jeżeli jedno przerwanie da opóźnienie powiedzmy 10 cykli to drugie też a więc równicy nie będzie.

    Będzie, bo jeśli rzeczywiste opóźnienie wynosi 10.1, to raz na dziesięć pomiarów zmierzone będzie 11, a nie 10. Należy się oczywiście zastanowić, czy zmierzenie tak precyzyjnej wartości ma sens, czy można ją zastosować "w praktyce", bo jeśli krok regulacji jest taki, że można skorygować przesunięcie o 10, 20, 30, ..., to zmierzenie czegokolwiek po przecinku nie ma sensu, bo żadna różnica, czy będzie to 9.9 czy raczej 10.1

    4\/3!!
  • REKLAMA
  • #6 7184716
    Konto nie istnieje
    Poziom 1  
  • #7 7184730
    ky3orr
    Poziom 11  
    dzięki za komentarze.

    faktem jest, że korektę chcę wykonać w miarę dokładnie, gdyż zegar napędzany generatorem kwarcowym 10MHz ma synchronizować się do sygnału 1PPS pochodzącego z wzorca atomowego, lub odbiornika GPS.

    myślę, że przeprowadzę testy polegające na obserwacji zmian co do wartości i czasu ustalania obliczonej korekty przy jednorazowych porównaniach dla 250us, 1s i kilku/kilkunastu s.

    pozdrawiam
  • #8 7185430
    tmf
    VIP Zasłużony dla elektroda
    A ten wzorzec ma jaka czestotliwosc? Jesli jest duzo mniejsza niz taktowanie zegara procesora to blad zwiazany z wchodzeniem i wychodzeniem z przerwania mozna pominac. Jesli to np. bedzie 1MHz, a mikrokontroler bedzie mial 10MHz to musisz zmienic koncepcje.
  • #9 7185722
    ky3orr
    Poziom 11  
    kolego @tmf pisałem wcześniej
    Cytat:
    zegar (..) ma synchronizować się do sygnału 1PPS pochodzącego z wzorca atomowego

    zatem niestety tylko 1PPS, za to bardzo stabilny krótkookresowo (źródłem jest aktywny maser wodorowy).

    mam nadzieję, że mi te próby przyniosą pożądane efekty :)

    pozdrawiam
  • #10 7186818
    Dr.Vee
    VIP Zasłużony dla elektroda
    atom1477 napisał:
    Obsługa przerwania ma niewiele do rzeczy, bo liczy się tylko powtarzalność. Jeżeli jedno przerwanie da opóźnienie powiedzmy 10 cykli to drugie też a więc różnicy nie będzie. Oczywiście przy dobrze zapisanej obsłudze przerwania (odczytanie wartości Timera na przed wykonaniem fragmentów kodu których czas wykonania może być różny (czyli przed wszelkimi If-ami czy pętlami).
    Gorzej z czasem wchodzenia w przerwanie (1…4 cykle) zależnie od aktualnie wykonywanej instrukcji w programie głównym.
    No i z tego powodu faktycznie lepiej dać dłuższy okres.


    Najlepiej wykorzystać mechanizm Input Capture. Timer 16-bit w trybie free running, przepełnienie sygnalizuje potrzebę zwiększenia licznika softwareowego - 16 bitów + 8 bitów daje > 16M taktów na sekundę. Sygnał 1PPS wyzwala input capture, które również generuje przerwanie. W przerwaniu sprawdzamy aktualny stan timera, wykonujemy ew. korektę na nadmiarowy impuls w najstarszych 8 bitach i mamy zliczoną dokładną liczbę taktów, bo opóźnienie ICP jest stałe.

    Pozdrawiam,
    Dr.Vee
REKLAMA