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

Precyzyjne generowanie przerwań co 0,346 sekundy na Atmedze

korneliusz 07 Wrz 2008 12:00 1523 11
REKLAMA
  • #1 5513282
    korneliusz
    Poziom 16  
    Posty: 288
    Pomógł: 4
    Ocena: 124
    Witam

    Buduję układ w którym będę potrzebował generować przerwanie z bardzo dużą dokładnością, tak aby na każdą sekundę przypadało 8 i 2/3 przerwania, albo inaczej, aby w 3 sekundach pracy układu generowane było 26 przerwań, ważna jest tu precyzja pracy, więc jakieś przybliżanie timerami odpada. Może i rozwiązanie jest banalne, ale nic nie przychodzi mi do głowy...

    Z góry dzięki jeśli ktoś miałby coś do powiedzenia.

    Pozdrawiam
  • REKLAMA
  • #2 5513381
    Samuraj
    Poziom 35  
    Posty: 2792
    Pomógł: 286
    Ocena: 615
    Dlaczego piszesz że timer odpada :?:
    Chyba bardziej prewencyjnie niż na timerze się nie da tego zrobić. Piszesz że 26 przerwań na 3 sekundy to daje (3*60)/26. Ustaw aby timer zliczał w górę, odmierz 6 sekund i 923 milisekndy i po problemie. Czas pomiędzy przerwaniami to kawał czasu, mikroprocesor w tym czasie będzie się nudził więc można go przestawić w tryb uśpienia aby obniżyć pobór mocy.
    Na koniec dodam tylko że aby było to dokładne to praca na wewnętrznym generatorze w mikroprocku AVR odpada - zalecam kwarc.
  • REKLAMA
  • #3 5513429
    acid12
    Poziom 21  
    Posty: 388
    Pomógł: 41
    Ocena: 23
    zewnętrzny kwarc do stabilnej pracy,
    jedno polecenie assebmlera 'nop' trwa dokładnie jeden cykl.

    w pętli (petlach) odpowiednią ilość razy (zaleznie od czestotliwości pracy) wywołaj to polecenie tak abys otrzymał np 1 ms ... bądz 1us ... w ten sposób będzie bardzo precyzyjnie

    chociaż na timerach też da radę bo liczą niezależnie od przerwań
  • REKLAMA
  • #5 5514502
    korneliusz
    Poziom 16  
    Posty: 288
    Pomógł: 4
    Ocena: 124
    zliczanie cykli niestety odpada, bo procesor musi jeszcze w tym czasie obslugiwac klawiature matrycowa oraz LCD 2x16...

    Dokladnie potrzebny mi jest uklad do napedu teleskopu aby ten sledzil gwiazdy, mam w montazu teleskopu przekladnie i silnik krokowy, no i teraz chodzi o to ze zeby naped telespu mial odpowiednia predkosc rowna z predkoscia gwiazd silnik w jednej sekundzie musi wykonac te 8 i 2/3 kroku...
  • #6 5514607
    acid12
    Poziom 21  
    Posty: 388
    Pomógł: 41
    Ocena: 23
    wydaje mi się że 1 sek to zbyt duży odstęp czasu, dla procka oczywiście.

    lepiej zobaczyć co ile ms silnik musi wykonać 1 krok (najmniej ile się da) i ten czas dokładnie odmierzać, a tu timer wystarczy
  • #7 5514968
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Musisz ustawić tak timera, aby odmierzał 3/26s i generował przerwanie. W zależności od częstotliwości źródła sygnału zegarowego może zdarzyć się tak, że nie uda się z zadowalającą precyzją ustawić timera do tego zadania. Wtedy możesz rozłożyć zadanie na 2 kolejne przerwania zmieniając ustawienia timera (prescaler, początkową wartość licznika timera) w każdym z przerwań i w co drugim generować sygnał silnikowi. W ten sposób osiągniesz dokładnośc co do 1 taktu zegara.

    acid12 napisał:
    wydaje mi się że 1 sek to zbyt duży odstęp czasu, dla procka oczywiście.

    A dlaczego to niby 1s miałaby być za długa dla uK? Odpowiednio wykorzystując możliwości tydzień, miesiąc, rok... nie jest za długo.
  • #8 5515197
    korneliusz
    Poziom 16  
    Posty: 288
    Pomógł: 4
    Ocena: 124
    K_o_n_r_a_d napisał:
    Musisz ustawić tak timera, aby odmierzał 3/26s i generował przerwanie. W zależności od częstotliwości źródła sygnału zegarowego może zdarzyć się tak, że nie uda się z zadowalającą precyzją ustawić timera do tego zadania. Wtedy możesz rozłożyć zadanie na 2 kolejne przerwania zmieniając ustawienia timera (prescaler, początkową wartość licznika timera) w każdym z przerwań i w co drugim generować sygnał silnikowi. W ten sposób osiągniesz dokładnośc co do 1 taktu zegara.


    Nad tym właśnie dzisiaj zacząłem myśleć i wydaje się idealnym rozwiązaniem.

    Czy mógłby ktoś podsunąć wzór czy też sposób obliczania częstotliwości wyjściowej, jeżeli tak jak np mam w swoim układzie kwarc 16MHz, timer chodzi z preskalerem 1024, więc rozumiem że licznik już zlicza z prędkością 15625Hz (16MHz/1024), ale jak policzyć dalej częstotliwość jeśli przerwanie generowane jest na przepełnienie licznika, który ma np wpisaną wartość 127? Licznik liczy wtedy od 127 do 255 czyli znowu częstotliwość mam dzieloną o te 128 (wartość przepełnienia - wartość początkowa)? I przerwanie generowane jest z częstotliwością ~122Hz czy jak to jest?
  • #9 5515282
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Tak właśnie jest.

    Proponuję policzyć dokładnie ile potrzeba taktów zegara pomiędzy kolejnymi krokami i tak ustawić przerwania timera, aby odliczyć właśnie tyle taktów.
    Musisz jeszcze pamiętać, że samo wejście w podprogram obsługi przerwania i dalsze instrukcje też zajmują kilka taktów, więc przy małych wartościach preskalera może mieć to znaczenie i początkową wartość licznika będziesz musiał odpowiednio zmniejszyć (możesz policzyć takty licząc instrukcje asemblera lub doświadczalnie).
  • REKLAMA
  • #10 5515839
    teedd
    Poziom 19  
    Posty: 219
    Pomógł: 24
    Ocena: 2
    K_o_n_r_a_d napisał:

    Musisz jeszcze pamiętać, że samo wejście w podprogram obsługi przerwania i dalsze instrukcje też zajmują kilka taktów, więc przy małych wartościach preskalera może mieć to znaczenie i początkową wartość licznika będziesz musiał odpowiednio zmniejszyć (możesz policzyć takty licząc instrukcje asemblera lub doświadczalnie).

    K_o_n_r_a_d - przemyśl to, bo myślę, że nie masz racji. Przecież przerwanie wykonywane jest cyklicznie i nie chodzi nam o czas od wystąpienia przerwania do reakcji na niego, a o powtarzalność.
    Pozdrowienia - teedd
  • #11 5515851
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Tak, ale miałem na myśli, że jeśli z obliczeń wyjdzie, że należy timery ustawić z ustawieniami X i Y w kolejnych przerwaniach to w rzeczywistości da to inne odstępy czasu niż wyliczone, ponieważ do ustawienia Y dojdzie jeszcze kilka taktów.
  • #12 5515880
    teedd
    Poziom 19  
    Posty: 219
    Pomógł: 24
    Ocena: 2
    OK - rozumiem co masz na myśli.
    teedd

Podsumowanie tematu

✨ Dyskusja dotyczy precyzyjnego generowania przerwań co 0,346 sekundy na mikrokontrolerze Atmega, aby uzyskać 8 i 2/3 przerwania na sekundę, co odpowiada 26 przerwaniom na 3 sekundy. Problemem jest zapewnienie wysokiej dokładności, wykluczającej przybliżenia timerów. Zalecane jest stosowanie zewnętrznego kwarcu dla stabilności taktowania, gdyż wewnętrzny generator jest mniej precyzyjny. Proponowane rozwiązania obejmują ustawienie timera tak, aby generował przerwania co 3/26 sekundy, z możliwością zmiany preskalera i wartości początkowej licznika w kolejnych przerwaniach dla uzyskania dokładności do jednego taktu zegara. Wskazano, że czas obsługi przerwania i instrukcje asemblera wpływają na dokładność i mogą wymagać korekty wartości licznika. Alternatywnie sugerowano generowanie krótszych odstępów czasowych odpowiadających pojedynczym krokom silnika krokowego, co ułatwia precyzyjne sterowanie napędem teleskopu śledzącego gwiazdy. Podkreślono, że timer jest odpowiednim narzędziem do realizacji zadania, a przerwania co sekundę nie są zbyt długim odstępem dla mikrokontrolera.
Wygenerowane przez model językowy.
REKLAMA