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

Atmega8 - Jak zmierzyć częstotliwość do 2MHz? Dzielnik czy bezpośrednio?

Prodig 19 Lut 2007 08:10 6433 18
REKLAMA
  • #1 3589344
    Prodig
    Poziom 20  
    Posty: 487
    Pomógł: 4
    Ocena: 14
    Witam.

    Czy da się za pomocą atmega8 zmierzyć bezpośrednio częstotliwość do 2MHz (amplituda 5V), czy będę musiał wykorzystać dzielnik?

    Jeżeli dzielnik, jakie są najlepsze i jakie mają najmniejsze gabaryty?

    Pozdrawiam.
  • REKLAMA
  • #2 3589355
    szaro
    Poziom 19  
    Posty: 411
    Pomógł: 10
    Ocena: 17
    wydaje mi się ze 2MHz zmierzysz bez dodatkowych układów oczywiście pod warunkiem ze CPU będzie taktowane odpowiednią częstotliwością
  • REKLAMA
  • #3 3589394
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Procesor jest w stanie wykryć zmianę stanu na wejściu o częstotliwości maksymalnej Fclock/2. Ale lepiej niech ma jakiś zapas czasu ;) Dla 2MHz teoretycznie wystarczy zegar 4MHz ale nic nie szkodzi żeby procek pracował przy np 16 lub MHz.
  • #5 3589469
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Nie tędy droga ;) o wiele efektywniejsze jest zliczanie impulsów przez blok licznika (robi to niezależnie od wykonywanego programu) i tylko w włączać go i wyłączać w określonym przedziale czasu np 1s.
  • REKLAMA
  • #6 3589581
    szaro
    Poziom 19  
    Posty: 411
    Pomógł: 10
    Ocena: 17
    Kolega crazy_phisic ma rację najlepiej wykorzystać do tego licznik.
  • REKLAMA
  • #8 3590198
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    Ustaw jeden z timerów, żeby zliczał przez określony czas (np. 1ms) impulsy z wejścia zewnętrznego. Wystarczy przeczytać datasheet od procka - tam są konfiguracje rejestrów.

    Powodzenia
  • #9 3590914
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Sygnał mierzony na Pind.4. Mega na kwarcu zewnętrznym.
    $regfile = "M8def.DAT"
    $crystal = 11059200
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7
    Cursor Off
    Dim Czestotliwosc As Long
    Const Licznik = 22336
    Config Timer1 = Timer , Prescale = 256
    Config Timer0 = Counter , Edge = Falling
    
    Deflcdchar 1 , 2 , 4 , 14 , 16 , 16 , 17 , 14 , 32       ' replace ? with number (0-7)
    Deflcdchar 0 , 2 , 4 , 14 , 16 , 14 , 1 , 30 , 32
    Deflcdchar 2 , 32 , 32 , 14 , 17 , 31 , 16 , 14 , 4       ' replace ? with number (0-7)
    
    On Timer1 Czas
    On Timer0 Zlicz
    
    Cls
    Lcd "    MIERNIK"
    Lowerline
    Lcd " CZESTOTLIWOSCI"
    Wait 1
    Cls
    Enable Interrupts
    Enable Timer1
    Enable Timer0                 'Pomiar czasu
    Counter1 = Licznik
    
    Do
    
    Loop
    End
    
    Czas:
       Stop Timer0
       Stop Timer1
       Czestotliwosc = Czestotliwosc * 256
       Czestotliwosc = Czestotliwosc + Counter0
       
       Locate 1 , 2 : Lcd "Cz" ; Chr(2) ; "stotliwo" ; Chr(0) ; Chr(1)
       If Czestotliwosc < 1000 Then Gosub Wyswietl_hz
       If Czestotliwosc >= 1000 And Czestotliwosc < 1000000 Then Gosub Wyswietl_khz
       If Czestotliwosc >= 1000000 Then Gosub Wyswietl_mhz
       
          Czestotliwosc = 0
          Counter0 = 0
          Counter1 = Licznik
       Start Timer0
       Start Timer1
    
    Return
    
    Zlicz:
    Incr Czestotliwosc
    Return
    
    Wyswietl_hz:
    
    Locate 2 , 2
    Lcd "    " ; Czestotliwosc ; "     "
    Locate 2 , 9 : Lcd " Hz     "
    Return
    
    Wyswietl_khz:
    
    Locate 2 , 3
    Lcd " " ; Czestotliwosc ; "       "
    Czestotliwosc = Czestotliwosc \ 1000
    Locate 2 , 2
    Lcd " " ; Czestotliwosc ; "."
    Locate 2 , 11 : Lcd " kHz   "
    Return
    
    Wyswietl_mhz:
    
    Locate 2 , 3
    Lcd Czestotliwosc ; "       "
    Czestotliwosc = Czestotliwosc \ 1000000
    Locate 2 , 2
    Lcd Czestotliwosc ; "."
    Locate 2 , 11 : Lcd " MHz  "
    Return
  • #11 4818876
    Matizz
    Poziom 18  
    Posty: 375
    Pomógł: 9
    Ocena: 11
    Cześć

    Chciałem mój skromny warsztat wyposażyć w miernik częstotliwości.
    Znalazłem ten wsad do procesora. Mógłbym go po prostu wgrać do procka i pewnie by działał, ale ja chciałem się dowiedzieć jak funkcjonuje ten program bym mógł do niego dorobić np. dodatkowy preskaler lub przy strojeniu radia dodać lub odjąć częstotliwość pośrednią.

    Część programu już rozgryzłem, ale nie mam pojęcia skąd się wzięła stała Const Licznik = 22336 i dlaczego akurat tyle, jak to policzyć i od czego to zależy?


    pozdrawiam
    Matizz
  • #12 4819576
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Matizz napisał:
    Część programu już rozgryzłem, ale nie mam pojęcia skąd się wzięła stała Const Licznik = 22336 i dlaczego akurat tyle, jak to policzyć i od czego to zależy?
    Jest to wartość początkowa licznika, jak doliczy do 65536 to wygeneruje przerwanie, a doliczy do tej wartości za 43200 impulsów zegara. Dla kwarcu 11.059MHz to da jakieś ~4ms (po uwzględnieniu dzielnika częstotliwości to da 1ms).
  • #13 4820178
    Matizz
    Poziom 18  
    Posty: 375
    Pomógł: 9
    Ocena: 11
    chyba chcialeś powiedzieć 1s, bo 1ms nie chce mi wyjść w żaden sposób.

    Więc działa to mniejwięcej w taki sposób:

    za każdym impulsem zwiększamy zmienną "częstotliwość"
    pomiar trwa 3.9ms i T1 wywołuje przerwanie, i przechodzi do programu czas,
    potem ilość impulsów jest mnożona przez 256(wartość presklera), otrzymujemy ilość impulsów na sekundę, czyli częstotliwość.

    więc po co dodajemy do niej jeszcze wartość counter0 ?


    ps. jeśli pomiar trwa tylko 3.9ms to minimalna częstotliwość wynosi 256Hz ?

    pozdrawiam
    Matizz
  • #14 4821068
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Matizz napisał:
    więc po co dodajemy do niej jeszcze wartość counter0
    Bo counter0 zawiera liczbę impulsów która minęła od ostatniego przekręcenia licznika. Cały program to jakby programowo-sprzętowy licznik, sprzętowe jest młodsze 8bit, a programowe zmienna "Czestotliwosc". Równanie na wartość całego licznika wynosi "czestotliwosc*256+counter0".

    Preskaler jest podłączony do licznika "czasu", a nie licznika "impulsów" (to mój błąd w poprzednim poście), wtedy 1sekunda trwa 43200 "impulsów" zegara taktującego (11059200Hz). Zliczanie trwa 1s.
  • #15 4821488
    arturromarr
    Poziom 17  
    Posty: 417
    Pomógł: 1
    Ocena: 25
    A macie może jakiś przykłądzik w c.
    Potrzebuję dość nietypowy miernik bo o zakresie od 0.1 do 3K Hz czyli niewielkim ale dokłądność musi automatycznie się zwiększać wraz ze spadkiem częstotliwości. Trzeba będzie chyba żonglować częstotliwością zliczania licznika.
    Ale jakby ktoś dał jakiś przykłądzik to byłby dobry punkt zaczepienia, a ja jak napiszę to zamieszczę.

    Pozdrawiam.
  • #16 4821676
    PiotrPitucha
    Poziom 34  
    Posty: 2658
    Pomógł: 201
    Ocena: 424
    Cześć
    Dla tak małych częstotliwości mierzy się okres i wylicza z tego częstotliwość, i ile pamiętam w EdW był kurs Bascoma a tam analiza metod z przykładami dla jakiej częstotliwości dobra jest określona metoda pomiaru
    Piotr
  • #17 4822477
    Matizz
    Poziom 18  
    Posty: 375
    Pomógł: 9
    Ocena: 11
    czyli jeśli chciałbym dodać preskaler to trzeba wstawić coś takiego:

    Czestotliwosc = Czestotliwosc * 256 
    
    Czestotliwosc = Czestotliwosc + Counter0 
    
    Czestotliwosc = Czestotliwosc * K 


    gdzie K to wartość podziału preskalera.


    pozdrawiam
    Matizz
  • #18 4823506
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Tak.
    Gdybyś chciał wprowadzić przesunięcie o p.cz. to trzeba byłoby wstawić
    Czestotliwosc = Czestotliwosc +/- Pcz

    W tym programie Timer1 (16 bitowy) zlicza czas 1s. w jednym przebiegu dla zwiększenia dokładności pomiaru. Impulsy liczone są przez Counter0.
  • #19 4827894
    Matizz
    Poziom 18  
    Posty: 375
    Pomógł: 9
    Ocena: 11
    Wiem w jaki sposób można płynnie zmieniać wartość p.cz.
    ale w jaki sposób zapisać w programie kilka podstawowych p.cz.

    Mój pomysł :
    3 przyciski.
    ustawić osobne menu do którego wchodzi sie przez przytrzymanie przycisku S1. potem na wyświetlaczu 2x20 (bo taki mam)
    wyświetlam sobie np.
    1 to pcz +455kHz,
    2 to -455kHz,
    3 to +10.7MHz,
    4 to -10.7MHz,
    5 bez pośredniej ,
    6 to płynne ustawianie p.cz.


    i przełącznikami S2 i S3 możemy zmieniać wartość (np. zmiennej C) od 1 do 6

    potem warunek select case w zależności od tej właśnie zmiennej C

    
    Select Case C
                         Case 1 : Czestotliwosc = Czestotliwosc + 455000 
                         Case 2 : Czestotliwosc = Czestotliwosc -  455000
                         Case 3 : Czestotliwosc = Czestotliwosc + 10700000 
                         Case 4 : Czestotliwosc = Czestotliwosc -  10700000
                         Case 5 : Czestotliwosc = Czestotliwosc 
                         Case 6 : Czestotliwosc = Czestotliwosc + Pcz
                         
                  End Select


    Co o tym myślicie?


    Pozdrawiam
    Matizz

Podsumowanie tematu

✨ Dyskusja dotyczy pomiaru częstotliwości sygnału do 2 MHz za pomocą mikrokontrolera Atmega8. Potwierdzono, że pomiar bezpośredni jest możliwy, pod warunkiem odpowiednio wysokiej częstotliwości taktowania CPU (np. 8 MHz lub więcej). Zalecane jest wykorzystanie sprzętowego licznika (timer/counter) do zliczania impulsów z sygnału wejściowego, co jest bardziej efektywne niż liczenie przerwań na wejściu INT0. Przykładowy program w BascomAVR pokazuje konfigurację Timer0 jako licznika impulsów oraz Timer1 do odmierzania czasu pomiaru (np. 1 sekundy). Wartość licznika jest odczytywana i przeliczana na częstotliwość, uwzględniając preskaler i wartość początkową licznika (Const Licznik = 22336) dla uzyskania dokładnego pomiaru. Dyskutowano także o rozszerzeniu programu o preskaler i przesunięcia częstotliwości (np. do strojenia radia) oraz o metodach pomiaru niskich częstotliwości (mierzenie okresu). Wątki dotyczące dzielnika napięcia nie były rozwinięte, gdyż sygnał 5 V jest bezpieczny dla wejść Atmegi8.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA