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

Jak uzyskać precyzyjne przerwanie 1 kHz na ATmega8 przy 16 MHz?

Modecom601 17 Cze 2016 14:07 2766 32
  • #1 15749139
    Modecom601
    Poziom 13  
    Chcę uzyskać przerwanie INT0 lub timer od przerwania dokładnie 1kHz. Aktualnie medzia8 pracuje na 16MHz i ni w ząb nie idzie uzyskać precyzyjnie 1kHz wykonując jeszcze chociaż zmienna++ by odliczać czas 1 ms w owym przerwaniu (ctc lub ovf). Świadom jestem niedokładnego kwarcu zewnętrznego dlatego poszedłem w inne rozwiązanie.

    Wykorzystałem przebieg prostokątny z układu D3231 który generuje 32768 lub jego podzielność na pinie SQW (square wave) tj. 8192 Hz 4096 Hz 1024 Hz i 1 Hz. Lecz te wartości są nam znane programistom, ale są to krotności potęgi 2-jki, podzielenie 1.024 kHz przez wpisanie wartości 1000 do OCR1A dla TIMER1 i źródło sygnału T1 powoduje odchyły, tj. 1.0072 ms dla OCR1A=1000 oraz 0.97 dla OCR1A=999. Próbowałem też co czwarte przerwanie manipulować OCR1A między 1000 a 999 jednak i tak jest rozbieżność przy np. minucie pracy.

    Jakikolwiek generator na NE555 wg mnie odpada jeśli dobrze myślę. Polegać na elementach pasywnych np. 6.9K i innych składowych potrzebnych wg kalkulatorów online aby uzyskać 1 kHz NE555 będzie niemożliwe - tym bardziej, że owy układ ma pracować w różnych temperaturach, najczęściej w okolicach 0°C.

    Może poszedłem w złą stronę i jest jakieś prostsze rozwiązanie, które da mi pożądaną dokładność, tego nie wiem, dlatego zwracam się do Was.

    Jestem otwarty na przejście na XMEGĘ jeśli będzie potrzeba.

    Pozdr.
  • Pomocny post
    #2 15749181
    excray
    Poziom 41  
    Kwarc 16.384MHz i do tego timer z preksalerem 1024 w trycie CTC z przerwaniem co 16.
  • Pomocny post
    #3 15749207
    Konto nie istnieje
    Konto nie istnieje  
  • #4 15749208
    Modecom601
    Poziom 13  
    Dzięki za szybką odpowiedź.

    Czy mega może być popędzana kwarcem 16.384 MHz jeśli maksymalna częstotliwość pracy to 16 Mhz?

    Kwarce są na tyle dokładne (nawet te 20 ppm) że nie zauważę na analizatorze stanów odchyłek w przeciągu np. 5 minut? Czyli to kwestia użycia kwarcu o "nieokrągłej" wartości i dobranie preskalera wg Ciebie tak?

    Od początku myślałem o jakimś zewnętrznym generatorze na tyle stabilnym, że nie straszna mu będzie niska temperatura (DS3231 uwzględnia temperaturę zewnętrzną w celu zachowania dokładności).


    @niveasoft:

    Coś w tym przerwaniu robić muszę aby uzyskać podział czasu 1ms, inkrementowanie zmiennej to jedyna rzecz, którą robię w przerwaniu by skrócić czas trwania przerwania.
  • Pomocny post
    #5 15749225
    excray
    Poziom 41  
    Modecom601 napisał:
    Czy mega może być popędzana kwarcem 16.384 MHz jeśli maksymalna częstotliwość pracy to 16 Mhz?

    Jeśli zasilasz ją z 5V to możesz. Przekroczenie jest minimalne.
  • Pomocny post
    #6 15749240
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #7 15749248
    Konto nie istnieje
    Konto nie istnieje  
  • #8 15749302
    Modecom601
    Poziom 13  
    Widzę kilka rozwiązań z Waszej strony - zaraz wszystkie sprawdzę.

    Dokładność sprawdzam analizatorem stanów, a w przerwaniu toggluje pin i sprawdza czas trwania naprzemiennie stanów logicznych. Jego prędkość to 24MHz, czasem mnie zastanawia przy czasach rzędu mikrosekund bardzo powtarzalne czasy (0.16667, 0.125 itp.), ale pracujemy na jednostce milisekund więc niedokładność analizatora odrzuciłbym.

    Powracam do pytania czy kwarc jest naprawdę taki dokładny? Wg mnie nie, te 16MHz nigdy na oscyloskopie nie było równe 16.00000 MHz.

    Jeśli instrukcje w przerwaniu też będą wnosić (a na pewno wnoszą) spore opóźnienie, to jestem gotów postawić drugą medzie8 która będzie tylko odmierzała 1ms i przenosiła to na INT0 na główny procesor.

    Jeszcze w kwestii upewnienia się: rejestr 0CR1n kontynuuje zliczanie po wyjściu z przerwania czy już podczas wykonywania się jego?
  • Pomocny post
    #9 15749332
    Konto nie istnieje
    Poziom 1  
  • #10 15749367
    Modecom601
    Poziom 13  
    @atom1477

    Jeśli ja wygeneruje przerwanie co 1 ms, to muszę mieć potem możliwość coś zrobić, czyli w przerwaniu muszę chociaż zmienną inkrementować, albo zrobię toggle pin i połączenie z głównym MCU przez INT0 tak jak pisałem post wcześniej . Mam kwarc 20ppm i nie jest on wystarczająco stabilny, dlatego poszedłem na DS3231 i źródło timera od T1. Wciąż stoję w miejscu
  • Pomocny post
    #11 15749384
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #12 15749861
    tmf
    VIP Zasłużony dla elektroda
    Modecom601 napisał:
    @atom1477

    Jeśli ja wygeneruje przerwanie co 1 ms, to muszę mieć potem możliwość coś zrobić, czyli w przerwaniu muszę chociaż zmienną inkrementować, albo zrobię toggle pin i połączenie z głównym MCU przez INT0 tak jak pisałem post wcześniej . Mam kwarc 20ppm i nie jest on wystarczająco stabilny, dlatego poszedłem na DS3231 i źródło timera od T1. Wciąż stoję w miejscu


    A skąd wiesz, że nie jest wystarczająco stabilny? Bo masz jakieś odchyłki w analizatorze stanów logicznych? Przede wszystkim, jak machasz pinem, programowo? Jeśli programowo, wykorzystując przerwanie timera, to sama obsługa przerwania wprowadza jitter 1-3 taktów CPU (wykonywana instrukcja asemblera jest nieprzerywalna i przerwanie jest obsługiwane dopiero po zakończeniu jej wykonywania). Teraz policz jaki okres ma zegar 16 MHz i czy czasem twoje odchyły w pomiarze jakoś dziwnie nie pasują do wielokrotności okresu + aliasing z samplowaniem analizatora.
    Potrzebujesz dokładny 1 kHz bez jitteru, to wyprowadź zegar sprzętowo - masz taką możliwość. Wtedy będzie tylko jitter samego generatora, który jest na poziomie ns.
  • Pomocny post
    #13 15750461
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #14 15750533
    BlueDraco
    Specjalista - Mikrokontrolery
    Odpowiedź na przerwania ma szansę być precyzyjna (bo samo przerwanie JEST preczyzyjne) jeśli procesor będzie czekał na przerwanie w uśpieniu, a nie w niepustej "pętli głównej" ze sprawdzaniem zdarzeń.
    Niektóre modele uC z rdzeniami Cortex mają mechanizm sprzętowy gwarantujący determinizm czasu odpowiedzi dla jednego przerwania o najwyższym priorytecie, np. nowsze modele serii LPC11xx NXP.
  • Pomocny post
    #15 15750639
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #16 15750678
    Munieq
    Poziom 14  
    Ja proponuję odbiornik GPS z sygnałem 1 PPS + pętla PLL (hardwareowo albo powielić na jakimś szybkim Cortexie do 1kHz). Dokładność do setek nanosekund bez problemu, i co więcej - ewentualny błąd nie będzie się nawarstwiał w czasie.

    Wadą jest niestety antena z widokiem na niebo :)

    Oczywiście rozwiązanie zależy od aplikacji, czy warto strzelać z armaty...
  • Pomocny post
    #17 15750680
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #18 15750685
    Munieq
    Poziom 14  
    albertb napisał:
    Munieq napisał:
    albo powielić na jakimś szybkim Cortexie do 1kHz

    Następny.
    Jak się powiela na szybkim Cortexie, czego nie można zrobić innym procesorem?

    Albert


    To tylko sugestia. Jeśli w tej samej cenie mogę mieć dostępne 48MHz (przykładowo STM32F0) zamiast 16MHz (Atmega8) i nie muszę szczypać się, ile taktów zajmie mi zmiana GPIO, to czemu nie? O 32-bitowym timerach oraz możliwości kombinowania zegarem wewnętrznym nie wspomnę. Nikt nie jest masochistą, trzeba iść z duchem czasu :)

    Aczkolwiek każdy bierze, co ma pod ręką. Każdy ma swój gust.
  • #19 15750853
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #20 15750867
    BlueDraco
    Specjalista - Mikrokontrolery
    Albert: dość mocno mijasz się z prawdą.

    Niektóre uC z rdzeniami Cortex mają sprzętowy mechanizm gwarantujący czas odpowiedzi na przerwanie, który umożliwia redukcję drżenia (jitter) przerwania o najwyższym priotrytecie do zera również wtedy, kiedy mamy w systemie inne przerwania. Jeśli użyjesz tego mechanizmu, to sam decydujesz jawnie o czasie od przerwaia do reakcji - wpsujesz wartość w cyklach zegara. W AVR warunkiem zerowego drżenia jest tylko jedno przerwanie i pusta pętla zdarzeń z instrukcją usypiania procesora.

    O jakiej "niepewności ze względu na PLL" mówisz? PLL po prostu działa, całkiem pewnie.

    W STM32 można również do zmiany stanu linii portu użyć DMA wyzawalanego timerem - też mamy minimalizację drżenia.
  • #21 15750870
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #22 15750882
    BlueDraco
    Specjalista - Mikrokontrolery
    No jasne, jak Ci nie podam strony w manualu, to kłamię? Fajne inżynierskie podejście.

    Poczytaj sobie o rejestrze IRQLATENCY w serii LPC11xx, np. w modelu LPC1124. Potem możesz grzecznie przeprosić za insynuacje.
  • #23 15750888
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #24 15751097
    willyvmm
    Poziom 30  
    A ja zacznę od początku. Co autor miał na myśli?

    Czy uzyskanie precyzyjnego przebiegu na wyjściu o częstotliwości 1kHz czy precyzyjne generowanie Przerwania?

    I teraz poprawcie mnie jeśli się mylę.
    Jeżeli mam precyzyjnie generowane przerwanie i softwarowo generuję przebieg na wyjściu to i tak otrzymam przebieg tak dokładny jak dokładne przerwanie generuje. Jedyne co to wszelkie opóźnienie wygenerują jitter ale sama częstotliwość będzie nadal taka jak timer generuje Przerwania.
    Jeżeli timer sprzętowo generuje przebieg to i tak będzie jakiś jitter w zależności od procesora i jego bebechoow.

    I wracamy do punktu wyjścia. Jak dokładny i do czego potrzebne to jest. Autor najpierw pisze o odmierzaniu czasu w pętli ++ a potem podaje pomiar z dokładnością do 100ns...
    1.0072...
    Nie trzyma się to trochę kupy.
  • #25 15751228
    Konto nie istnieje
    Konto nie istnieje  
  • #26 15753086
    Modecom601
    Poziom 13  
    Dopiero teraz mam możliwość odpisania,
    widzę, że temat zaciekawił specjalistów, cieszy mnie to.

    @A-T-O-M: Nie mam dostępu do oscyloskopu aby wyeliminować stopę błędów tego analizatora. Mam na myśli stabilność kwarcu na przestrzeni np. 5 minut, kiedyś pamiętam taki kwarc mierzyłem na oscyloskopie i jego wartości po przecinku zmieniały się dość znacząco.

    @tmf Programowo togglowałem pin aby sprawdzić czy jest pożądana częstotliwość, z czasem opóźnienie rosło. Ja jeszcze sprawdzę sprzętowy timer ale z innym kwarcem lub przestawię prescaler aby wg wzoru bylo 1 kHz. Nie jestem i nigdy nie byłem przekonany, że analizator jest precyzyjny do nanosekund, skoro on też próbkuje z częstotliwością 24 MHz, już w pierwszym poście zaznaczyłem, że jego powtarzające się czasy zwróciły moją uwagę.

    Ja szukałem jednego z dwóch rozwiązań: albo generowanego wewnętrznego przerwania, ale aby sprawdzić jego dokładność togglowałem pin programowo. Skoro to mi działało z pożądaną dokładnością wpadłem na pomysł togglowania pinu przez inny mikrokontroler i doprowadzić ten pin z drugiego MCU do docelowego poprzez INT0. Dlatego @@lbert, nie robię żadnego generatora, za wprowadzenie w błąd lub niedopowiedzenie bardzo przepraszam.

    @BlueDraco, niestety MCU będzie robił jeszcze w pętli głównej inne sprawy, dlatego nie mam możliwości jego usypiania.

    @Munieq - przechodziłem przez to rozwiązaniewe wtorek/środę, tam generowany jest sygnał prostokątny przy 3D-FIX, potem jak złapie sygnał GPS sygnał na pinie ustawia się na 0. Poza tym, zauważyłem, że dane, jakie sypie po RS232 nie są równo co sekunde, poza tym czas transmisji przy moim problemie jest relatywnie długi.

    Wstawianie STM'a do takiego urządzenia mija się z celem, ponieważ owe urządzenie, o które pytacie ma ustawiać dany pin po czasie zapisanym w pamięci EEPROM (wartości z komputera po RS232), takich pinów ma być 20. Urządzenie będzie na zewnątrz, dlatego problemu z sygnałem satelit by nie było, ale to też armata do muchy. Chciałbym się przestawić na STM'y jednak chyba jest to pierwszy projekt, w którym nie wystarcza mi 8 bitowy AVR, a pewnie i w tym przypadku wystarczy czytając Wasze odpowiedzi, za które dziękuje.
  • #27 15753172
    Konto nie istnieje
    Poziom 1  
  • #28 15754652
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #29 15754945
    jega
    Poziom 24  
    Jeżeli stabilność samego rezonatora kwarcowego jest dla danego zadania za mała, to oczywiście żadne rozwiązanie zależne od niej nie da pożądanego efektu. Wtedy należy użyć zewnętrznego generatora o dużej stabilności. Wykorzystują one specjalnie dobierane rezonatory pracujące w znacznie bardziej rozbudowanych ale i o wiele stabilniejszych układach. Przy jeszcze wyższych wymaganiach mają wewnętrzną stabilizację temperatury. Wady to wielkość, cena i moc - wszystkie tym większe im wyższe masz wymagania.
  • #30 15755073
    Modecom601
    Poziom 13  
    Inny problem tzn?
    Masz na myśli kiepską sztukę procesora? Filtracje zasilania? Prototypuję na ZL2AVR jeśli chodzi o te kwestie. Oscyloskop cyfrowy również będzie wprowadzał do wyniku swój błąd pomiarowy ze względu na to, że jego częstotliwość próbkowania też występuje jeśli się nie mylę, a analogowy? Czyżby jedynym rozwiązaniem aby sprawdzić dokładność byłoby urządzenie @atoma na STM?

    Kierujemy się w stronę rozwiązania z generowaniem sprzętowego togglowania pinu przez podrzędną atmegę, rozumieć mam, że pomysł z Timerem inkrementującym zmienną został porzucony?

    Zanim odpisał @jega chciałem napisać to samo odnośnie dokładności kwarcu, nawet jeśli podam Ci zakres od 1 min do maks 10 (to jest założenie projektowe) to i tak niedokładność będzie, co by było, gdyby nagle zaszła potrzeba wydłużenia czasu? Chciałem zbudować urządzenie uniwersalne, nie pod konkretny zakres pracy dobierając pod niego komponenty.

    Może nie nazwałbym tego generatorem dużej stabilności, ale próbowałem uzyskać efekt na DS3231, który ma wyprowadzony pin o przebiegu prostokątnym 32768 Hz, społeczność poleca go jako zegarek o wysokiej dokładności czasu, dlatego wyszedłem z założenia, że i przebieg ma prostokątny, ale równo podzielić 32.768 kHz na moje 1 kHz nie da się.

    Po Waszych podpowiedziach aktualnie mam za rozwiązanie najbliżej ideału 16 MHz, CTC, presc 64 i OCR1A 249, z rozbieżnością 70ms dla 360 sekund (badane wciąż analizatorem), jednak nie wynosi to Twoje szacunkowe 6 ms (dlaczego, co robię źle?) Czy to aż tak ogromny wpływ ma toggle pinu co sekunde przy zmienna==1000 ? Kilka postów wyżej usłyszałem, że licznik timera zaczyna liczyć od razu po porównaniu licznika z OCR1A więc dlaczego długość trwania procedury obsługi przerwania ma taki wpływ bo nadal nie mogę tego sobie wyobrazić?

    Zmyliło mnie też to, że dla Timera aby uzyskać żądaną dokładność we wzorze muszę odjąć 1, zwykle 7-segmentowce niewiele obchodziło, czy pracują 70 czy 71 Hz ;-)
REKLAMA