Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Częstościomierz i pomiar wypełnienia

13 Jan 2008 15:40 3554 9
  • Level 11  
    Witam planuje zmodyfikować program oraz schemat aby móc mierzyć również wypełnienie impulsu.DO tego celu będzie użyty AT89C2051 ewentualnie 4051
    czy pomiar wypełnienia impulsu i jego czestotliwości moge zrealizować tak jak na rysunku poniżej? czyli impulsy są podawane na wejście timera
    Częstościomierz i pomiar wypełnienia
    Trendy 2021 w branży Internetu rzeczy [Webinar 02.07.2021, g.12.00]. Zarejestruj się za darmo
  • Helpful post
    Level 18  
    Pomiar wypełnienia przebiegu (nie impulsu) i jego częstotliwość, można zrealizować wdł. zamieszczonego schematu. Impulsy są podawane na licznik T0.
  • Level 11  
    zamierzam mierzyć wypełnienie oraz czestotliwość impulsów generowanej z kostki NE555.
    Poniżej zamieszczam program do mierzenia częstotliwości
    Code:
    $regfile = "89c2051.dat"
    
    $crystal = 24000000

    Dim A As Byte
    Dim C As Long , D As Long
    Dim Count As Word
    Dim T0ic As Long
    Dim Delayword As Word

    Count = 0
    T0ic = 0
    D = 0

    P1 = 0
    P3 = 255
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = P1.4 , Db5 = P1.5 , Db6 = P1.6 , Db7 = P1.7 , E = P1.3 , Rs = P1.2
    Cls

    Lcd " miernik "

    Config Timer0 = Counter , Gate = Internal , Mode = 1

    On Timer0 Timer_0_overflow_int

    Priority Set Timer0
    Enable Interrupts
    Enable Timer0
    Counter0 = 0
    Start Counter0
    Do
    Enable Interrupts
    For Delayword = 1 To 45440
    Next Delayword
    Disable Interrupts
    C = Counter0
    D = T0ic * 65536
    Lowerline
    C = C + D
    T0ic = 0
    Lcd "  "
    Lowerline
    Lcd "f=" ; C ; " Hz"
    Waitms 255
    Waitms 255
    C = 0
    Counter0 = 0
    Start Counter0
    Loop
    Timer_0_overflow_int:
    Incr T0ic
    Return
    End

    Jednak w jaki sposób poprzez ten timer zrealizować pomiar wypełnienia?
  • Helpful post
    Level 39  
    Brodowski wrote:
    ...Jednak w jaki sposób poprzez ten timer zrealizować pomiar wypełnienia?

    Połącz wejście T0 z wejściem przerwania zewnętrznego INTn i wykorzystaj to przerwanie oraz licznik T1 , do pomiaru wypełnienia.Wszystko zależy od tego , jak "szybki" przebieg masz zamiar mierzyć.

    Piotrek
  • Level 11  
    Chce mierzyć impulsy z zakresu 10kHz do 120kHz.Jednak nie bardzo mam pojęcie jak obsłużyć przerwania pod Bascomem dla mikrokontrolera AT89cxxxx...tzn jak w bascomie wykrywać zbocze narastające a później opadające?
  • Helpful post
    Level 39  
    Brodowski wrote:
    Chce mierzyć impulsy z zakresu 10kHz do 120kHz...

    89cx051 @24MHz + Basic = Ciężka(niemożliwa?) sprawa przy 120kHz.
    Może w asm dałoby radę , ale Basic :(
    Zmienił bym także koncepcję/sposób pomiaru , a mianowicie:
    Sygnał podaję na INT0 i odwrócony(zanegowany) na INT1 , włączam bramkowanie liczników T0 i T1 i niech zliczają cykle maszynowe.T0 liczy czas trwania stanu H , a T1 stanu L(po zanegowaniu będzie to stan wysoki na wejściu INT1.Zmiana stanu sygnału wejściowego zatrzymuje jeden z liczników , a uruchamia zliczanie drugiego.Wejście na którym nastąpiło zbocze opadające wyzwala przerwanie , w którym odczytuję stan licznika i go zeruję.Po sekwencji 2 przerwań na INT0 i INT1 , można wyliczyć wypełnienie na podstawie zliczonych cykli w obu licznikach , a po zsumowaniu cykli zliczonych na obu licznikach, można wyliczyć częstotliwość.
    Chyba się nie walnąłem w teorii ;)

    2 opcja , to zmienić proca ja jakiś "szybszy" .

    Piotrek
  • Helpful post
    Level 18  
    Częstotliwość jak masz zmierzoną, to z tego wyliczysz okres przebiegu T=1/f. Teraz zmierzysz czas trwania impulsu ujemnego Tl, a co za tym idzie odejmując go od T otrzymasz czas trwania wysokiego i teraz stosunek jednego do drugiego da Ci procent wypełnienia.
  • Level 11  
    Quote:
    Teraz zmierzysz czas trwania impulsu ujemnego Tl

    No właśnie jak zmierzyć czas trwania impulsu ujemnego tzn jak napisać program aby ragował na zbocze opadające.Jestem początkujący w pisaniu programów w Bascomie.I byłbym wdzięczny za pomoc.Później i tak będe kalibrował cały układ programowo podłaczając go pod wzorcowy generator.Jednak za nic nie wiem jak napisać program do pomiaru wypełnienia
  • Helpful post
    Level 18  
    Tutaj masz listing który będzie współpracował ze schematem który zamieściłeś.
    Kiedyś takie coś robiłem i do 100kHz chodziło na pewno. Dopasujesz to tylko do swoich potrzeb, ale na razie to załaduj i zobaczysz co będzie.
    I to wszystko na jednym liczniku się robi.
    Code:
    '********Pomiar czasu trwania impulsu ujemnego przebiegu prostokątnego i częstotliwości*********
    
    Dim T0ov As Word , Cnt0 As Word
    On Timer0 T0_int Nosave
    Enable Interrupts
    Enable Timer0
    Impuls Alias P3.4
    Counter0 = 0
    Dim Liczba As Long

    Cursor Off Noblink
    Cls
    '***********************************Pomiar czasu trwania impulsu ujemnego*********************
    Do
       Config Timer0 = Timer , Mode = 1 , Gate = Internal
       T0ov = 0
       Counter0 = 0
       While Impuls = 0 : Wend      'czekamy dopuki Impuls=0 żeby złapać cały impuls
       While Impuls = 1 : Wend      'czekamy dopuki Impuls=1
       Start Timer0                 'i jak zmieni się na 0 to puszczamy Timer0
       While Impuls = 0 : Wend      'czekamy dopuki Impuls=0
       Stop Timer0                  'i jak zmieni się na 1 zatrzymujemy Timer0
       Cnt0 = Counter0
       Home
       Liczba = T0ov * 65536        'tu sobie zliczamy ilość cykli maszynowych
       Liczba = Liczba + Cnt0       'i obliczamy jaki to czas upłynął

       If Liczba >= 10000 Then
       Liczba = Liczba / 1000       'dzieląc przez 1000 dostajemy czas w mS, a bez dzielenia w uS
       Lcd "Czas= " ; Liczba ; " mS" ; Spc(4)

       Else
       Lcd "Czas= " ; Liczba ; " uS" ; Spc(4)
       End If

    '**************************Pomiar częstotliwości**********************************************
       Config Timer0 = Counter , Mode = 1 , Gate = Internal
       Counter0 = 0
       Start Counter0
       Waitms 255 : Waitms 255 : Waitms 255 : Waitms 241       'ilość impulsów w czasie 1 sek
       Stop Counter0                'doświadczalnie wdl. generatora 1006ms)

       Cnt0 = Counter0
       Lowerline
       Lcd "Freq= " ; Cnt0 ; " Hz" ; Spc(4)
    Loop

    T0_int:
    Incr T0ov                       'ilość przepełnień T0
    Return



    A to wszystko nauczył mnie kol. zumek
  • Level 11  
    Wiem, że stary temat ogrzewam, ale akurat potrzebuję pomiar czasu trwania impulsu, a z programowania jestem początkujący. Mam pytanie, bo nie rozumiem skąd w kodzie bierze się liczba 65536 w linijce:
    Liczba = T0ov * 65536 'tu sobie zliczamy ilość cykli maszynowych

    Jak wyznaczyć ilość cykli maszynowych jeśli używam ATmegi8 z kwarcem 8MHz.
    Być może gdzieś na forum istnieje post na ten temat, ale niestety nie znalazłem.
    Jeśli mógłbym prosić o wyjaśnienie to byłbym wdzięczny.
    Pozdrawiam
pcbway logo